Skip to content

Commit

Permalink
Move the code from ufs_lookup.c used to do dotdot lookup, into
Browse files Browse the repository at this point in the history
the helper function. It is supposed to be useful for any filesystem
that has to unlock dvp to walk to the ".." entry in lookup routine.

Requested by:	jhb
Tested by:	pho
MFC after:	1 month
  • Loading branch information
kostikbel committed Jan 21, 2009
1 parent dc43531 commit 44eef9d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 22 deletions.
32 changes: 32 additions & 0 deletions sys/kern/vfs_vnops.c
Original file line number Diff line number Diff line change
Expand Up @@ -1286,3 +1286,35 @@ vn_extattr_rm(struct vnode *vp, int ioflg, int attrnamespace,

return (error);
}

int
vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp)
{
struct mount *mp;
int ltype, error;

mp = vp->v_mount;
ltype = VOP_ISLOCKED(vp);
KASSERT(ltype == LK_EXCLUSIVE || ltype == LK_SHARED,
("vn_vget_ino: vp not locked"));
for (;;) {
error = vfs_busy(mp, MBF_NOWAIT);
if (error == 0)
break;
VOP_UNLOCK(vp, 0);
pause("vn_vget", 1);
vn_lock(vp, ltype | LK_RETRY);
if (vp->v_iflag & VI_DOOMED)
return (ENOENT);
}
VOP_UNLOCK(vp, 0);
error = VFS_VGET(mp, ino, lkflags, rvp);
vfs_unbusy(mp);
vn_lock(vp, ltype | LK_RETRY);
if (vp->v_iflag & VI_DOOMED) {
if (error == 0)
vput(*rvp);
error = ENOENT;
}
return (error);
}
3 changes: 3 additions & 0 deletions sys/sys/vnode.h
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,9 @@ int vn_extattr_set(struct vnode *vp, int ioflg, int attrnamespace,
const char *attrname, int buflen, char *buf, struct thread *td);
int vn_extattr_rm(struct vnode *vp, int ioflg, int attrnamespace,
const char *attrname, struct thread *td);
int vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags,
struct vnode **rvp);

int vfs_cache_lookup(struct vop_lookup_args *ap);
void vfs_timestamp(struct timespec *);
void vfs_write_resume(struct mount *mp);
Expand Down
23 changes: 1 addition & 22 deletions sys/ufs/ufs/ufs_lookup.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ ufs_lookup(ap)
int nameiop = cnp->cn_nameiop;
ino_t ino;
int ltype;
struct mount *mp;

bp = NULL;
slotoffset = -1;
Expand Down Expand Up @@ -578,27 +577,7 @@ ufs_lookup(ap)
*/
pdp = vdp;
if (flags & ISDOTDOT) {
ltype = VOP_ISLOCKED(pdp);
mp = pdp->v_mount;
for (;;) {
error = vfs_busy(mp, MBF_NOWAIT);
if (error == 0)
break;
VOP_UNLOCK(pdp, 0);
pause("ufs_dd", 1);
vn_lock(pdp, ltype | LK_RETRY);
if (pdp->v_iflag & VI_DOOMED)
return (ENOENT);
}
VOP_UNLOCK(pdp, 0); /* race to get the inode */
error = VFS_VGET(mp, ino, cnp->cn_lkflags, &tdp);
vfs_unbusy(mp);
vn_lock(pdp, ltype | LK_RETRY);
if (pdp->v_iflag & VI_DOOMED) {
if (error == 0)
vput(tdp);
error = ENOENT;
}
error = vn_vget_ino(pdp, ino, cnp->cn_lkflags, &tdp);
if (error)
return (error);
*vpp = tdp;
Expand Down

0 comments on commit 44eef9d

Please sign in to comment.