Add an argument to nfsvno_getattr() in the experimental
NFS server, so that it can avoid calling VOP_ISLOCKED() when the vnode is known to be locked. This will allow LK_SHARED to be used for these cases, which happen to be all the cases that can use LK_SHARED. This does not fix any bug, but it reduces the number of calls to VOP_ISLOCKED() and prepares the code so that it can be switched to using LK_SHARED in a future patch. Reviewed by: kib MFC after: 2 weeks
This commit is contained in:
parent
a852f40b7a
commit
0cf42b622b
@ -510,7 +510,7 @@ void ncl_invalcaches(vnode_t);
|
|||||||
|
|
||||||
/* nfs_nfsdport.c */
|
/* nfs_nfsdport.c */
|
||||||
int nfsvno_getattr(vnode_t, struct nfsvattr *, struct ucred *,
|
int nfsvno_getattr(vnode_t, struct nfsvattr *, struct ucred *,
|
||||||
NFSPROC_T *);
|
NFSPROC_T *, int);
|
||||||
int nfsvno_setattr(vnode_t, struct nfsvattr *, struct ucred *,
|
int nfsvno_setattr(vnode_t, struct nfsvattr *, struct ucred *,
|
||||||
NFSPROC_T *, struct nfsexstuff *);
|
NFSPROC_T *, struct nfsexstuff *);
|
||||||
int nfsvno_getfh(vnode_t, fhandle_t *, NFSPROC_T *);
|
int nfsvno_getfh(vnode_t, fhandle_t *, NFSPROC_T *);
|
||||||
|
@ -100,18 +100,24 @@ static struct nfsheur {
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
|
nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
|
||||||
struct thread *p)
|
struct thread *p, int vpislocked)
|
||||||
{
|
{
|
||||||
int error, lockedit = 0;
|
int error, lockedit = 0;
|
||||||
|
|
||||||
/* Since FreeBSD insists the vnode be locked... */
|
if (vpislocked == 0) {
|
||||||
if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) {
|
/*
|
||||||
lockedit = 1;
|
* When vpislocked == 0, the vnode is either exclusively
|
||||||
NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
|
* locked by this thread or not locked by this thread.
|
||||||
|
* As such, shared lock it, if not exclusively locked.
|
||||||
|
*/
|
||||||
|
if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) {
|
||||||
|
lockedit = 1;
|
||||||
|
vn_lock(vp, LK_SHARED | LK_RETRY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
error = VOP_GETATTR(vp, &nvap->na_vattr, cred);
|
error = VOP_GETATTR(vp, &nvap->na_vattr, cred);
|
||||||
if (lockedit)
|
if (lockedit != 0)
|
||||||
NFSVOPUNLOCK(vp, 0, p);
|
VOP_UNLOCK(vp, 0);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1375,7 +1381,7 @@ nfsvno_updfilerev(struct vnode *vp, struct nfsvattr *nvap,
|
|||||||
VATTR_NULL(&va);
|
VATTR_NULL(&va);
|
||||||
getnanotime(&va.va_mtime);
|
getnanotime(&va.va_mtime);
|
||||||
(void) VOP_SETATTR(vp, &va, cred);
|
(void) VOP_SETATTR(vp, &va, cred);
|
||||||
(void) nfsvno_getattr(vp, nvap, cred, p);
|
(void) nfsvno_getattr(vp, nvap, cred, p, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1456,7 +1462,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
|
|||||||
fullsiz = siz;
|
fullsiz = siz;
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred,
|
nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred,
|
||||||
p);
|
p, 1);
|
||||||
#if 0
|
#if 0
|
||||||
/*
|
/*
|
||||||
* va_filerev is not sufficient as a cookie verifier,
|
* va_filerev is not sufficient as a cookie verifier,
|
||||||
@ -1512,7 +1518,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
|
|||||||
if (!cookies && !nd->nd_repstat)
|
if (!cookies && !nd->nd_repstat)
|
||||||
nd->nd_repstat = NFSERR_PERM;
|
nd->nd_repstat = NFSERR_PERM;
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = getret;
|
nd->nd_repstat = getret;
|
||||||
}
|
}
|
||||||
@ -1723,7 +1729,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
|
|||||||
NFSZERO_ATTRBIT(&attrbits);
|
NFSZERO_ATTRBIT(&attrbits);
|
||||||
}
|
}
|
||||||
fullsiz = siz;
|
fullsiz = siz;
|
||||||
nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
if (off && verf != at.na_filerev) {
|
if (off && verf != at.na_filerev) {
|
||||||
/*
|
/*
|
||||||
@ -1782,7 +1788,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
|
|||||||
if (io.uio_resid)
|
if (io.uio_resid)
|
||||||
siz -= io.uio_resid;
|
siz -= io.uio_resid;
|
||||||
|
|
||||||
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
|
||||||
|
|
||||||
if (!cookies && !nd->nd_repstat)
|
if (!cookies && !nd->nd_repstat)
|
||||||
nd->nd_repstat = NFSERR_PERM;
|
nd->nd_repstat = NFSERR_PERM;
|
||||||
@ -1958,7 +1964,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
|
|||||||
r = nfsvno_getfh(nvp, &nfh, p);
|
r = nfsvno_getfh(nvp, &nfh, p);
|
||||||
if (!r)
|
if (!r)
|
||||||
r = nfsvno_getattr(nvp, nvap,
|
r = nfsvno_getattr(nvp, nvap,
|
||||||
nd->nd_cred, p);
|
nd->nd_cred, p, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nvp = NULL;
|
nvp = NULL;
|
||||||
|
@ -144,7 +144,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
}
|
}
|
||||||
nfsmode &= supported;
|
nfsmode &= supported;
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
nfsrv_postopattr(nd, getret, &nva);
|
nfsrv_postopattr(nd, getret, &nva);
|
||||||
}
|
}
|
||||||
vput(vp);
|
vput(vp);
|
||||||
@ -199,7 +199,7 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
|
|||||||
NFSACCCHK_VPISLOCKED, NULL);
|
NFSACCCHK_VPISLOCKED, NULL);
|
||||||
}
|
}
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
if (nd->nd_flag & ND_NFSV4) {
|
if (nd->nd_flag & ND_NFSV4) {
|
||||||
if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_FILEHANDLE))
|
if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_FILEHANDLE))
|
||||||
@ -255,7 +255,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
error = nfsrv_sattr(nd, &nva, &attrbits, aclp, p);
|
error = nfsrv_sattr(nd, &nva, &attrbits, aclp, p);
|
||||||
if (error)
|
if (error)
|
||||||
goto nfsmout;
|
goto nfsmout;
|
||||||
preat_ret = nfsvno_getattr(vp, &nva2, nd->nd_cred, p);
|
preat_ret = nfsvno_getattr(vp, &nva2, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = preat_ret;
|
nd->nd_repstat = preat_ret;
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
@ -375,7 +375,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
exp);
|
exp);
|
||||||
}
|
}
|
||||||
if (nd->nd_flag & (ND_NFSV2 | ND_NFSV3)) {
|
if (nd->nd_flag & (ND_NFSV2 | ND_NFSV3)) {
|
||||||
postat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
postat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = postat_ret;
|
nd->nd_repstat = postat_ret;
|
||||||
}
|
}
|
||||||
@ -456,7 +456,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (dirp) {
|
if (dirp) {
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
dattr_ret = nfsvno_getattr(dirp, &dattr,
|
dattr_ret = nfsvno_getattr(dirp, &dattr,
|
||||||
nd->nd_cred, p);
|
nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
@ -469,7 +469,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
vp = named.ni_vp;
|
vp = named.ni_vp;
|
||||||
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);
|
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (vpp) {
|
if (vpp) {
|
||||||
NFSVOPUNLOCK(vp, 0, p);
|
NFSVOPUNLOCK(vp, 0, p);
|
||||||
*vpp = vp;
|
*vpp = vp;
|
||||||
@ -479,7 +479,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
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,
|
||||||
p);
|
p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if (nd->nd_repstat) {
|
if (nd->nd_repstat) {
|
||||||
@ -524,7 +524,7 @@ nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred, p,
|
nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred, p,
|
||||||
&mp, &mpend, &len);
|
&mp, &mpend, &len);
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
vput(vp);
|
vput(vp);
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
nfsrv_postopattr(nd, getret, &nva);
|
nfsrv_postopattr(nd, getret, &nva);
|
||||||
@ -612,7 +612,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
|
nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
|
||||||
EINVAL;
|
EINVAL;
|
||||||
}
|
}
|
||||||
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = getret;
|
nd->nd_repstat = getret;
|
||||||
if (!nd->nd_repstat &&
|
if (!nd->nd_repstat &&
|
||||||
@ -650,7 +650,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred, p,
|
nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred, p,
|
||||||
&m3, &m2);
|
&m3, &m2);
|
||||||
if (!(nd->nd_flag & ND_NFSV4)) {
|
if (!(nd->nd_flag & ND_NFSV4)) {
|
||||||
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = getret;
|
nd->nd_repstat = getret;
|
||||||
}
|
}
|
||||||
@ -788,7 +788,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
|
nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
|
||||||
EINVAL;
|
EINVAL;
|
||||||
}
|
}
|
||||||
forat_ret = nfsvno_getattr(vp, &forat, nd->nd_cred, p);
|
forat_ret = nfsvno_getattr(vp, &forat, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = forat_ret;
|
nd->nd_repstat = forat_ret;
|
||||||
if (!nd->nd_repstat &&
|
if (!nd->nd_repstat &&
|
||||||
@ -823,7 +823,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (nd->nd_flag & ND_NFSV4)
|
if (nd->nd_flag & ND_NFSV4)
|
||||||
aftat_ret = 0;
|
aftat_ret = 0;
|
||||||
else
|
else
|
||||||
aftat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
aftat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
vput(vp);
|
vput(vp);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = aftat_ret;
|
nd->nd_repstat = aftat_ret;
|
||||||
@ -939,7 +939,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
nfsvno_relpathbuf(&named);
|
nfsvno_relpathbuf(&named);
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred,
|
dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred,
|
||||||
p);
|
p, 1);
|
||||||
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
|
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
|
||||||
&diraft);
|
&diraft);
|
||||||
}
|
}
|
||||||
@ -954,7 +954,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
dirp = NULL;
|
dirp = NULL;
|
||||||
} else {
|
} else {
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
|
||||||
p);
|
p, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nd->nd_repstat) {
|
if (nd->nd_repstat) {
|
||||||
@ -993,7 +993,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
|
nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
|
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
|
||||||
p);
|
p, 1);
|
||||||
vput(vp);
|
vput(vp);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
tverf[0] = nva.na_atime.tv_sec;
|
tverf[0] = nva.na_atime.tv_sec;
|
||||||
@ -1009,7 +1009,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0]
|
if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0]
|
||||||
|| cverf[1] != tverf[1]))
|
|| cverf[1] != tverf[1]))
|
||||||
nd->nd_repstat = EEXIST;
|
nd->nd_repstat = EEXIST;
|
||||||
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p);
|
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
(void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 1);
|
(void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 1);
|
||||||
@ -1136,7 +1136,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p);
|
dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
|
||||||
if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
|
if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
|
||||||
if (!dirfor_ret && NFSVNO_ISSETGID(&nva) &&
|
if (!dirfor_ret && NFSVNO_ISSETGID(&nva) &&
|
||||||
dirfor.na_gid == nva.na_gid)
|
dirfor.na_gid == nva.na_gid)
|
||||||
@ -1175,7 +1175,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (dirp) {
|
if (dirp) {
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor,
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor,
|
||||||
nd->nd_cred, p);
|
nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
#ifdef NFS4_ACL_EXTATTR_NAME
|
#ifdef NFS4_ACL_EXTATTR_NAME
|
||||||
@ -1187,7 +1187,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (dirp)
|
if (dirp)
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p);
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
|
||||||
|
|
||||||
if ((nd->nd_flag & ND_NFSV4) && (vtyp == VDIR || vtyp == VLNK)) {
|
if ((nd->nd_flag & ND_NFSV4) && (vtyp == VDIR || vtyp == VLNK)) {
|
||||||
if (vtyp == VDIR) {
|
if (vtyp == VDIR) {
|
||||||
@ -1217,7 +1217,7 @@ nfsrvd_mknod(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_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);
|
p, 1);
|
||||||
if (vpp) {
|
if (vpp) {
|
||||||
NFSVOPUNLOCK(vp, 0, p);
|
NFSVOPUNLOCK(vp, 0, p);
|
||||||
*vpp = vp;
|
*vpp = vp;
|
||||||
@ -1226,7 +1226,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p);
|
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
@ -1296,7 +1296,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (dirp) {
|
if (dirp) {
|
||||||
if (!(nd->nd_flag & ND_NFSV2)) {
|
if (!(nd->nd_flag & ND_NFSV2)) {
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor,
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor,
|
||||||
nd->nd_cred, p);
|
nd->nd_cred, p, 0);
|
||||||
} else {
|
} else {
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
dirp = NULL;
|
dirp = NULL;
|
||||||
@ -1321,7 +1321,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (!(nd->nd_flag & ND_NFSV2)) {
|
if (!(nd->nd_flag & ND_NFSV2)) {
|
||||||
if (dirp) {
|
if (dirp) {
|
||||||
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred,
|
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred,
|
||||||
p);
|
p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
@ -1364,7 +1364,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (!(nd->nd_flag & ND_NFSV2))
|
if (!(nd->nd_flag & ND_NFSV2))
|
||||||
fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p);
|
fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p, 1);
|
||||||
tond.ni_cnd.cn_nameiop = 0;
|
tond.ni_cnd.cn_nameiop = 0;
|
||||||
tond.ni_startdir = NULL;
|
tond.ni_startdir = NULL;
|
||||||
NFSNAMEICNDSET(&fromnd.ni_cnd, nd->nd_cred, DELETE, WANTPARENT | SAVESTART);
|
NFSNAMEICNDSET(&fromnd.ni_cnd, nd->nd_cred, DELETE, WANTPARENT | SAVESTART);
|
||||||
@ -1380,7 +1380,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
|
|||||||
if (nd->nd_flag & ND_NFSV4) {
|
if (nd->nd_flag & ND_NFSV4) {
|
||||||
tdp = todp;
|
tdp = todp;
|
||||||
tnes = *toexp;
|
tnes = *toexp;
|
||||||
tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred, p);
|
tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred, p, 0);
|
||||||
} else {
|
} else {
|
||||||
error = nfsrv_mtofh(nd, &tfh);
|
error = nfsrv_mtofh(nd, &tfh);
|
||||||
if (error) {
|
if (error) {
|
||||||
@ -1395,7 +1395,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
|
|||||||
nfsd_fhtovp(nd, &tfh, &tdp, &tnes, &mp, 0, p);
|
nfsd_fhtovp(nd, &tfh, &tdp, &tnes, &mp, 0, p);
|
||||||
if (tdp) {
|
if (tdp) {
|
||||||
tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
|
tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
|
||||||
p);
|
p, 1);
|
||||||
NFSVOPUNLOCK(tdp, 0, p);
|
NFSVOPUNLOCK(tdp, 0, p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1463,9 +1463,11 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
|
|||||||
nd->nd_repstat = nfsvno_rename(&fromnd, &tond, nd->nd_repstat,
|
nd->nd_repstat = nfsvno_rename(&fromnd, &tond, nd->nd_repstat,
|
||||||
nd->nd_flag, nd->nd_cred, p);
|
nd->nd_flag, nd->nd_cred, p);
|
||||||
if (fdirp)
|
if (fdirp)
|
||||||
fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd->nd_cred, p);
|
fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd->nd_cred, p,
|
||||||
|
0);
|
||||||
if (tdirp)
|
if (tdirp)
|
||||||
tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd->nd_cred, p);
|
tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd->nd_cred, p,
|
||||||
|
0);
|
||||||
if (tnes.nes_vfslocked && !exp->nes_vfslocked &&
|
if (tnes.nes_vfslocked && !exp->nes_vfslocked &&
|
||||||
!(nd->nd_flag & ND_NFSV4))
|
!(nd->nd_flag & ND_NFSV4))
|
||||||
nfsvno_unlockvfs(mp);
|
nfsvno_unlockvfs(mp);
|
||||||
@ -1580,15 +1582,15 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
|
|||||||
dirp = NULL;
|
dirp = NULL;
|
||||||
} else {
|
} else {
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor,
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor,
|
||||||
nd->nd_cred, p);
|
nd->nd_cred, p, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_link(&named, vp, nd->nd_cred, p, exp);
|
nd->nd_repstat = nfsvno_link(&named, vp, nd->nd_cred, p, exp);
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 0);
|
||||||
if (dirp) {
|
if (dirp) {
|
||||||
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p);
|
diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if (tnes.nes_vfslocked && !exp->nes_vfslocked &&
|
if (tnes.nes_vfslocked && !exp->nes_vfslocked &&
|
||||||
@ -1659,12 +1661,12 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
if (dirp != NULL)
|
if (dirp != NULL)
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
|
||||||
p);
|
p, 0);
|
||||||
nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
|
nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
|
||||||
&dirfor, &diraft, &diraft_ret, NULL, NULL, p, exp,
|
&dirfor, &diraft, &diraft_ret, NULL, NULL, p, exp,
|
||||||
pathcp, pathlen);
|
pathcp, pathlen);
|
||||||
} else if (dirp != NULL) {
|
} else if (dirp != NULL) {
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p);
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if (pathcp)
|
if (pathcp)
|
||||||
@ -1701,7 +1703,7 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
|
|||||||
nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p);
|
nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
|
nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
|
||||||
nvap, nd->nd_cred, p);
|
nvap, nd->nd_cred, p, 1);
|
||||||
}
|
}
|
||||||
if (vpp) {
|
if (vpp) {
|
||||||
NFSVOPUNLOCK(ndp->ni_vp, 0, p);
|
NFSVOPUNLOCK(ndp->ni_vp, 0, p);
|
||||||
@ -1711,7 +1713,7 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dirp) {
|
if (dirp) {
|
||||||
*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p);
|
*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
|
if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
|
||||||
@ -1780,7 +1782,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (nd->nd_repstat) {
|
if (nd->nd_repstat) {
|
||||||
if (dirp != NULL) {
|
if (dirp != NULL) {
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
|
||||||
p);
|
p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
@ -1789,7 +1791,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (dirp != NULL)
|
if (dirp != NULL)
|
||||||
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p);
|
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call nfsrvd_mkdirsub() for the code common to V4 as well.
|
* Call nfsrvd_mkdirsub() for the code common to V4 as well.
|
||||||
@ -1836,7 +1838,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
|
|||||||
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, nvap, nd->nd_cred,
|
nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred,
|
||||||
p);
|
p, 1);
|
||||||
if (vpp && !nd->nd_repstat) {
|
if (vpp && !nd->nd_repstat) {
|
||||||
NFSVOPUNLOCK(vp, 0, p);
|
NFSVOPUNLOCK(vp, 0, p);
|
||||||
*vpp = vp;
|
*vpp = vp;
|
||||||
@ -1845,7 +1847,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dirp) {
|
if (dirp) {
|
||||||
*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p);
|
*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
|
||||||
vrele(dirp);
|
vrele(dirp);
|
||||||
}
|
}
|
||||||
if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
|
if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
|
||||||
@ -1883,10 +1885,10 @@ nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
tl += 2;
|
tl += 2;
|
||||||
cnt = fxdr_unsigned(int, *tl);
|
cnt = fxdr_unsigned(int, *tl);
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
for_ret = nfsvno_getattr(vp, &bfor, nd->nd_cred, p);
|
for_ret = nfsvno_getattr(vp, &bfor, nd->nd_cred, p, 1);
|
||||||
nd->nd_repstat = nfsvno_fsync(vp, off, cnt, nd->nd_cred, p);
|
nd->nd_repstat = nfsvno_fsync(vp, off, cnt, nd->nd_cred, p);
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
aft_ret = nfsvno_getattr(vp, &aft, nd->nd_cred, p);
|
aft_ret = nfsvno_getattr(vp, &aft, nd->nd_cred, p, 1);
|
||||||
nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
|
nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
|
||||||
}
|
}
|
||||||
vput(vp);
|
vput(vp);
|
||||||
@ -1921,7 +1923,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
}
|
}
|
||||||
sf = &sfs;
|
sf = &sfs;
|
||||||
nd->nd_repstat = nfsvno_statfs(vp, sf);
|
nd->nd_repstat = nfsvno_statfs(vp, sf);
|
||||||
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
|
||||||
vput(vp);
|
vput(vp);
|
||||||
if (nd->nd_flag & ND_NFSV3)
|
if (nd->nd_flag & ND_NFSV3)
|
||||||
nfsrv_postopattr(nd, getret, &at);
|
nfsrv_postopattr(nd, getret, &at);
|
||||||
@ -1972,7 +1974,7 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
|
|||||||
nfsrv_postopattr(nd, getret, &at);
|
nfsrv_postopattr(nd, getret, &at);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
|
||||||
nfsvno_getfs(&fs, isdgram);
|
nfsvno_getfs(&fs, isdgram);
|
||||||
vput(vp);
|
vput(vp);
|
||||||
nfsrv_postopattr(nd, getret, &at);
|
nfsrv_postopattr(nd, getret, &at);
|
||||||
@ -2019,7 +2021,7 @@ nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_pathconf(vp, _PC_NO_TRUNC, ¬runc,
|
nd->nd_repstat = nfsvno_pathconf(vp, _PC_NO_TRUNC, ¬runc,
|
||||||
nd->nd_cred, p);
|
nd->nd_cred, p);
|
||||||
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p);
|
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
|
||||||
vput(vp);
|
vput(vp);
|
||||||
nfsrv_postopattr(nd, getret, &at);
|
nfsrv_postopattr(nd, getret, &at);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
@ -2516,7 +2518,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
|
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
|
||||||
create = fxdr_unsigned(int, *tl);
|
create = fxdr_unsigned(int, *tl);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p);
|
nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
|
||||||
if (create == NFSV4OPEN_CREATE) {
|
if (create == NFSV4OPEN_CREATE) {
|
||||||
nva.na_type = VREG;
|
nva.na_type = VREG;
|
||||||
nva.na_mode = 0;
|
nva.na_mode = 0;
|
||||||
@ -2710,7 +2712,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
tverf[0] = nva.na_atime.tv_sec;
|
tverf[0] = nva.na_atime.tv_sec;
|
||||||
tverf[1] = nva.na_atime.tv_nsec;
|
tverf[1] = nva.na_atime.tv_nsec;
|
||||||
@ -2736,7 +2738,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
if (stp)
|
if (stp)
|
||||||
FREE((caddr_t)stp, M_NFSDSTATE);
|
FREE((caddr_t)stp, M_NFSDSTATE);
|
||||||
if (!nd->nd_repstat && dirp)
|
if (!nd->nd_repstat && dirp)
|
||||||
nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p);
|
nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p,
|
||||||
|
0);
|
||||||
if (!nd->nd_repstat) {
|
if (!nd->nd_repstat) {
|
||||||
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED);
|
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED);
|
||||||
*tl++ = txdr_unsigned(stateid.seqid);
|
*tl++ = txdr_unsigned(stateid.seqid);
|
||||||
@ -3348,7 +3351,7 @@ nfsrvd_verify(struct nfsrv_descript *nd, int isdgram,
|
|||||||
struct nfsfsinfo fs;
|
struct nfsfsinfo fs;
|
||||||
fhandle_t fh;
|
fhandle_t fh;
|
||||||
|
|
||||||
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p);
|
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
nd->nd_repstat = nfsvno_statfs(vp, &sf);
|
nd->nd_repstat = nfsvno_statfs(vp, &sf);
|
||||||
if (!nd->nd_repstat)
|
if (!nd->nd_repstat)
|
||||||
|
Loading…
Reference in New Issue
Block a user