svn commit: r233169 - stable/9/sys/fs/pseudofs
Konstantin Belousov
kib at FreeBSD.org
Mon Mar 19 10:04:45 UTC 2012
Author: kib
Date: Mon Mar 19 10:04:45 2012
New Revision: 233169
URL: http://svn.freebsd.org/changeset/base/233169
Log:
MFC r232541:
Apply inlined vn_vget_ino() algorithm for ".." lookup in pseudofs.
Modified:
stable/9/sys/fs/pseudofs/pseudofs_vnops.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/fs/ (props changed)
Modified: stable/9/sys/fs/pseudofs/pseudofs_vnops.c
==============================================================================
--- stable/9/sys/fs/pseudofs/pseudofs_vnops.c Mon Mar 19 09:34:22 2012 (r233168)
+++ stable/9/sys/fs/pseudofs/pseudofs_vnops.c Mon Mar 19 10:04:45 2012 (r233169)
@@ -432,6 +432,7 @@ pfs_lookup(struct vop_cachedlookup_args
struct pfs_vdata *pvd = vn->v_data;
struct pfs_node *pd = pvd->pvd_pn;
struct pfs_node *pn, *pdn = NULL;
+ struct mount *mp;
pid_t pid = pvd->pvd_pid;
char *pname;
int error, i, namelen, visible;
@@ -474,10 +475,26 @@ pfs_lookup(struct vop_cachedlookup_args
PFS_RETURN (0);
}
+ mp = vn->v_mount;
+
/* parent */
if (cnp->cn_flags & ISDOTDOT) {
if (pd->pn_type == pfstype_root)
PFS_RETURN (EIO);
+ error = vfs_busy(mp, MBF_NOWAIT);
+ if (error != 0) {
+ vfs_ref(mp);
+ VOP_UNLOCK(vn, 0);
+ error = vfs_busy(mp, 0);
+ vn_lock(vn, LK_EXCLUSIVE | LK_RETRY);
+ vfs_rel(mp);
+ if (error != 0)
+ PFS_RETURN(ENOENT);
+ if (vn->v_iflag & VI_DOOMED) {
+ vfs_unbusy(mp);
+ PFS_RETURN(ENOENT);
+ }
+ }
VOP_UNLOCK(vn, 0);
KASSERT(pd->pn_parent != NULL,
("%s(): non-root directory has no parent", __func__));
@@ -535,18 +552,28 @@ pfs_lookup(struct vop_cachedlookup_args
goto failed;
}
- error = pfs_vncache_alloc(vn->v_mount, vpp, pn, pid);
+ error = pfs_vncache_alloc(mp, vpp, pn, pid);
if (error)
goto failed;
- if (cnp->cn_flags & ISDOTDOT)
- vn_lock(vn, LK_EXCLUSIVE|LK_RETRY);
+ if (cnp->cn_flags & ISDOTDOT) {
+ vfs_unbusy(mp);
+ vn_lock(vn, LK_EXCLUSIVE | LK_RETRY);
+ if (vn->v_iflag & VI_DOOMED) {
+ vput(*vpp);
+ *vpp = NULL;
+ PFS_RETURN(ENOENT);
+ }
+ }
if (cnp->cn_flags & MAKEENTRY && !(vn->v_iflag & VI_DOOMED))
cache_enter(vn, *vpp, cnp);
PFS_RETURN (0);
failed:
- if (cnp->cn_flags & ISDOTDOT)
- vn_lock(vn, LK_EXCLUSIVE|LK_RETRY);
+ if (cnp->cn_flags & ISDOTDOT) {
+ vfs_unbusy(mp);
+ vn_lock(vn, LK_EXCLUSIVE | LK_RETRY);
+ *vpp = NULL;
+ }
PFS_RETURN(error);
}
More information about the svn-src-stable-9
mailing list