1
0
mirror of https://github.com/openbsd/src.git synced 2026-06-18 07:13:36 +02:00

remove use of struct nfsm_info in nfs_serv.c

with and ok miod@
This commit is contained in:
jsg
2026-06-09 03:12:46 +00:00
parent 4399304b9e
commit 41c7b2bcb8
+123 -200
View File
@@ -1,4 +1,4 @@
/* $OpenBSD: nfs_serv.c,v 1.147 2026/06/09 03:11:12 jsg Exp $ */
/* $OpenBSD: nfs_serv.c,v 1.148 2026/06/09 03:12:46 jsg Exp $ */
/* $NetBSD: nfs_serv.c,v 1.34 1997/05/12 23:37:12 fvdl Exp $ */
/*
@@ -148,7 +148,6 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
{
struct mbuf *nam = nfsd->nd_nam;
struct mbuf *mb;
struct nfsm_info info;
struct ucred *cred = &nfsd->nd_cr;
struct vnode *vp;
nfsfh_t nfh;
@@ -158,13 +157,6 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct vattr va;
u_long testmode, nfsmode;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
else if (error != 0)
@@ -224,7 +216,6 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
{
struct mbuf *nam = nfsd->nd_nam;
struct mbuf *mb;
struct nfsm_info info;
struct ucred *cred = &nfsd->nd_cr;
struct nfs_fattr *fp;
struct vattr va;
@@ -233,13 +224,6 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhandle_t *fhp;
int error = 0, rdonly;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
else if (error != 0)
@@ -247,7 +231,6 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
info.nmi_dpos = nfsd->nd_dpos; /* resync */
error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly);
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb,
@@ -280,7 +263,6 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
{
struct mbuf *nam = nfsd->nd_nam;
struct mbuf *mb;
struct nfsm_info info;
struct ucred *cred = &nfsd->nd_cr;
struct vattr va, preat;
struct nfsv2_sattr *sp;
@@ -292,13 +274,9 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
int error = 0, rdonly, preat_ret = 1, postat_ret = 1;
int gcheck = 0;
struct timespec guard;
int v3;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
@@ -308,7 +286,7 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
vattr_null(&va);
if (info.nmi_v3) {
if (v3) {
va.va_vaflags |= VA_UTIMES_NULL;
error = nfsm_srvsattr(nfsd, &va);
if (error)
@@ -370,7 +348,7 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = 0;
goto nfsmout;
}
if (info.nmi_v3) {
if (v3) {
error = preat_ret = VOP_GETATTR(vp, &preat, cred, procp);
if (!error && gcheck &&
(preat.va_ctime.tv_sec != guard.tv_sec ||
@@ -378,8 +356,8 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = NFSERR_NOT_SYNC;
if (error) {
vput(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb,
error, NFSX_WCCDATA(info.nmi_v3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCDATA(v3)) != 0)
return 0;
nfsm_srvwcc(nfsd, preat_ret, &preat, postat_ret, &va,
&mb);
@@ -411,10 +389,9 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = postat_ret;
out:
vput(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCORFATTR(info.nmi_v3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error, NFSX_WCCORFATTR(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvwcc(nfsd, preat_ret, &preat, postat_ret, &va,
&mb);
error = 0;
@@ -500,14 +477,14 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = nfs_namei(&nd, fhp, len, slp, nam, &info.nmi_md, &info.nmi_dpos, &dirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (dirp) {
if (info.nmi_v3)
if (v3)
dirattr_ret = VOP_GETATTR(dirp, &dirattr, cred,
procp);
vrele(dirp);
}
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3)) != 0)
NFSX_POSTOPATTR(v3)) != 0)
return 0;
nfsm_srvpostop_attr(nfsd, dirattr_ret, &dirattr, &mb);
return (0);
@@ -522,15 +499,14 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = VOP_GETATTR(vp, &va, cred, procp);
vput(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_SRVFH(info.nmi_v3) + NFSX_POSTOPORFATTR(info.nmi_v3) +
NFSX_POSTOPATTR(info.nmi_v3)) != 0)
NFSX_SRVFH(v3) + NFSX_POSTOPORFATTR(v3) + NFSX_POSTOPATTR(v3)) != 0)
return 0;
if (error) {
nfsm_srvpostop_attr(nfsd, dirattr_ret, &dirattr, &mb);
error = 0;
goto nfsmout;
}
nfsm_srvfhtom(&mb, fhp, info.nmi_v3);
nfsm_srvfhtom(&mb, fhp, v3);
if (v3) {
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
nfsm_srvpostop_attr(nfsd, dirattr_ret, &dirattr, &mb);
@@ -554,7 +530,6 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct ucred *cred = &nfsd->nd_cr;
struct iovec iov;
struct mbuf *mp = NULL;
struct nfsm_info info;
u_int32_t *tl;
int error = 0, rdonly, tlen, len = 0, getret;
struct vnode *vp;
@@ -562,13 +537,9 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsfh_t nfh;
fhandle_t *fhp;
struct uio uio;
int v3;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
v3 = (nfsd->nd_flag & ND_NFSV3);
memset(&uio, 0, sizeof(uio));
@@ -579,7 +550,6 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
info.nmi_dpos = nfsd->nd_dpos; /* resync */
error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly);
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
@@ -590,7 +560,7 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
goto nfsmout;
}
if (vp->v_type != VLNK) {
if (info.nmi_v3)
if (v3)
error = EINVAL;
else
error = ENXIO;
@@ -619,9 +589,9 @@ out:
if (error)
m_freem(mp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3) + NFSX_UNSIGNED) != 0)
NFSX_POSTOPATTR(v3) + NFSX_UNSIGNED) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvpostop_attr(nfsd, getret, &attr, &mb);
if (error) {
error = 0;
@@ -664,6 +634,9 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct uio io, *uiop = &io;
struct vattr va;
off_t off;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -679,7 +652,7 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
if (info.nmi_v3) {
if (v3) {
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
if (tl == NULL)
goto nfsmout;
@@ -707,7 +680,7 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
goto bad;
if (vp->v_type != VREG) {
if (info.nmi_v3)
if (v3)
error = EINVAL;
else
error = (vp->v_type == VDIR) ? EISDIR : EACCES;
@@ -729,10 +702,9 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
else
cnt = reqlen;
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPORFATTR(info.nmi_v3) +
3 * NFSX_UNSIGNED+nfsm_rndup(cnt)) != 0)
NFSX_POSTOPORFATTR(v3) + 3 * NFSX_UNSIGNED+nfsm_rndup(cnt)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
tl = nfsm_build(&mb, NFSX_V3FATTR + 4 * NFSX_UNSIGNED);
*tl++ = nfs_true;
fp = (struct nfs_fattr *)tl;
@@ -809,7 +781,7 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
tlen = nfsm_rndup (cnt);
if (len != tlen || tlen != cnt)
nfsm_adj(mb, len - tlen, tlen - cnt);
if (info.nmi_v3) {
if (v3) {
*tl++ = txdr_unsigned(cnt);
if (len < reqlen)
*tl++ = nfs_true;
@@ -854,6 +826,9 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhandle_t *fhp;
struct uio io, *uiop = &io;
off_t off;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -873,7 +848,7 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
if (info.nmi_v3) {
if (v3) {
tl = (uint32_t *)nfsd_dissect(nfsd, 5 * NFSX_UNSIGNED, &error);
if (tl == NULL)
goto nfsmout;
@@ -928,10 +903,10 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly);
if (error)
goto bad;
if (info.nmi_v3)
if (v3)
forat_ret = VOP_GETATTR(vp, &forat, cred, procp);
if (vp->v_type != VREG) {
if (info.nmi_v3)
if (v3)
error = EINVAL;
else
error = (vp->v_type == VDIR) ? EISDIR : EACCES;
@@ -979,10 +954,10 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (!error)
error = aftat_ret;
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_PREOPATTR(info.nmi_v3) + NFSX_POSTOPORFATTR(info.nmi_v3) +
2 * NFSX_UNSIGNED + NFSX_WRITEVERF(info.nmi_v3)) != 0)
NFSX_PREOPATTR(v3) + NFSX_POSTOPORFATTR(v3) +
2 * NFSX_UNSIGNED + NFSX_WRITEVERF(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvwcc(nfsd, forat_ret, &forat, aftat_ret, &va, &mb);
if (error) {
error = 0;
@@ -1055,6 +1030,9 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhandle_t *fhp;
u_quad_t tempsize;
u_char cverf[NFSX_V3CREATEVERF];
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -1090,7 +1068,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
&info.nmi_dpos, &dirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (dirp) {
if (info.nmi_v3)
if (v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred, procp);
else {
vrele(dirp);
@@ -1099,7 +1077,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_WCCDATA(v3)) != 0)
return 0;
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
@@ -1109,7 +1087,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
vattr_null(&va);
if (info.nmi_v3) {
if (v3) {
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
if (tl == NULL)
goto nfsmout;
@@ -1286,7 +1264,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = VOP_GETATTR(vp, &va, cred, procp);
vput(vp);
}
if (info.nmi_v3) {
if (v3) {
if (exclusive_flag && !error &&
bcmp(cverf, (caddr_t)&va.va_atime, NFSX_V3CREATEVERF))
error = EEXIST;
@@ -1294,10 +1272,9 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
vrele(dirp);
}
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_SRVFH(info.nmi_v3) + NFSX_FATTR(info.nmi_v3) +
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_SRVFH(v3) + NFSX_FATTR(v3) + NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
if (!error) {
nfsm_srvpostop_fh(&mb, fhp);
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
@@ -1305,7 +1282,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
} else {
nfsm_srvfhtom(&mb, fhp, info.nmi_v3);
nfsm_srvfhtom(&mb, fhp, v3);
fp = nfsm_build(&mb, NFSX_V2FATTR);
nfsm_srvfattr(nfsd, &va, fp);
}
@@ -1533,6 +1510,9 @@ nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct vattr dirfor, diraft;
nfsfh_t nfh;
fhandle_t *fhp;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -1568,7 +1548,7 @@ nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = nfs_namei(&nd, fhp, len, slp, nam, &info.nmi_md, &info.nmi_dpos, &dirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (dirp) {
if (info.nmi_v3)
if (v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred, procp);
else {
vrele(dirp);
@@ -1602,14 +1582,13 @@ out:
vput(vp);
}
}
if (dirp && info.nmi_v3) {
if (dirp && v3) {
diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
vrele(dirp);
}
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCDATA(info.nmi_v3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error, NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
return (0);
@@ -1639,6 +1618,9 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsfh_t fnfh, tnfh;
fhandle_t *ffhp, *tfhp;
uid_t saved_uid;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -1680,7 +1662,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
&info.nmi_dpos, &fdirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (fdirp) {
if (info.nmi_v3)
if (v3)
fdirfor_ret = VOP_GETATTR(fdirp, &fdirfor, cred,
procp);
else {
@@ -1690,7 +1672,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
2 * NFSX_WCCDATA(info.nmi_v3)) != 0)
2 * NFSX_WCCDATA(v3)) != 0)
return 0;
nfsm_srvwcc(nfsd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft,
&mb);
@@ -1721,9 +1703,8 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
&info.nmi_dpos, &tdirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (tdirp) {
if (info.nmi_v3)
tdirfor_ret = VOP_GETATTR(tdirp, &tdirfor, cred,
procp);
if (v3)
tdirfor_ret = VOP_GETATTR(tdirp, &tdirfor, cred, procp);
else {
vrele(tdirp);
tdirp = NULL;
@@ -1739,27 +1720,27 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
tvp = tond.ni_vp;
if (tvp != NULL) {
if (fvp->v_type == VDIR && tvp->v_type != VDIR) {
error = info.nmi_v3 ? EEXIST : EISDIR;
error = v3 ? EEXIST : EISDIR;
goto out;
} else if (fvp->v_type != VDIR && tvp->v_type == VDIR) {
error = info.nmi_v3 ? EEXIST : ENOTDIR;
error = v3 ? EEXIST : ENOTDIR;
goto out;
}
if (tvp->v_type == VDIR && tvp->v_mountedhere) {
error = info.nmi_v3 ? EXDEV : ENOTEMPTY;
error = v3 ? EXDEV : ENOTEMPTY;
goto out;
}
}
if (fvp->v_type == VDIR && fvp->v_mountedhere) {
error = info.nmi_v3 ? EXDEV : ENOTEMPTY;
error = v3 ? EXDEV : ENOTEMPTY;
goto out;
}
if (fvp->v_mount != tdvp->v_mount) {
error = info.nmi_v3 ? EXDEV : ENOTEMPTY;
error = v3 ? EXDEV : ENOTEMPTY;
goto out;
}
if (fvp == tdvp)
error = info.nmi_v3 ? EINVAL : ENOTEMPTY;
error = v3 ? EINVAL : ENOTEMPTY;
/*
* If source is the same as the destination (that is the
* same vnode with the same name in the same directory),
@@ -1804,10 +1785,9 @@ out1:
}
vrele(fromnd.ni_startdir);
pool_put(&namei_pool, fromnd.ni_cnd.cn_pnbuf);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
2 * NFSX_WCCDATA(info.nmi_v3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 2 * NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvwcc(nfsd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft,
&mb);
nfsm_srvwcc(nfsd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft,
@@ -1853,6 +1833,9 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct vattr dirfor, diraft, at;
nfsfh_t nfh, dnfh;
fhandle_t *fhp, *dfhp;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -1891,8 +1874,7 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = nfsrv_fhtovp(fhp, 0, &vp, cred, slp, nam, &rdonly);
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3) +
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3)) != 0)
return 0;
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
@@ -1909,9 +1891,8 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
&info.nmi_dpos, &dirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (dirp) {
if (info.nmi_v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
procp);
if (v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred, procp);
else {
vrele(dirp);
dirp = NULL;
@@ -1940,7 +1921,7 @@ out:
vrele(nd.ni_vp);
}
out1:
if (info.nmi_v3)
if (v3)
getret = VOP_GETATTR(vp, &at, cred, procp);
if (dirp) {
diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
@@ -1948,9 +1929,9 @@ out1:
}
vrele(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3) + NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
@@ -1981,6 +1962,9 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct vnode *dirp = NULL;
nfsfh_t nfh;
fhandle_t *fhp;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -2015,7 +1999,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
&info.nmi_dpos, &dirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (dirp) {
if (info.nmi_v3)
if (v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
procp);
else {
@@ -2026,7 +2010,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (error)
goto out;
vattr_null(&va);
if (info.nmi_v3) {
if (v3) {
error = nfsm_srvsattr(nfsd, &va);
if (error)
goto nfsmout;
@@ -2046,7 +2030,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
io.uio_procp = NULL;
if (nfsd_mtouio(nfsd, &io, len2, &error) != 0)
goto nfsmout;
if (!info.nmi_v3) {
if (!v3) {
sp = (struct nfsv2_sattr *)nfsd_dissect(nfsd, NFSX_V2SATTR, &error);
if (sp == NULL)
goto nfsmout;
@@ -2069,7 +2053,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (error)
vrele(nd.ni_startdir);
else {
if (info.nmi_v3) {
if (v3) {
nd.ni_cnd.cn_nameiop = LOOKUP;
nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART |
FOLLOW);
@@ -2099,10 +2083,9 @@ out:
vrele(dirp);
}
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_SRVFH(info.nmi_v3) + NFSX_POSTOPATTR(info.nmi_v3) +
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_SRVFH(v3) + NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
if (!error) {
nfsm_srvpostop_fh(&mb, fhp);
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
@@ -2149,6 +2132,9 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct vnode *vp, *dirp = NULL;
nfsfh_t nfh;
fhandle_t *fhp;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -2182,7 +2168,7 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = nfs_namei(&nd, fhp, len, slp, nam, &info.nmi_md,
&info.nmi_dpos, &dirp, procp);
if (dirp) {
if (info.nmi_v3)
if (v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred, procp);
else {
vrele(dirp);
@@ -2191,7 +2177,7 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_WCCDATA(v3)) != 0)
return 0;
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
@@ -2201,7 +2187,7 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
vattr_null(&va);
if (info.nmi_v3) {
if (v3) {
nfsd->nd_dpos = info.nmi_dpos; /* resync */
error = nfsm_srvsattr(nfsd, &va);
if (error)
@@ -2243,10 +2229,9 @@ out:
vrele(dirp);
}
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_SRVFH(info.nmi_v3) + NFSX_POSTOPATTR(info.nmi_v3) +
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_SRVFH(v3) + NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
if (!error) {
nfsm_srvpostop_fh(&mb, fhp);
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
@@ -2254,7 +2239,7 @@ out:
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
} else {
nfsm_srvfhtom(&mb, fhp, info.nmi_v3);
nfsm_srvfhtom(&mb, fhp, v3);
fp = nfsm_build(&mb, NFSX_V2FATTR);
nfsm_srvfattr(nfsd, &va, fp);
}
@@ -2289,6 +2274,9 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsfh_t nfh;
fhandle_t *fhp;
struct nameidata nd;
int v3;
v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
@@ -2323,7 +2311,7 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
&info.nmi_dpos, &dirp, procp);
nfsd->nd_dpos = info.nmi_dpos; /* resync */
if (dirp) {
if (info.nmi_v3)
if (v3)
dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
procp);
else {
@@ -2333,7 +2321,7 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCDATA(info.nmi_v3)) != 0)
NFSX_WCCDATA(v3)) != 0)
return 0;
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
@@ -2380,10 +2368,9 @@ out:
diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
vrele(dirp);
}
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_WCCDATA(info.nmi_v3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error, NFSX_WCCDATA(v3)) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
&mb);
error = 0;
@@ -2436,7 +2423,6 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *mb;
struct ucred *cred = &nfsd->nd_cr;
struct dirent *dp;
struct nfsm_info info;
u_int32_t *tl;
char *cpos, *cend, *rbuf;
struct vnode *vp;
@@ -2448,13 +2434,9 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
int len, nlen, pad, xfer, error = 0, getret = 1;
int siz, cnt, fullsiz, eofflag, rdonly;
u_quad_t off, toff, verf;
int v3;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
@@ -2463,7 +2445,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
if (info.nmi_v3) {
if (v3) {
tl = (uint32_t *)nfsd_dissect(nfsd, 5 * NFSX_UNSIGNED, &error);
if (tl == NULL)
goto nfsmout;
@@ -2480,7 +2462,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
off = toff;
cnt = fxdr_unsigned(int, *tl);
if (cnt == 0) {
if (info.nmi_v3)
if (v3)
error = NFSERR_TOOSMALL;
else
error = EBADRPC;
@@ -2506,14 +2488,14 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = 0;
goto nfsmout;
}
if (info.nmi_v3)
if (v3)
error = getret = VOP_GETATTR(vp, &at, cred, procp);
if (!error)
error = nfsrv_access(vp, VEXEC, cred, rdonly, procp, 0);
if (error) {
vput(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3)) != 0)
NFSX_POSTOPATTR(v3)) != 0)
return 0;
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
error = 0;
@@ -2537,7 +2519,7 @@ again:
error = VOP_READDIR(vp, &io, cred, &eofflag);
off = (off_t)io.uio_offset;
if (info.nmi_v3) {
if (v3) {
getret = VOP_GETATTR(vp, &at, cred, procp);
if (!error)
error = getret;
@@ -2548,7 +2530,7 @@ again:
vrele(vp);
free(rbuf, M_TEMP, fullsiz);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3)) != 0)
NFSX_POSTOPATTR(v3)) != 0)
return 0;
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
error = 0;
@@ -2564,11 +2546,10 @@ again:
if (siz == 0) {
vrele(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3) +
NFSX_COOKIEVERF(info.nmi_v3) +
NFSX_POSTOPATTR(v3) + NFSX_COOKIEVERF(v3) +
2 * NFSX_UNSIGNED) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
tl = nfsm_build(&mb, 4 * NFSX_UNSIGNED);
txdr_hyper(at.va_filerev, tl);
@@ -2603,10 +2584,9 @@ again:
len = 3 * NFSX_UNSIGNED; /* paranoia, probably can be 0 */
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3) +
NFSX_COOKIEVERF(info.nmi_v3) + siz) != 0)
NFSX_POSTOPATTR(v3) + NFSX_COOKIEVERF(v3) + siz) != 0)
return 0;
if (info.nmi_v3) {
if (v3) {
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
tl = nfsm_build(&mb, 2 * NFSX_UNSIGNED);
txdr_hyper(at.va_filerev, tl);
@@ -2618,7 +2598,7 @@ again:
nlen = dp->d_namlen;
pad = nfsm_padlen(nlen);
len += (4 * NFSX_UNSIGNED + nlen + pad);
if (info.nmi_v3)
if (v3)
len += 2 * NFSX_UNSIGNED;
if (len > cnt) {
eofflag = 0;
@@ -2628,10 +2608,9 @@ again:
* Build the directory record xdr from
* the dirent entry.
*/
tl = nfsm_build(&mb,
(info.nmi_v3 ? 3 : 2) * NFSX_UNSIGNED);
tl = nfsm_build(&mb, (v3 ? 3 : 2) * NFSX_UNSIGNED);
*tl++ = nfs_true;
if (info.nmi_v3)
if (v3)
txdr_hyper(dp->d_fileno, tl);
else
*tl = txdr_unsigned((u_int32_t)dp->d_fileno);
@@ -2640,7 +2619,7 @@ again:
nfsm_strtombuf(&mb, dp->d_name, nlen);
/* Finish off the record */
if (info.nmi_v3) {
if (v3) {
tl = nfsm_build(&mb, 2*NFSX_UNSIGNED);
txdr_hyper(dp->d_off, tl);
} else {
@@ -2671,7 +2650,6 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *mb;
struct ucred *cred = &nfsd->nd_cr;
struct dirent *dp;
struct nfsm_info info;
u_int32_t *tl;
char *cpos, *cend, *rbuf;
struct vnode *vp, *nvp;
@@ -2686,13 +2664,6 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
int siz, cnt, fullsiz, eofflag, rdonly, dirlen;
u_quad_t off, toff, verf;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
else if (error != 0)
@@ -2941,7 +2912,6 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct ucred *cred = &nfsd->nd_cr;
struct vattr bfor, aft;
struct vnode *vp;
struct nfsm_info info;
struct timeval boottime;
nfsfh_t nfh;
fhandle_t *fhp;
@@ -2949,13 +2919,6 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
int error = 0, rdonly, for_ret = 1, aft_ret = 1, cnt;
u_quad_t off;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
else if (error != 0)
@@ -3016,7 +2979,6 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct ucred *cred = &nfsd->nd_cr;
struct statfs *sf;
struct nfs_statfs *sfp;
struct nfsm_info info;
int error = 0, rdonly, getret = 1;
struct vnode *vp;
struct vattr at;
@@ -3024,13 +2986,9 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhandle_t *fhp;
struct statfs statfs;
u_quad_t tval;
int v3;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
@@ -3039,7 +2997,6 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
info.nmi_dpos = nfsd->nd_dpos; /* resync */
error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly);
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
@@ -3054,16 +3011,16 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
getret = VOP_GETATTR(vp, &at, cred, procp);
vput(vp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
NFSX_POSTOPATTR(info.nmi_v3) + NFSX_STATFS(info.nmi_v3)) != 0)
NFSX_POSTOPATTR(v3) + NFSX_STATFS(v3)) != 0)
return 0;
if (info.nmi_v3)
if (v3)
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (error) {
error = 0;
goto nfsmout;
}
sfp = nfsm_build(&mb, NFSX_STATFS(info.nmi_v3));
if (info.nmi_v3) {
sfp = nfsm_build(&mb, NFSX_STATFS(v3));
if (v3) {
tval = (u_quad_t)sf->f_blocks;
tval *= (u_quad_t)sf->f_bsize;
txdr_hyper(tval, &sfp->sf_tbytes);
@@ -3100,7 +3057,6 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct mbuf *mb;
struct ucred *cred = &nfsd->nd_cr;
struct nfsm_info info;
struct nfsv3_fsinfo *sip;
int error = 0, rdonly, getret = 1, pref;
struct vnode *vp;
@@ -3108,13 +3064,6 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsfh_t nfh;
fhandle_t *fhp;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
else if (error != 0)
@@ -3122,7 +3071,6 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
info.nmi_dpos = nfsd->nd_dpos; /* resync */
error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly);
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
@@ -3177,7 +3125,6 @@ nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct mbuf *mb;
struct ucred *cred = &nfsd->nd_cr;
struct nfsm_info info;
struct nfsv3_pathconf *pc;
int error = 0, rdonly, getret = 1;
register_t linkmax, namemax, chownres, notrunc;
@@ -3186,13 +3133,6 @@ nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsfh_t nfh;
fhandle_t *fhp;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
return 0;
else if (error != 0)
@@ -3200,7 +3140,6 @@ nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
fhp = &nfh.fh_generic;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
goto nfsmout;
info.nmi_dpos = nfsd->nd_dpos; /* resync */
error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly);
if (error) {
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
@@ -3252,17 +3191,9 @@ int
nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct proc *procp, struct mbuf **mrq)
{
struct nfsm_info info;
struct mbuf *mb;
int error = NFSERR_RETVOID;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 0) != 0)
return 0;
return (0);
@@ -3275,17 +3206,9 @@ int
nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct proc *procp, struct mbuf **mrq)
{
struct nfsm_info info;
struct mbuf *mb;
int error;
info.nmi_mreq = NULL;
info.nmi_mrep = nfsd->nd_mrep;
info.nmi_md = nfsd->nd_md;
info.nmi_dpos = nfsd->nd_dpos;
info.nmi_v3 = (nfsd->nd_flag & ND_NFSV3);
info.nmi_errorp = &error;
if (nfsd->nd_repstat)
error = nfsd->nd_repstat;
else