diff options
Diffstat (limited to 'sys/fs/pseudofs/pseudofs_vncache.c')
-rw-r--r-- | sys/fs/pseudofs/pseudofs_vncache.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/fs/pseudofs/pseudofs_vncache.c b/sys/fs/pseudofs/pseudofs_vncache.c index e6961bd..2412e32 100644 --- a/sys/fs/pseudofs/pseudofs_vncache.c +++ b/sys/fs/pseudofs/pseudofs_vncache.c @@ -180,6 +180,14 @@ retry: if ((pn->pn_flags & PFS_PROCDEP) != 0) (*vpp)->v_vflag |= VV_PROCDEP; pvd->pvd_vnode = *vpp; + (*vpp)->v_vnlock->lk_flags |= LK_CANRECURSE; + vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curthread); + error = insmntque(*vpp, mp); + if (error != 0) { + FREE(pvd, M_PFSVNCACHE); + *vpp = NULLVP; + return (error); + } mtx_lock(&pfs_vncache_mutex); pvd->pvd_prev = NULL; pvd->pvd_next = pfs_vncache; @@ -187,8 +195,6 @@ retry: pvd->pvd_next->pvd_prev = pvd; pfs_vncache = pvd; mtx_unlock(&pfs_vncache_mutex); - (*vpp)->v_vnlock->lk_flags |= LK_CANRECURSE; - vn_lock(*vpp, LK_RETRY | LK_EXCLUSIVE, curthread); return (0); } |