diff options
author | gleb <gleb@FreeBSD.org> | 2012-03-14 08:29:21 +0000 |
---|---|---|
committer | gleb <gleb@FreeBSD.org> | 2012-03-14 08:29:21 +0000 |
commit | fa1fc18612faf6bfd16e8092c070fc70e359b18b (patch) | |
tree | 2b0091b54d91d8cf55cba370d0f1e499a2516e09 /sys/fs/tmpfs/tmpfs_subr.c | |
parent | 9fac704df403eb5767c1251fd435d7a37d0c69a1 (diff) | |
download | FreeBSD-src-fa1fc18612faf6bfd16e8092c070fc70e359b18b.zip FreeBSD-src-fa1fc18612faf6bfd16e8092c070fc70e359b18b.tar.gz |
Don't enforce LK_RETRY to get existing vnode in tmpfs_alloc_vp()
Doomed vnode is hardly of any use here, besides all callers handle error
case. vfs_hash_get() does the same.
Don't mess with vnode holdcount, vget() takes care of it already.
Approved by: mdf (mentor)
Diffstat (limited to 'sys/fs/tmpfs/tmpfs_subr.c')
-rw-r--r-- | sys/fs/tmpfs/tmpfs_subr.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c index d2b2245..0d7c878 100644 --- a/sys/fs/tmpfs/tmpfs_subr.c +++ b/sys/fs/tmpfs/tmpfs_subr.c @@ -320,9 +320,11 @@ loop: MPASS((node->tn_vpstate & TMPFS_VNODE_DOOMED) == 0); VI_LOCK(vp); TMPFS_NODE_UNLOCK(node); - vholdl(vp); - (void) vget(vp, lkflag | LK_INTERLOCK | LK_RETRY, curthread); - vdrop(vp); + error = vget(vp, lkflag | LK_INTERLOCK, curthread); + if (error != 0) { + vp = NULL; + goto out; + } /* * Make sure the vnode is still there after @@ -420,11 +422,13 @@ unlock: out: *vpp = vp; - MPASS(IFF(error == 0, *vpp != NULL && VOP_ISLOCKED(*vpp))); #ifdef INVARIANTS - TMPFS_NODE_LOCK(node); - MPASS(*vpp == node->tn_vnode); - TMPFS_NODE_UNLOCK(node); + if (error == 0) { + MPASS(*vpp != NULL && VOP_ISLOCKED(*vpp)); + TMPFS_NODE_LOCK(node); + MPASS(*vpp == node->tn_vnode); + TMPFS_NODE_UNLOCK(node); + } #endif return error; |