diff options
author | mjg <mjg@FreeBSD.org> | 2015-07-16 13:57:05 +0000 |
---|---|---|
committer | mjg <mjg@FreeBSD.org> | 2015-07-16 13:57:05 +0000 |
commit | 28fa5eedfe3c8c9827db6b8b82eab79e95f15bdd (patch) | |
tree | f54963a7e7c58d7c32467e171a295e83d786983f /sys/kern/vfs_cache.c | |
parent | 6832ce63741dc0339403d09a7672c72069ac261c (diff) | |
download | FreeBSD-src-28fa5eedfe3c8c9827db6b8b82eab79e95f15bdd.zip FreeBSD-src-28fa5eedfe3c8c9827db6b8b82eab79e95f15bdd.tar.gz |
vfs: implement v_holdcnt/v_usecount manipulation using atomic ops
Transitions 0->1 and 1->0 (which decide e.g. on putting the vnode on the free
list) of either counter are still guarded with vnode interlock.
Reviewed by: kib (earlier version)
Tested by: pho
Diffstat (limited to 'sys/kern/vfs_cache.c')
-rw-r--r-- | sys/kern/vfs_cache.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index 19ef783..cb4ea94 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -661,12 +661,12 @@ success: ltype = VOP_ISLOCKED(dvp); VOP_UNLOCK(dvp, 0); } - VI_LOCK(*vpp); + vhold(*vpp); if (wlocked) CACHE_WUNLOCK(); else CACHE_RUNLOCK(); - error = vget(*vpp, cnp->cn_lkflags | LK_INTERLOCK, cnp->cn_thread); + error = vget(*vpp, cnp->cn_lkflags | LK_VNHELD, cnp->cn_thread); if (cnp->cn_flags & ISDOTDOT) { vn_lock(dvp, ltype | LK_RETRY); if (dvp->v_iflag & VI_DOOMED) { @@ -1366,9 +1366,9 @@ vn_dir_dd_ino(struct vnode *vp) if ((ncp->nc_flag & NCF_ISDOTDOT) != 0) continue; ddvp = ncp->nc_dvp; - VI_LOCK(ddvp); + vhold(ddvp); CACHE_RUNLOCK(); - if (vget(ddvp, LK_INTERLOCK | LK_SHARED | LK_NOWAIT, curthread)) + if (vget(ddvp, LK_SHARED | LK_NOWAIT | LK_VNHELD, curthread)) return (NULL); return (ddvp); } |