summaryrefslogtreecommitdiff
path: root/src/initrd/samizdat-cdrom-copy
blob: d4920b9bf5a5e9734cf4ee6c51d4f04b71a9c8d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/sh
md_name=$1
lv_name=$2
lv_dev=$3
cdrom_loopdev=$4
cdrom_dev=$5

. lvm-create.sh

mdadm_wait_remove()
{
  # We should perhaps use mdadm --monitor's RebuildFinished event.

  local dev="$1" disk="$2" tries
  if ! mdadm --wait "$dev"; then
    tries=1000
    while ! mdadm --detail --test "$dev"; do
      [ $tries -gt 0 ] || return 1
      sleep 1
      tries=$((tries-1))
    done
  fi

  mdadm "$dev" --fail "$disk" || return 1
  tries=100
  while ! mdadm "$dev" --remove "$disk"; do
    [ $tries -gt 0 ] || return 1
    sleep 1
    tries=$((tries-1))
  done
  return 0
}


Done()
{
  mdadm --grow "$md_name" -n 1 --force
  lvm lvrename "$lv_name".tmp "${lv_name#*/}"
  losetup -d "$cdrom_loopdev"
  [ -e /etc/mtab ] || ln -sf /proc/mounts /etc/mtab
  eject "$cdrom_dev"
  echo "[$$] Done."
}

exec >>/var/log/samizdat-cdrom-copy.log 2>&1
echo "[$$] Waiting for $cdrom_loopdev ($cdrom_dev) to be removed from $md_name."

if mdadm_wait_remove "$md_name" "$cdrom_loopdev"; then
  Done;
else
  echo "[$$] Warning: mdadm_wait_remove() returned $?.  Doing manual copy with sg_dd (using continue-on-error)."
  mdadm -D "$md_name"
  mdadm "$md_name" --fail "$lv_dev".tmp
  mdadm -D "$md_name"
  mdadm "$md_name" --remove "$lv_dev".tmp
  mdadm -D "$md_name"
  mdadm  /dev/md55 --grow -n1 --force
  mdadm -D "$md_name"

  sizelimit=$(get_cdrom_sizelimit "$cdrom_dev")

  if sg_dd bs=2048 ${sizelimit:+count=$((sizelimit/2048))} iflag=coe,coe,coe if="$cdrom_dev" of="$lv_dev".tmp retries=42; then
    echo "[$$] sg_dd succeeded."
    mdadm "$md_name" --grow -n 2 --assume-clean --add "$lv_dev".tmp
    mdadm -D "$md_name"
    if mdadm_wait_remove "$md_name" "$cdrom_loopdev"; then
      Done;
    else
      echo "[$$] Error: mdadm_wait_remove() returned $? after sg_dd.  Cannot eject CDROM!"
    fi
  else
    echo "[$$] Error: sg_dd returned $?.  Cannot eject CDROM!"
  fi
fi