Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
tmpdir-setup: Avoid flush of TMPDIR
Use a dm-device (linear target) between the filesystem and the loop
device and then use this sequence for teardown:

- fcntl EXT4_IOC_SHUTDOWN with EXT4_GOING_FLAGS_NOLOGFLUSH
- dmestup reload $dmname --table "0 $sectors zero"
- dmsetup resume $dmname --noflush
- umount $mountpoint
- dmsetup remove --deferred $dmname
- rmdir $mountpoint
  • Loading branch information
donald committed Oct 12, 2022
1 parent 4285d95 commit bda03f8
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions helper/tmpdir-setup
Expand Up @@ -20,6 +20,8 @@ cmd_create() {

filename=$tmpdir/$MXQ_JOBID.tmp
mountpoint=$mntdir/$MXQ_JOBID
dmname=mxq.$MXQ_JOBID
dmdevice=/dev/mapper/$dmname

umask 006
mkdir -p $tmpdir
Expand All @@ -29,15 +31,19 @@ cmd_create() {

if fallocate -l ${MXQ_SIZE}G $filename; then
if loopdevice=$(losetup --find --show $filename); then
if mkfs.ext4 \
-q \
-m 0 \
-E nodiscard,mmp_update_interval=300,lazy_journal_init=1,root_owner=$MXQ_UID:0 \
-O '64bit,ext_attr,filetype,^has_journal,huge_file,inline_data,^mmp,^quota,sparse_super2' \
$loopdevice \
&& mkdir -p $mountpoint && mount -Odata=writeback,barrier=0 $loopdevice $mountpoint; then
rmdir $mountpoint/lost+found
status=0
if dmsetup create $dmname --table "0 $((MXQ_SIZE*1024*1024*2)) linear $loopdevice 0"; then
if mkfs.ext4 \
-q \
-m 0 \
-E nodiscard,mmp_update_interval=300,lazy_journal_init=1,root_owner=$MXQ_UID:0 \
-O '64bit,ext_attr,filetype,^has_journal,huge_file,inline_data,^mmp,^quota,sparse_super2' \
$dmdevice \
&& mkdir -p $mountpoint && mount -Odata=writeback,barrier=0 $dmdevice $mountpoint; then
rmdir $mountpoint/lost+found
status=0
else
dmsetup remove --force --deferred $dmname
fi
fi
losetup -d $loopdevice
fi
Expand All @@ -52,12 +58,24 @@ cmd_cleanup() {
(( $# == 1 )) || usage
MXQ_JOBID=$1

(
shopt -s dotglob;
rm -rf /dev/shm/mxqd/mnt/job/$MXQ_JOBID/*
umount /dev/shm/mxqd/mnt/job/$MXQ_JOBID
rmdir /dev/shm/mxqd/mnt/job/$MXQ_JOBID
) &
mountpoint=$mntdir/$MXQ_JOBID
dmname=mxq.$MXQ_JOBID
dmdevice=/dev/mapper/$dmname
minor=$(( 0x$(stat -c%T $dmdevice) ))
sectors=$(cat /sys/block/dm-$minor/size)

# fs/ext4/ext4.h: #define EXT4_IOC_SHUTDOWN _IOR ('X', 125, __u32)
# (_IOC_READ << 30) + (sizeof(_u32) << 16) + ( 'X' << 8 ) + 125
# ( 2 << 30 ) + ( 4 << 16 ) + ( 88 << 8 ) + 125 = 2147768445
# fs/ext4/ext4.h: #define EXT4_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */

/usr/local/system/perl/bin/perl -e "open F, '<', '$mountpoint/.' ; \$d=pack('L', 2) ; ioctl (F, 2147768445, \$d)"

dmsetup reload $dmname --table "0 $sectors zero"
dmsetup resume $dmname --noflush
umount --lazy $mountpoint
dmsetup remove $dmname
rmdir $mountpoint
}

(( $# > 0 )) || usage
Expand Down

0 comments on commit bda03f8

Please sign in to comment.