From e4532fdfa44e02fc36f1757a2754769a64c6587f Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Fri, 29 Apr 2016 02:05:18 -0400 Subject: samizdat-eject will wait for btrfs before final copy --- samizdat-eject.sh | 87 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 33 deletions(-) diff --git a/samizdat-eject.sh b/samizdat-eject.sh index bfd8e1c..d95a49d 100755 --- a/samizdat-eject.sh +++ b/samizdat-eject.sh @@ -5,6 +5,48 @@ die() exit 1 } +btrfs_subdevices() +{ + local mountpoint="$1" + btrfs filesystem show "$mountpoint" | sed -ne 's/^[ \t]*devid.* path //p' +} + +btrfs_subdevice_count() +{ + btrfs_subdevices "$1" | wc -l +} + +remove() +{ + for dev; do + (set -x; btrfs device remove "$dev" /) + dmsetup remove "$dev" 2>/dev/null + losetup -D + done +} + +dm_name() +{ + dmsetup info "$1" | sed -ne 's/^Name: *//p' +} + +md_ready() +{ + local mountpoint="$1" count dev + count=$(mdadm_subdevices /dev/md55|wc -l) + [ "$count" = 1 ] || return + dev=$(mdadm_subdevices /dev/md55) + [ "$(dm_name "$dev")" = samizdatiso ] +} + +copy() +{ + temp_target=$(mktemp --tmpdir=/outerfs) + mdadm_copy_eject_crypt /dev/md55 "$temp_target" +} + +. mdadm-dup.sh || exit 1 + target=$1 if [ ! "$target" ] && mountpoint -q /srv && [ ! -e /srv/samizdat.iso ]; then @@ -14,20 +56,10 @@ fi [ "$target" ] || die "Usage: $0 " [ ! -e "$target" ] || die "Error: file exists: $target" -if mountpoint -q /outerfs; then - temp_target=$(mktemp --tmpdir=/outerfs) -else +if ! mountpoint -q /outerfs; then die "Error: /outerfs is not a mountpoint. Please mount a safe filesystem to temporarily store the ISO on /outerfs" fi -. mdadm-dup.sh || exit 1 - -btrfs_subdevices() -{ - local mountpoint="$1" - btrfs filesystem show "$mountpoint" | sed -ne 's/^[ \t]*devid.* path //p' -} - devices=$(btrfs_subdevices /) || exit 1 set -- @@ -41,31 +73,20 @@ for dev in $devices; do done [ "$seen" ] || set -- # avoid messing up someone's btrfs! -copy() -{ - mdadm_copy_eject_crypt /dev/md55 "$temp_target" && - mdadm_copy_eject /dev/md55 "$target".part && - mv "$target".part "$target" -} -remove() -{ - for dev; do - (set -x; btrfs device remove "$dev" /) - dmsetup remove "$dev" 2>/dev/null - losetup -D - done -} -# Doing the mdadm copy before removing the devices means our filesystem includes -# devices that are ultimately backed by files ON THE SAME FILESYSTEM. As such, it -# might conceivably put btrfs into a deadlock of some kind. -# If it turns out this doesn't work, the order can be reversed. This will -# perform the read IO twice, though, almost doubling the total installation -# time. -copy & remove "$@" -set -x +if ! md_ready; then + copy & +fi + +remove "$@" + wait + +if [ "$(btrfs_subdevice_count /)" = 1 ] && md_ready; then + mdadm_copy_eject /dev/md55 "$target".part && + mv "$target".part "$target" +fi -- cgit v1.2.3