From ce5846dc19098c1cd1e94f3d211b76ba96af5313 Mon Sep 17 00:00:00 2001 From: Jeff Roberson Date: Mon, 28 Mar 2005 09:46:33 +0000 Subject: [PATCH] - nwfs_lookup() is no longer responsible for unlocking the dvp, this is handled in vfs_lookup.c. This code was missing PDIRUNLOCK use prior to the removal of PDIRUNLOCK in rev 1.73 of vfs_lookup.c. Sponsored by: Isilon Systems, Inc. --- sys/fs/nwfs/nwfs_vnops.c | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/sys/fs/nwfs/nwfs_vnops.c b/sys/fs/nwfs/nwfs_vnops.c index 4069e3674d14..be452da0a5db 100644 --- a/sys/fs/nwfs/nwfs_vnops.c +++ b/sys/fs/nwfs/nwfs_vnops.c @@ -836,7 +836,7 @@ nwfs_lookup(ap) struct nw_entry_info fattr, *fap; ncpfid fid; int nameiop=cnp->cn_nameiop, islastcn; - int lockparent, wantparent, error = 0, notfound; + int wantparent, error = 0, notfound; struct thread *td = cnp->cn_thread; char _name[cnp->cn_namelen+1]; bcopy(cnp->cn_nameptr, _name, cnp->cn_namelen); @@ -857,7 +857,6 @@ nwfs_lookup(ap) return (EROFS); if ((error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, td))) return (error); - lockparent = flags & LOCKPARENT; wantparent = flags & (LOCKPARENT|WANTPARENT); nmp = VFSTONWFS(mp); dnp = VTONW(dvp); @@ -885,13 +884,10 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO } else if (flags & ISDOTDOT) { VOP_UNLOCK(dvp, 0, td); /* unlock parent */ error = vget(vp, LK_EXCLUSIVE, td); - if (!error && lockparent && islastcn) - error = vn_lock(dvp, LK_EXCLUSIVE, td); - } else { + if (error) + vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); + } else error = vget(vp, LK_EXCLUSIVE, td); - if (!lockparent || error || !islastcn) - VOP_UNLOCK(dvp, 0, td); - } if (!error) { if (!VOP_GETATTR(vp, &vattr, cnp->cn_cred, td) && vattr.va_ctime.tv_sec == VTONW(vp)->n_ctime) { @@ -902,15 +898,15 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO return (0); } cache_purge(vp); - vput(vp); - if (lockparent && dvp != vp && islastcn) - VOP_UNLOCK(dvp, 0, td); + if (vp != dvp) + vput(vp); + else + vrele(vp); + if (flags & ISDOTDOT) + vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); } vdrop(vp); - error = vn_lock(dvp, LK_EXCLUSIVE, td); *vpp = NULLVP; - if (error) - return (error); } /* not in cache, so ... */ error = 0; @@ -949,8 +945,6 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO /* Handle RENAME or CREATE case... */ if ((nameiop == CREATE || nameiop == RENAME) && wantparent && islastcn) { cnp->cn_flags |= SAVENAME; - if (!lockparent) - VOP_UNLOCK(dvp, 0, td); return (EJUSTRETURN); } return ENOENT; @@ -970,7 +964,6 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO if (error) return (error); *vpp = vp; cnp->cn_flags |= SAVENAME; /* I free it later */ - if (!lockparent) VOP_UNLOCK(dvp, 0, td); return (0); } if (nameiop == RENAME && islastcn && wantparent) { @@ -981,8 +974,6 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO if (error) return (error); *vpp = vp; cnp->cn_flags |= SAVENAME; - if (!lockparent) - VOP_UNLOCK(dvp, 0, td); return (0); } if (flags & ISDOTDOT) { @@ -992,11 +983,6 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); return (error); } - if (lockparent && islastcn && - (error = vn_lock(dvp, LK_EXCLUSIVE, td))) { - vput(vp); - return (error); - } *vpp = vp; } else if (NWCMPF(&dnp->n_fid, &fid)) { vref(dvp); @@ -1006,8 +992,6 @@ printf("dvp %d:%d:%d\n", (int)mp, (int)dvp->v_vflag & VV_ROOT, (int)flags & ISDO if (error) return (error); *vpp = vp; NCPVNDEBUG("lookup: getnewvp!\n"); - if (!lockparent || !islastcn) - VOP_UNLOCK(dvp, 0, td); } if ((cnp->cn_flags & MAKEENTRY)/* && !islastcn*/) { VTONW(*vpp)->n_ctime = VTONW(*vpp)->n_vattr.va_ctime.tv_sec;