Skip to content

Commit

Permalink
helper/tmpdir-setup: Use device mapper to shortcut unmount writeback
Browse files Browse the repository at this point in the history
This is very EXPERIMENTAL.

This change fixes the problem of unnecessary writeback when we unmount the
TMODIR image which sometimes take a long time (minutes!) and wastes i/O
bandwidth.

We sometimes trigger

[2966308.931208] EXT4-fs (dm-1): ext4_writepages: jbd2_start: 4096 pages, ino 11; err -5

with this. It is yet unclear, id this is a problem or not.
  • Loading branch information
donald committed Apr 21, 2022
1 parent 7089292 commit 6189da3
Showing 1 changed file with 29 additions and 10 deletions.
39 changes: 29 additions & 10 deletions helper/tmpdir-setup
Original file line number Diff line number Diff line change
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 @@ -53,8 +59,21 @@ cmd_cleanup() {
MXQ_JOBID=$1

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)

umount $mountpoint
# 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
rmdir $mountpoint
}

Expand Down

0 comments on commit 6189da3

Please sign in to comment.