1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-19 10:53:58 +00:00

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:
Rick Macklem 2011-01-03 00:33:32 +00:00
parent 53c8f97512
commit 81f78d997d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216897
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);
if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
if (vpp) {
NFSVOPUNLOCK(vp, 0, p);
if (vpp != NULL && nd->nd_repstat == 0)
*vpp = vp;
} else {
else
vput(vp);
}
if (dirp) {
if (nd->nd_flag & ND_NFSV3)
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)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
p, 1);
if (vpp) {
NFSVOPUNLOCK(vp, 0, p);
if (vpp != NULL && nd->nd_repstat == 0) {
VOP_UNLOCK(vp, 0);
*vpp = vp;
} else {
} else
vput(vp);
}
}
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,
nvap, nd->nd_cred, p, 1);
}
if (vpp) {
NFSVOPUNLOCK(ndp->ni_vp, 0, p);
if (vpp != NULL && nd->nd_repstat == 0) {
VOP_UNLOCK(ndp->ni_vp, 0);
*vpp = ndp->ni_vp;
} else {
} else
vput(ndp->ni_vp);
}
}
if (dirp) {
*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);
}
}
if (op == NFSV4OP_LOOKUP || op == NFSV4OP_LOOKUPP)
/* Lookup ops return a locked vnode */
VOP_UNLOCK(nvp, 0);
if (!nd->nd_repstat) {
vrele(vp);
vp = nvp;
}
} else
vrele(nvp);
}
if (nfsv4_opflag[op].modifyfs)
NFS_ENDWRITE(mp);