svn commit: r195294 - in head/sys: fs/cd9660 kern nfsclient ufs/ffs
Konstantin Belousov
kib at FreeBSD.org
Thu Jul 2 18:02:57 UTC 2009
Author: kib
Date: Thu Jul 2 18:02:55 2009
New Revision: 195294
URL: http://svn.freebsd.org/changeset/base/195294
Log:
In vn_vget_ino() and their inline equivalents, mnt_ref() the mount point
around the sequence that drop vnode lock and then busies the mount point.
Not having vlocked node or direct reference to the mp allows for the
forced unmount to proceed, making mp unmounted or reused.
Tested by: pho
Reviewed by: jeff
Approved by: re (kensmith)
MFC after: 2 weeks
Modified:
head/sys/fs/cd9660/cd9660_lookup.c
head/sys/kern/vfs_vnops.c
head/sys/nfsclient/nfs_vnops.c
head/sys/ufs/ffs/ffs_softdep.c
Modified: head/sys/fs/cd9660/cd9660_lookup.c
==============================================================================
--- head/sys/fs/cd9660/cd9660_lookup.c Thu Jul 2 16:41:46 2009 (r195293)
+++ head/sys/fs/cd9660/cd9660_lookup.c Thu Jul 2 18:02:55 2009 (r195294)
@@ -376,9 +376,11 @@ found:
ltype = VOP_ISLOCKED(pdp);
error = vfs_busy(mp, MBF_NOWAIT);
if (error != 0) {
+ vfs_ref(mp);
VOP_UNLOCK(pdp, 0);
error = vfs_busy(mp, 0);
vn_lock(pdp, ltype | LK_RETRY);
+ vfs_rel(mp);
if (error)
return (ENOENT);
if (pdp->v_iflag & VI_DOOMED) {
Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c Thu Jul 2 16:41:46 2009 (r195293)
+++ head/sys/kern/vfs_vnops.c Thu Jul 2 18:02:55 2009 (r195294)
@@ -1307,9 +1307,11 @@ vn_vget_ino(struct vnode *vp, ino_t ino,
("vn_vget_ino: vp not locked"));
error = vfs_busy(mp, MBF_NOWAIT);
if (error != 0) {
+ vfs_ref(mp);
VOP_UNLOCK(vp, 0);
error = vfs_busy(mp, 0);
vn_lock(vp, ltype | LK_RETRY);
+ vfs_rel(mp);
if (error != 0)
return (ENOENT);
if (vp->v_iflag & VI_DOOMED) {
Modified: head/sys/nfsclient/nfs_vnops.c
==============================================================================
--- head/sys/nfsclient/nfs_vnops.c Thu Jul 2 16:41:46 2009 (r195293)
+++ head/sys/nfsclient/nfs_vnops.c Thu Jul 2 18:02:55 2009 (r195294)
@@ -1043,9 +1043,11 @@ nfs_lookup(struct vop_lookup_args *ap)
ltype = VOP_ISLOCKED(dvp);
error = vfs_busy(mp, MBF_NOWAIT);
if (error != 0) {
+ vfs_ref(mp);
VOP_UNLOCK(dvp, 0);
error = vfs_busy(mp, 0);
vn_lock(dvp, ltype | LK_RETRY);
+ vfs_rel(mp);
if (error == 0 && (dvp->v_iflag & VI_DOOMED)) {
vfs_unbusy(mp);
error = ENOENT;
Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c Thu Jul 2 16:41:46 2009 (r195293)
+++ head/sys/ufs/ffs/ffs_softdep.c Thu Jul 2 18:02:55 2009 (r195294)
@@ -5104,9 +5104,11 @@ softdep_fsync(vp)
FFSV_FORCEINSMQ)) {
error = vfs_busy(mp, MBF_NOWAIT);
if (error != 0) {
+ vfs_ref(mp);
VOP_UNLOCK(vp, 0);
error = vfs_busy(mp, 0);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vfs_rel(mp);
if (error != 0)
return (ENOENT);
if (vp->v_iflag & VI_DOOMED) {
More information about the svn-src-head
mailing list