Modify the experimental NFSv4 server so that the lookup

ops return a locked vnode. This ensures that the associated mount
point will always be valid for the code that follows the operation.
Also add a couple of additional checks
for non-error to the other functions that create file objects.

MFC after:	2 weeks
This commit is contained in:
rmacklem 2011-01-03 00:33:32 +00:00
parent f818eb99d7
commit bb862fc0e4
2 changed files with 13 additions and 13 deletions

View File

@ -470,12 +470,10 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsvno_getfh(vp, fhp, p); nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1); nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
if (vpp) { if (vpp != NULL && nd->nd_repstat == 0)
NFSVOPUNLOCK(vp, 0, p);
*vpp = vp; *vpp = vp;
} else { else
vput(vp); vput(vp);
}
if (dirp) { if (dirp) {
if (nd->nd_flag & ND_NFSV3) if (nd->nd_flag & ND_NFSV3)
dattr_ret = nfsvno_getattr(dirp, &dattr, nd->nd_cred, dattr_ret = nfsvno_getattr(dirp, &dattr, nd->nd_cred,
@ -1218,12 +1216,11 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat) if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
p, 1); p, 1);
if (vpp) { if (vpp != NULL && nd->nd_repstat == 0) {
NFSVOPUNLOCK(vp, 0, p); VOP_UNLOCK(vp, 0);
*vpp = vp; *vpp = vp;
} else { } else
vput(vp); vput(vp);
}
} }
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0); diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
@ -1706,12 +1703,11 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
nd->nd_repstat = nfsvno_getattr(ndp->ni_vp, nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
nvap, nd->nd_cred, p, 1); nvap, nd->nd_cred, p, 1);
} }
if (vpp) { if (vpp != NULL && nd->nd_repstat == 0) {
NFSVOPUNLOCK(ndp->ni_vp, 0, p); VOP_UNLOCK(ndp->ni_vp, 0);
*vpp = ndp->ni_vp; *vpp = ndp->ni_vp;
} else { } else
vput(ndp->ni_vp); vput(ndp->ni_vp);
}
} }
if (dirp) { if (dirp) {
*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0); *diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);

View File

@ -861,10 +861,14 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
nfsvno_lockvfs(mp); nfsvno_lockvfs(mp);
} }
} }
if (op == NFSV4OP_LOOKUP || op == NFSV4OP_LOOKUPP)
/* Lookup ops return a locked vnode */
VOP_UNLOCK(nvp, 0);
if (!nd->nd_repstat) { if (!nd->nd_repstat) {
vrele(vp); vrele(vp);
vp = nvp; vp = nvp;
} } else
vrele(nvp);
} }
if (nfsv4_opflag[op].modifyfs) if (nfsv4_opflag[op].modifyfs)
NFS_ENDWRITE(mp); NFS_ENDWRITE(mp);