summaryrefslogtreecommitdiff
path: root/src/initrd/samizdat-cdrom-copy
diff options
context:
space:
mode:
Diffstat (limited to 'src/initrd/samizdat-cdrom-copy')
-rwxr-xr-xsrc/initrd/samizdat-cdrom-copy75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/initrd/samizdat-cdrom-copy b/src/initrd/samizdat-cdrom-copy
new file mode 100755
index 0000000..d4920b9
--- /dev/null
+++ b/src/initrd/samizdat-cdrom-copy
@@ -0,0 +1,75 @@
1#!/bin/sh
2md_name=$1
3lv_name=$2
4lv_dev=$3
5cdrom_loopdev=$4
6cdrom_dev=$5
7
8. lvm-create.sh
9
10mdadm_wait_remove()
11{
12 # We should perhaps use mdadm --monitor's RebuildFinished event.
13
14 local dev="$1" disk="$2" tries
15 if ! mdadm --wait "$dev"; then
16 tries=1000
17 while ! mdadm --detail --test "$dev"; do
18 [ $tries -gt 0 ] || return 1
19 sleep 1
20 tries=$((tries-1))
21 done
22 fi
23
24 mdadm "$dev" --fail "$disk" || return 1
25 tries=100
26 while ! mdadm "$dev" --remove "$disk"; do
27 [ $tries -gt 0 ] || return 1
28 sleep 1
29 tries=$((tries-1))
30 done
31 return 0
32}
33
34
35Done()
36{
37 mdadm --grow "$md_name" -n 1 --force
38 lvm lvrename "$lv_name".tmp "${lv_name#*/}"
39 losetup -d "$cdrom_loopdev"
40 [ -e /etc/mtab ] || ln -sf /proc/mounts /etc/mtab
41 eject "$cdrom_dev"
42 echo "[$$] Done."
43}
44
45exec >>/var/log/samizdat-cdrom-copy.log 2>&1
46echo "[$$] Waiting for $cdrom_loopdev ($cdrom_dev) to be removed from $md_name."
47
48if mdadm_wait_remove "$md_name" "$cdrom_loopdev"; then
49 Done;
50else
51 echo "[$$] Warning: mdadm_wait_remove() returned $?. Doing manual copy with sg_dd (using continue-on-error)."
52 mdadm -D "$md_name"
53 mdadm "$md_name" --fail "$lv_dev".tmp
54 mdadm -D "$md_name"
55 mdadm "$md_name" --remove "$lv_dev".tmp
56 mdadm -D "$md_name"
57 mdadm /dev/md55 --grow -n1 --force
58 mdadm -D "$md_name"
59
60 sizelimit=$(get_cdrom_sizelimit "$cdrom_dev")
61
62 if sg_dd bs=2048 ${sizelimit:+count=$((sizelimit/2048))} iflag=coe,coe,coe if="$cdrom_dev" of="$lv_dev".tmp retries=42; then
63 echo "[$$] sg_dd succeeded."
64 mdadm "$md_name" --grow -n 2 --assume-clean --add "$lv_dev".tmp
65 mdadm -D "$md_name"
66 if mdadm_wait_remove "$md_name" "$cdrom_loopdev"; then
67 Done;
68 else
69 echo "[$$] Error: mdadm_wait_remove() returned $? after sg_dd. Cannot eject CDROM!"
70 fi
71 else
72 echo "[$$] Error: sg_dd returned $?. Cannot eject CDROM!"
73 fi
74fi
75