summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2016-04-29 02:05:18 -0400
committerAndrew Cady <d@jerkface.net>2016-04-29 02:05:18 -0400
commite4532fdfa44e02fc36f1757a2754769a64c6587f (patch)
tree193d0dc76e60a283842fd9255931c10541544578
parent568e0f46d544d8c824e43611983fadd485ccdada (diff)
samizdat-eject will wait for btrfs before final copy
-rwxr-xr-xsamizdat-eject.sh87
1 files 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()
5 exit 1 5 exit 1
6} 6}
7 7
8btrfs_subdevices()
9{
10 local mountpoint="$1"
11 btrfs filesystem show "$mountpoint" | sed -ne 's/^[ \t]*devid.* path //p'
12}
13
14btrfs_subdevice_count()
15{
16 btrfs_subdevices "$1" | wc -l
17}
18
19remove()
20{
21 for dev; do
22 (set -x; btrfs device remove "$dev" /)
23 dmsetup remove "$dev" 2>/dev/null
24 losetup -D
25 done
26}
27
28dm_name()
29{
30 dmsetup info "$1" | sed -ne 's/^Name: *//p'
31}
32
33md_ready()
34{
35 local mountpoint="$1" count dev
36 count=$(mdadm_subdevices /dev/md55|wc -l)
37 [ "$count" = 1 ] || return
38 dev=$(mdadm_subdevices /dev/md55)
39 [ "$(dm_name "$dev")" = samizdatiso ]
40}
41
42copy()
43{
44 temp_target=$(mktemp --tmpdir=/outerfs)
45 mdadm_copy_eject_crypt /dev/md55 "$temp_target"
46}
47
48. mdadm-dup.sh || exit 1
49
8target=$1 50target=$1
9 51
10if [ ! "$target" ] && mountpoint -q /srv && [ ! -e /srv/samizdat.iso ]; then 52if [ ! "$target" ] && mountpoint -q /srv && [ ! -e /srv/samizdat.iso ]; then
@@ -14,20 +56,10 @@ fi
14[ "$target" ] || die "Usage: $0 <target filename>" 56[ "$target" ] || die "Usage: $0 <target filename>"
15[ ! -e "$target" ] || die "Error: file exists: $target" 57[ ! -e "$target" ] || die "Error: file exists: $target"
16 58
17if mountpoint -q /outerfs; then 59if ! mountpoint -q /outerfs; then
18 temp_target=$(mktemp --tmpdir=/outerfs)
19else
20 die "Error: /outerfs is not a mountpoint. Please mount a safe filesystem to temporarily store the ISO on /outerfs" 60 die "Error: /outerfs is not a mountpoint. Please mount a safe filesystem to temporarily store the ISO on /outerfs"
21fi 61fi
22 62
23. mdadm-dup.sh || exit 1
24
25btrfs_subdevices()
26{
27 local mountpoint="$1"
28 btrfs filesystem show "$mountpoint" | sed -ne 's/^[ \t]*devid.* path //p'
29}
30
31devices=$(btrfs_subdevices /) || exit 1 63devices=$(btrfs_subdevices /) || exit 1
32 64
33set -- 65set --
@@ -41,31 +73,20 @@ for dev in $devices; do
41done 73done
42[ "$seen" ] || set -- # avoid messing up someone's btrfs! 74[ "$seen" ] || set -- # avoid messing up someone's btrfs!
43 75
44copy()
45{
46 mdadm_copy_eject_crypt /dev/md55 "$temp_target" &&
47 mdadm_copy_eject /dev/md55 "$target".part &&
48 mv "$target".part "$target"
49}
50 76
51remove()
52{
53 for dev; do
54 (set -x; btrfs device remove "$dev" /)
55 dmsetup remove "$dev" 2>/dev/null
56 losetup -D
57 done
58}
59 77
60# Doing the mdadm copy before removing the devices means our filesystem includes
61# devices that are ultimately backed by files ON THE SAME FILESYSTEM. As such, it
62# might conceivably put btrfs into a deadlock of some kind.
63 78
64# If it turns out this doesn't work, the order can be reversed. This will
65# perform the read IO twice, though, almost doubling the total installation
66# time.
67 79
68copy & remove "$@"
69 80
70set -x 81if ! md_ready; then
82 copy &
83fi
84
85remove "$@"
86
71wait 87wait
88
89if [ "$(btrfs_subdevice_count /)" = 1 ] && md_ready; then
90 mdadm_copy_eject /dev/md55 "$target".part &&
91 mv "$target".part "$target"
92fi