Skip to content
Permalink
9b4306677e
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
executable file 104 lines (90 sloc) 2.93 KB
#! /usr/bin/bash
usage() {
cat <<EOF >&2
usage:
$0 create JOBID SIZE UID # create SIZE GiB /dev/shm/mxqd/mnt/job/$JOBID
$0 cleanup JOBID # cleanup
EOF
exit 1
}
tmpdir=/scratch/local2/mxqd/tmp
mntdir=/dev/shm/mxqd/mnt/job
cmd_create() {
(( $# == 3 )) || usage
MXQ_JOBID=$1
MXQ_SIZE=$2
MXQ_UID=$3
filename=$tmpdir/$MXQ_JOBID.tmp
mountpoint=$mntdir/$MXQ_JOBID
dmname=mxq.$MXQ_JOBID
dmdevice=/dev/mapper/$dmname
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 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
rm $filename
else
test -e $filename && rm $filename
fi
exit $status
}
cmd_cleanup() {
(( $# == 1 )) || usage
MXQ_JOBID=$1
# 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
cmd="$1"
shift;
case "$cmd" in
create)
cmd_create "$@"
;;
cleanup)
cmd_cleanup "$@"
;;
*)
usage
;;
esac