nfsd
TAILQ_ENTRY(nfsd) nfsd_chain; /* List of all nfsd's */
extern TAILQ_HEAD(nfsdhead, nfsd) nfsd_head;
struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
m_freem(nfsd->nd_mrep);
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
nfsd->nd_mrep = NULL;
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &dirp, procp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
error = nfsm_srvsattr(nfsd, &va);
cp = (caddr_t)nfsd_dissect(nfsd, NFSX_V3CREATEVERF, &error);
sp = (struct nfsv2_sattr *)nfsd_dissect(nfsd, NFSX_V2SATTR, &error);
nfsm_srvmtofh1(struct nfsrv_descript *nfsd,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
if (nfsd->nd_flag & ND_NFSV3) {
uint32_t *tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
return nfsm_reply(nfsd, slp, mrq, mb,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
nfsm_srvfattr(nfsd, &va, fp);
nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
nfsm_srvmtofh2(struct nfsrv_descript *nfsd, fhandle_t *fhp, int *errorp)
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
uint32_t *tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_V3FH, errorp);
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md, &nfsd->nd_dpos, &dirp, procp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
error = nfsm_srvsattr(nfsd, &va);
if ((nfsd->nd_flag & ND_NFSV3) == 0) {
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
if (nfsd_adv(nfsd, NFSX_V2FH - NFSX_V3FH, errorp) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft, &mb);
nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
struct mbuf *nam = nfsd->nd_nam;
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md, &nfsd->nd_dpos, &dirp, procp);
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_reply(nfsd, slp, mrq, &mb, error, NFSX_WCCDATA(v3)) != 0)
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, ffhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
error = nfs_namei(&fromnd, ffhp, len, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &fdirp, procp);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft,
nfsm_srvwcc(nfsd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft,
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0) {
if (nfsm_srvmtofh2(nfsd, tfhp, &error) != 0)
if (nfsd_strsiz(nfsd, &len2, NFS_MAXNAMLEN, &error) != 0)
error = nfs_namei(&tond, tfhp, len2, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &tdirp, procp);
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 2 * NFSX_WCCDATA(v3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft,
nfsm_srvwcc(nfsd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft,
nfsm_srvpostop_attr(nfsd, 1, NULL, &mb);
nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, dfhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
error = nfs_namei(&nd, dfhp, len, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &dirp, procp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &dirp, procp);
error = nfsm_srvsattr(nfsd, &va);
if (nfsd_strsiz(nfsd, &len2, NFS_MAXPATHLEN, &error) != 0)
if (nfsd_mtouio(nfsd, &io, len2, &error) != 0)
sp = (struct nfsv2_sattr *)nfsd_dissect(nfsd, NFSX_V2SATTR, &error);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
nfsm_srvpostop_attr(nfsd, getret, &va, &mb);
nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &dirp, procp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
error = nfsm_srvsattr(nfsd, &va);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsm_srvfattr(nfsd, &va, fp);
nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
struct mbuf *nam = nfsd->nd_nam;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
struct ucred *cred = &nfsd->nd_cr;
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md,
&nfsd->nd_dpos, &dirp, procp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
if (nfsm_reply(nfsd, slp, mrq, &mb, error, NFSX_WCCDATA(v3)) != 0)
nfsm_srvwcc(nfsd, dirfor_ret, &dirfor, diraft_ret, &diraft,
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
tl = (uint32_t *)nfsd_dissect(nfsd, 5 * NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
xfer = NFS_SRVMAXDATA(nfsd);
if (nfsm_reply(nfsd, slp, mrq, &mb,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
NFSX_FATTR(nfsd->nd_flag & ND_NFSV3)) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
fp = nfsm_build(&mb, NFSX_FATTR(nfsd->nd_flag & ND_NFSV3));
nfsm_srvfattr(nfsd, &va, fp);
nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
tl = (uint32_t *)nfsd_dissect(nfsd, 6 * NFSX_UNSIGNED, &error);
xfer = NFS_SRVMAXDATA(nfsd);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
struct mbuf *nam = nfsd->nd_nam;
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_reply(nfsd, slp, mrq, &mb, error, cnt) != 0)
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
nfsm_srvfattr(nfsd, vap, fp);
v3 = (nfsd->nd_flag & ND_NFSV3);
nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
tl = (uint32_t *)nfsd_dissect(nfsd, 3 * NFSX_UNSIGNED, &error);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, for_ret, &bfor, aft_ret, &aft, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, for_ret, &bfor, aft_ret, &aft, &mb);
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
error = nfsm_srvsattr(nfsd, &va);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED,
nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &at, &mb);
sp = (struct nfsv2_sattr *)nfsd_dissect(nfsd, NFSX_V2SATTR,
nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 0) != 0)
nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
if (nfsd->nd_repstat)
error = nfsd->nd_repstat;
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 0) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, preat_ret, &preat, postat_ret, &va, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, preat_ret, &preat, postat_ret, &va,
if (nfsm_reply(nfsd, slp, mrq, &mb, error, NFSX_WCCORFATTR(v3)) != 0)
nfsm_srvwcc(nfsd, preat_ret, &preat, postat_ret, &va,
nfsm_srvfattr(nfsd, &va, fp);
nfsm_srvnamesiz(struct nfsrv_descript *nfsd, int *lenp, int *errorp)
uint32_t *tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, errorp);
nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
int v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_srvnamesiz(nfsd, &len, &error) != 0)
(void)nfsm_reply(nfsd, slp, mrq, &mb, error, 0);
error = nfs_namei(&nd, fhp, len, slp, nam, &nfsd->nd_md, &nfsd->nd_dpos, &dirp, procp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, dirattr_ret, &dirattr, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, dirattr_ret, &dirattr, &mb);
nfsm_srvpostop_attr(nfsd, 0, &va, &mb);
nfsm_srvpostop_attr(nfsd, dirattr_ret, &dirattr, &mb);
nfsm_srvfattr(nfsd, &va, fp);
nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, 1, NULL, &mb);
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvpostop_attr(nfsd, getret, &attr, &mb);
nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
if (reqlen > (NFS_SRVMAXDATA(nfsd)) || reqlen <= 0) {
if (nfsm_reply(nfsd, slp, mrq, &mb,
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvfattr(nfsd, &va, fp);
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 0) != 0)
nfsm_srvpostop_attr(nfsd, getret, &va, &mb);
nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
v3 = (nfsd->nd_flag & ND_NFSV3);
if (nfsd->nd_mrep == NULL) {
if (nfsm_srvmtofh1(nfsd, slp, mrq, &mb, &error) != 0)
if (nfsm_srvmtofh2(nfsd, fhp, &error) != 0)
tl = (uint32_t *)nfsd_dissect(nfsd, 5 * NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, 4 * NFSX_UNSIGNED, &error);
mp = nfsd->nd_mrep;
if (mp == nfsd->nd_md) {
adjust = nfsd->nd_dpos - mtod(mp, caddr_t);
nfsm_reply(struct nfsrv_descript *nfsd,
mp = nfsd->nd_mrep;
if (nfsm_reply(nfsd, slp, mrq, &mb, error,
nfsm_srvwcc(nfsd, forat_ret, &forat, aftat_ret, &va, &mb);
int v3 = nfsd->nd_flag & ND_NFSV3;
nfsm_srvfattr(nfsd, &va, fp);
nfsd->nd_repstat = error;
if (nfsm_reply(nfsd, slp, mrq, &mb, error, 0) != 0)
nfsm_srvwcc(nfsd, forat_ret, &forat, aftat_ret, &va, &mb);
nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
struct mbuf *nam = nfsd->nd_nam;
struct ucred *cred = &nfsd->nd_cr;
(void)nfs_rephead(statuslen, nfsd, slp, error,
nfs_getreq(struct nfsrv_descript *nd, struct nfsd *nfsd, int has_header)
nfsrv_dorec(struct nfssvc_sock *slp, struct nfsd *nfsd,
error = nfs_getreq(nd, nfsd, 1);
nfsd->nfsd_nd = nd;
struct nfsd *nfsd;
TAILQ_FOREACH(nfsd, &nfsd_head, nfsd_chain) {
if (nfsd->nfsd_flag & NFSD_WAITING) {
nfsd->nfsd_flag &= ~NFSD_WAITING;
if (nfsd->nfsd_slp)
nfsd->nfsd_slp = slp;
wakeup_one(nfsd);
nfsm_srvwcc(struct nfsrv_descript *nfsd, int before_ret,
nfsm_srvpostop_attr(nfsd, after_ret, after_vap, mb);
nfsm_srvpostop_attr(struct nfsrv_descript *nfsd, int after_ret,
nfsm_srvfattr(nfsd, after_vap, fp);
nfsm_srvfattr(struct nfsrv_descript *nfsd, struct vattr *vap,
if (nfsd->nd_flag & ND_NFSV3) {
nfsm_srvsattr(struct nfsrv_descript *nfsd, struct vattr *va)
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, &error);
tl = (uint32_t *)nfsd_dissect(nfsd, 2 * NFSX_UNSIGNED, &error);
int nfssvc_nfsd(struct nfsd *);
struct nfsd *nfsd;
nfsd = malloc(sizeof(*nfsd), M_NFSD, M_WAITOK|M_ZERO);
nfsd->nfsd_procp = p;
nfsd->nfsd_slp = NULL;
error = nfssvc_nfsd(nfsd);
nfssvc_nfsd(struct nfsd *nfsd)
TAILQ_INSERT_TAIL(&nfsd_head, nfsd, nfsd_chain);
if (!ISSET(nfsd->nfsd_flag, NFSD_REQINPROG)) {
error = nfsrv_getslp(nfsd);
slp = nfsd->nfsd_slp;
error = nfsrv_dorec(slp, nfsd, &nd);
SET(nfsd->nfsd_flag, NFSD_REQINPROG);
slp = nfsd->nfsd_slp;
nfsd->nfsd_slp = NULL;
CLR(nfsd->nfsd_flag, NFSD_REQINPROG);
error = (*(nfsrv3_procs[nd->nd_procnum]))(nd, slp, nfsd->nfsd_procp, &mreq);
if (nfsrv_dorec(slp, nfsd, &nd)) {
nfsd->nfsd_flag &= ~NFSD_REQINPROG;
nfsd->nfsd_slp = NULL;
TAILQ_REMOVE(&nfsd_head, nfsd, nfsd_chain);
free(nfsd, M_NFSD, sizeof(*nfsd));
nfsrv_getslp(struct nfsd *nfsd)
while (nfsd->nfsd_slp == NULL &&
nfsd->nfsd_flag |= NFSD_WAITING;
error = tsleep_nsec(nfsd, PSOCK | PCATCH, "nfsd", INFSLP);
if (nfsd->nfsd_slp == NULL &&
nfsd->nfsd_slp = slp;
int nfsrv_getslp(struct nfsd *nfsd);
if (nfsd->nfsd_slp == NULL)
int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *,
nfsd_adv(struct nfsrv_descript *nfsd, int s, int *errorp)
avail = mtod(nfsd->nd_md, caddr_t) + nfsd->nd_md->m_len -
nfsd->nd_dpos;
nfsd->nd_dpos += s;
error = nfs_adv(&nfsd->nd_md, &nfsd->nd_dpos, s, avail);
m_freem(nfsd->nd_mrep);
nfsd->nd_mrep = NULL;
nfsd_strsiz(struct nfsrv_descript *nfsd, int *lenp, int maxlen, int *errorp)
uint32_t *tl = (uint32_t *)nfsd_dissect(nfsd, NFSX_UNSIGNED, errorp);
m_freem(nfsd->nd_mrep);
nfsd->nd_mrep = NULL;
nfsd_mtouio(struct nfsrv_descript *nfsd, struct uio *uiop, int len, int *errorp)
error = nfsm_mbuftouio(&nfsd->nd_md, uiop, len, &nfsd->nd_dpos);
m_freem(nfsd->nd_mrep);
nfsd->nd_mrep = NULL;
nfsd_dissect(struct nfsrv_descript *nfsd, int s, int *errorp)
avail = mtod(nfsd->nd_md, caddr_t) + nfsd->nd_md->m_len -
nfsd->nd_dpos;
ret = nfsd->nd_dpos;
nfsd->nd_dpos += s;
error = nfsm_disct(&nfsd->nd_md, &nfsd->nd_dpos, s, avail, &ret);
m_freem(nfsd->nd_mrep);
nfsd->nd_mrep = NULL;