svn commit: r250852 - head/sys/fs/nullfs
Konstantin Belousov
kib at FreeBSD.org
Tue May 21 11:31:57 UTC 2013
Author: kib
Date: Tue May 21 11:31:56 2013
New Revision: 250852
URL: http://svnweb.freebsd.org/changeset/base/250852
Log:
Do not leak the NULLV_NOUNLOCK flag from the nullfs_unlink_lowervp(),
for the case when the nullfs vnode is not reclaimed. Otherwise, later
reclamation would not unlock the lower vnode.
Reported by: antoine
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Modified:
head/sys/fs/nullfs/null_vfsops.c
Modified: head/sys/fs/nullfs/null_vfsops.c
==============================================================================
--- head/sys/fs/nullfs/null_vfsops.c Tue May 21 11:24:32 2013 (r250851)
+++ head/sys/fs/nullfs/null_vfsops.c Tue May 21 11:31:56 2013 (r250852)
@@ -409,16 +409,28 @@ nullfs_unlink_lowervp(struct mount *mp,
vhold(vp);
vunref(vp);
- /*
- * If vunref() dropped the last use reference on the nullfs
- * vnode, it must be reclaimed, and its lock was split from
- * the lower vnode lock. Need to do extra unlock before
- * allowing the final vdrop() to free the vnode.
- */
if (vp->v_usecount == 0) {
+ /*
+ * If vunref() dropped the last use reference on the
+ * nullfs vnode, it must be reclaimed, and its lock
+ * was split from the lower vnode lock. Need to do
+ * extra unlock before allowing the final vdrop() to
+ * free the vnode.
+ */
KASSERT((vp->v_iflag & VI_DOOMED) != 0,
- ("not reclaimed %p", vp));
+ ("not reclaimed nullfs vnode %p", vp));
VOP_UNLOCK(vp, 0);
+ } else {
+ /*
+ * Otherwise, the nullfs vnode still shares the lock
+ * with the lower vnode, and must not be unlocked.
+ * Also clear the NULLV_NOUNLOCK, the flag is not
+ * relevant for future reclamations.
+ */
+ ASSERT_VOP_ELOCKED(vp, "unlink_lowervp");
+ KASSERT((vp->v_iflag & VI_DOOMED) == 0,
+ ("reclaimed nullfs vnode %p", vp));
+ xp->null_flags &= ~NULLV_NOUNLOCK;
}
vdrop(vp);
}
More information about the svn-src-head
mailing list