}
# }}}
+# unmount mountpoint {{{
+try_umount() {
+ local tries=$1
+ local mountpoint="$2"
+
+ if ! mountpoint "$mountpoint" &>/dev/null ; then
+ return 0
+ fi
+
+ for (( try=1; try<=tries; try++ )); do
+ if [[ ${try} -eq ${tries} ]]; then
+ # Last time, show errors this time
+ umount "${mountpoint}" && return 0
+ else
+ # Not last time, hide errors until fatal
+ if umount "${mountpoint}" 2>/dev/null ; then
+ return 0
+ else
+ sleep 1
+ fi
+ fi
+ done
+ return 1 # Tried enough
+}
+# }}}
+
# helper functions {{{
cleanup() {
if [ -n "$CHROOT_VARIABLES" ] ; then
# if we deploy to /dev/sdX# then let's see if /dev/sdX exists
local main_device="${TARGET%%[0-9]*}"
# sanity check to not try to e.g. access /dev/loop if we get /dev/loop0
- if [ -f "/sys/block/$(basename "${main_device}")/$(basename "${TARGET}")/dev" ] ; then
- blockdev --rereadpt "$main_device"
- else
+ if ! [ -f "/sys/block/$(basename "${main_device}")/$(basename "${TARGET}")/dev" ] ; then
einfo "No underlying block device for $TARGET identified, skipping blockdev --rereadpt."
+ else
+ udevadm settle
+ # ensure we give blockdev up to 30 seconds/retries
+ local timeout=30
+ local success=0
+ while [ "$timeout" -gt 0 ] ; do
+ ((timeout--))
+ if blockdev --rereadpt "${main_device}" ; then
+ success=1
+ break
+ else
+ ewarn "Failed to reread partition table of ${main_device} [${timeout} retries left]"
+ sleep 1
+ fi
+ done
+
+ if [ "${success}" = "0" ] ; then
+ eerror "Error: failed to reread partition table, giving up."
+ bailout 1
+ fi
fi
fi
# give the system 2 seconds, otherwise we might run into
}
# }}}
-# unmount mountpoint {{{
-try_umount() {
- local tries=$1
- local mountpoint="$2"
-
- if ! mountpoint "$mountpoint" &>/dev/null ; then
- return 0
- fi
-
- for (( try=1; try<=tries; try++ )); do
- if [[ ${try} -eq ${tries} ]]; then
- # Last time, show errors this time
- umount "${mountpoint}" && return 0
- else
- # Not last time, hide errors until fatal
- if umount "${mountpoint}" 2>/dev/null ; then
- return 0
- else
- sleep 1
- fi
- fi
- done
- return 1 # Tried enough
-}
-# }}}
-
# execute chroot-script {{{
chrootscript() {
if ! [ -r "$MNTPOINT/bin/chroot-script" ] ; then