diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2013-09-29 18:07:14 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2013-09-29 18:07:14 +0000 |
commit | fe39412e99d2ad2bc77575d08efdc199c08ba94d (patch) | |
tree | 02fe2097f915f7f22b8252b5a89c19615825076a /sys/kern/vfs_subr.c | |
parent | ac34145005f8d7549147d0c0eada85db83f81d7f (diff) | |
download | src-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.c | 6 |
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) |