svn commit: r280840 - head/release/tools
Colin Percival
cperciva at FreeBSD.org
Mon Mar 30 08:33:20 UTC 2015
Author: cperciva
Date: Mon Mar 30 08:33:19 2015
New Revision: 280840
URL: https://svnweb.freebsd.org/changeset/base/280840
Log:
Clean up filesystem unmounting in vmimage builds:
* Remove vm_umount_base function which is currently unused.
* Add umount_loop function which loops attempting to unmount one filesystem.
* Replace calls to umount with calls to umount_loop.
* Don't attempt to unmount ${DESTDIR}/dev if it isn't mounted.
The looping is necessary because sometimes umount fails due to filesystems
being busy. The most common cause of such busyness is periodic(8) jobs
running `find / ...`.
Reviewed by: gjb
Modified:
head/release/tools/vmimage.subr
Modified: head/release/tools/vmimage.subr
==============================================================================
--- head/release/tools/vmimage.subr Mon Mar 30 07:11:49 2015 (r280839)
+++ head/release/tools/vmimage.subr Mon Mar 30 08:33:19 2015 (r280840)
@@ -45,8 +45,10 @@ err() {
}
cleanup() {
- umount ${DESTDIR}/dev 2>/dev/null
- umount ${DESTDIR}
+ if mount | grep -qE "devfs on ${DESTDIR}/dev"; then
+ umount_loop ${DESTDIR}/dev 2>/dev/null
+ fi
+ umount_loop ${DESTDIR}
if [ ! -z "${mddev}" ]; then
mdconfig -d -u ${mddev}
fi
@@ -86,11 +88,11 @@ vm_copy_base() {
tar -cf- -C ${DESTDIR}/old . | tar -xf- -C ${DESTDIR}/new
- umount /dev/${mdold}
+ umount_loop /dev/${mdold}
rmdir ${DESTDIR}/old
mdconfig -d -u ${mdold}
- umount /dev/${mdnew}
+ umount_loop /dev/${mdnew}
rmdir ${DESTDIR}/new
mdconfig -d -u ${mdnew}
mv ${VMBASE}.tmp ${VMBASE}
@@ -117,7 +119,7 @@ vm_install_base() {
mount -t devfs devfs ${DESTDIR}/dev
chroot ${DESTDIR} /usr/bin/newaliases
chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart
- umount ${DESTDIR}/dev
+ umount_loop ${DESTDIR}/dev
cp /etc/resolv.conf ${DESTDIR}/etc/resolv.conf
@@ -152,7 +154,7 @@ vm_extra_install_packages() {
/usr/sbin/pkg bootstrap -y
chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \
/usr/sbin/pkg install -y ${VM_EXTRA_PACKAGES}
- umount ${DESTDIR}/dev
+ umount_loop ${DESTDIR}/dev
return 0
}
@@ -181,16 +183,17 @@ vm_extra_pkg_rmcache() {
return 0
}
-vm_umount_base() {
+umount_loop() {
+ DIR=$1
i=0
sync
- while ! umount ${DESTDIR}/dev ${DESTDIR}; do
+ while ! umount ${DIR}; do
i=$(( $i + 1 ))
if [ $i -ge 10 ]; then
# This should never happen. But, it has happened.
- msg="Cannot umount(8) ${DESTDIR}\n"
- msg="${msg}Something has gone horribly wrong."
- err "${msg}"
+ echo "Cannot umount(8) ${DIR}"
+ echo "Something has gone horribly wrong."
+ return 1
fi
sleep 1
done
More information about the svn-src-all
mailing list