aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTai-hwa Liang <avatar@FreeBSD.org>2015-10-07 09:39:45 +0000
committerTai-hwa Liang <avatar@FreeBSD.org>2015-10-07 09:39:45 +0000
commit890be803e76fef06e1b8bd718d175734336a8038 (patch)
tree9f4fa6bd1722e10b5dd62dca4dd537d9afe0bf9d
parent5b71bfa7ef62922647a12caf0f5be11c11653fc9 (diff)
MFC r238980:
Just like the other file systems found in /sys/fs, g_vfs_open() should be paried with g_vfs_close(). Though g_vfs_close() is a wrapper around g_wither_geom_close(), r206130 added the following test in g_vfs_open(): if (bo->bo_private != vp) return (EBUSY); Which will cause a 'Device busy' error inside reiserfs_mountfs() if the same file system is re-mounted again after umount or mounting failure: (case 1, /dev/ad4s3 is not a valid REISERFS partition) # mount -t reiserfs -o ro /dev/ad4s3 /mnt mount: /dev/ad4s3: Invalid argument # mount -t msdosfs -o ro /dev/ad4s3 /mnt mount: /dev/ad4s3: Device busy (case 2, /dev/ad4s3 is a valid REISERFS partition) # mount -t reiserfs -o ro /dev/ad4s3 /mnt # umount /mnt # mount -t reiserfs -o ro /dev/ad4s3 /mnt mount: /dev/ad4s3: Device busy On the other hand, g_vfs_close() 'fixed' the above cases by doing an extra step to keep 'sc->sc_bo->bo_private' and 'cp->private' pointers synchronised. Reviewed by: kib
Notes
Notes: svn path=/stable/8/; revision=288987
-rw-r--r--sys/gnu/fs/reiserfs/reiserfs_vfsops.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/gnu/fs/reiserfs/reiserfs_vfsops.c b/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
index 31b653f83cb7..95d046dae935 100644
--- a/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
+++ b/sys/gnu/fs/reiserfs/reiserfs_vfsops.c
@@ -227,7 +227,7 @@ reiserfs_unmount(struct mount *mp, int mntflags)
DROP_GIANT();
g_topology_lock();
- g_wither_geom_close(rmp->rm_cp->geom, ENXIO);
+ g_vfs_close(rmp->rm_cp);
g_topology_unlock();
PICKUP_GIANT();
vrele(rmp->rm_devvp);
@@ -638,7 +638,7 @@ out:
if (cp != NULL) {
DROP_GIANT();
g_topology_lock();
- g_wither_geom_close(cp->geom, ENXIO);
+ g_vfs_close(cp);
g_topology_unlock();
PICKUP_GIANT();
}