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:
parent
53c8f97512
commit
81f78d997d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216897
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user