aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_mount.c
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2007-12-27 16:38:28 +0000
committerWarner Losh <imp@FreeBSD.org>2007-12-27 16:38:28 +0000
commitb27aa20e8ddd6d8fdaf42185082108691990c1d4 (patch)
tree078dcdccc88086fba3a9c673511df9d39c609f7e /sys/kern/vfs_mount.c
parent2c50272da5d198f4027b28f359cac2516f2e83aa (diff)
downloadsrc-b27aa20e8ddd6d8fdaf42185082108691990c1d4.tar.gz
src-b27aa20e8ddd6d8fdaf42185082108691990c1d4.zip
A partial solution to some of the 'pull the umass device with a
mounted FS' problems. These are more along the lines of 'avoiding an avoidable panic' than a complete solution to removable devices. We now close the barn door after the horse has gotten lose and has been hit by a truck, as it were. The barn no longer catches fire in this case, but the horse is still dead :-). The vfs_bio.c fix causes us not to put a failed write back into the dirty pool if the error returned was ENXIO. In that case, the buffer is treated like any other clean buffer that's being retured. ENXIO means the device isn't there anymore and will never be there again in the future, so retrying is futile. The vfs_mount.c fix treats 'ENXIO' as success for unmounting a file system. If the device is gone, retrying later won't help and we'll never be able to unmount the device. These two are part of a larger patch set submitted by the author. The other patches will be forth coming. I added comments to these two patches. Submitted by: Henrik Gulbrandsen Reviewed by: phk@ PR: usb/46176 (partial)
Notes
Notes: svn path=/head/; revision=174937
Diffstat (limited to 'sys/kern/vfs_mount.c')
-rw-r--r--sys/kern/vfs_mount.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index dfb46e29c8a9..6a615b1e795c 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -1286,8 +1286,13 @@ dounmount(mp, flags, td)
error = VFS_UNMOUNT(mp, flags, td);
}
vn_finished_write(mp);
- if (error) {
- /* Undo cdir/rdir and rootvnode changes made above. */
+ /*
+ * If we failed to flush the dirty blocks for this mount point,
+ * undo all the cdir/rdir and rootvnode changes we made above.
+ * Unless we failed to do so because the device is reporting that
+ * it doesn't exist anymore.
+ */
+ if (error && error != ENXIO) {
if ((flags & MNT_FORCE) &&
VFS_ROOT(mp, LK_EXCLUSIVE, &fsrootvp, td) == 0) {
if (mp->mnt_vnodecovered != NULL)