aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2013-09-29 18:07:14 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2013-09-29 18:07:14 +0000
commitfe39412e99d2ad2bc77575d08efdc199c08ba94d (patch)
tree02fe2097f915f7f22b8252b5a89c19615825076a /sys/kern/vfs_subr.c
parentac34145005f8d7549147d0c0eada85db83f81d7f (diff)
downloadsrc-fe39412e99d2ad2bc77575d08efdc199c08ba94d.tar.gz
src-fe39412e99d2ad2bc77575d08efdc199c08ba94d.zip
For vunref(), try to upgrade the vnode lock if the function was called
with the vnode shared-locked. If upgrade succeeded, the inactivation can be done immediately, instead of being postponed. Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Approved by: re (glebius)
Notes
Notes: svn path=/head/; revision=255942
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 23343f12a1b9..952a48990d20 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2218,8 +2218,10 @@ vputx(struct vnode *vp, int func)
}
break;
case VPUTX_VUNREF:
- if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE)
- error = EBUSY;
+ if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) {
+ error = VOP_LOCK(vp, LK_TRYUPGRADE | LK_INTERLOCK);
+ VI_LOCK(vp);
+ }
break;
}
if (vp->v_usecount > 0)