diff --git a/Makefile b/Makefile index 4894831c..33d9586d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ MXQ_VERSION_MAJOR = 0 MXQ_VERSION_MINOR = 30 -MXQ_VERSION_PATCH = 7 +MXQ_VERSION_PATCH = 8 MXQ_VERSION_EXTRA = "beta" MXQ_VERSIONDATE = 2022 diff --git a/helper/create_job_tmpdir b/helper/create_job_tmpdir deleted file mode 100755 index 01207427..00000000 --- a/helper/create_job_tmpdir +++ /dev/null @@ -1,42 +0,0 @@ -#! /usr/bin/bash - -# Input (environment): -# -# MXQ_JOBID : job ident -# MXQ_SIZE : size in GB -# MXQ_UID : uid - -# Output: -# -# /dev/shm/mxqd/tmp/$JOBID mounted, space from /scratch/local2 - -tmpdir=/scratch/local2/mxqd/tmp -mntdir=/dev/shm/mxqd/mnt/job -filename=$tmpdir/$MXQ_JOBID.tmp -mountpoint=$mntdir/$MXQ_JOBID - -umask 006 -mkdir -p $tmpdir -mkdir -p $mntdir - -status=1; - -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 - fi - losetup -d $loopdevice - fi - rm $filename -else - test -e $filename && rm $filename -fi -exit $status diff --git a/helper/tmpdir-setup b/helper/tmpdir-setup index fe47dc79..384d9bec 100755 --- a/helper/tmpdir-setup +++ b/helper/tmpdir-setup @@ -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 @@ -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 @@ -52,12 +58,34 @@ cmd_cleanup() { (( $# == 1 )) || usage MXQ_JOBID=$1 - ( - shopt -s dotglob; + # Support rolling upgrade: Use old code if loop device is directly mounted without a dm device in between. + # + if [[ $(findmnt --output SOURCE --noheadings /dev/shm/mxqd/mnt/job/$MXQ_JOBID) =~ ^/dev/loop ]]; then + 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 - ) & + exit + fi + + 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