Lines Matching +full:2 +full:nd

15  * 2. Redistributions in binary form must reproduce the above copyright
40 * nfs version 2, 3 and 4 server calls to vnode ops
43 * 2 - do the vnode ops for the request, usually by calling a nfsvno_XXX()
78 "Enable Linux style NFSv4.2 server (non-RFC compliant)");
99 "Enable NFSv4.2 Allocate operation");
115 static void nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
121 static void nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
131 nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
141 if (nd->nd_repstat) {
142 nfsrv_postopattr(nd, 1, &nva);
147 if ((nd->nd_flag & ND_NFSV4) &&
152 nd->nd_repstat = NFSERR_INVAL;
158 if (nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p,
164 if (nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp, p,
170 if (nfsvno_accchk(vp, VWRITE | VAPPEND, nd->nd_cred, exp, p,
176 if (nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p,
182 if (nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp, p,
188 if (nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p,
198 if (nfsvno_accchk(vp, deletebit, nd->nd_cred, exp, p,
208 if (nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p,
213 if (nd->nd_flag & ND_NFSV3) {
214 getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
215 nfsrv_postopattr(nd, getret, &nva);
218 if (nd->nd_flag & ND_NFSV4) {
219 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
226 NFSEXITCODE2(0, nd);
230 NFSEXITCODE2(error, nd);
238 nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
253 if (nd->nd_repstat)
255 if (nd->nd_flag & ND_NFSV4) {
256 error = nfsrv_getattrbits(nd, &attrbits, NULL, NULL);
267 (void) nfsrv_putreferralattr(nd, &attrbits, refp, 1,
268 &nd->nd_repstat);
272 if (nd->nd_repstat == 0) {
293 nd->nd_repstat = nfsvno_accchk(vp, accmode,
294 nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
298 if (!nd->nd_repstat)
299 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, &attrbits);
300 if (!nd->nd_repstat) {
301 if (nd->nd_flag & ND_NFSV4) {
303 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
304 if (!nd->nd_repstat)
305 nd->nd_repstat = nfsrv_checkgetattr(nd, vp,
307 if (nd->nd_repstat == 0) {
322 if ((nd->nd_repstat =
324 nd->nd_repstat = VOP_GETATTR(
325 tvp, &va, nd->nd_cred);
329 if (nd->nd_repstat == 0)
335 if (nd->nd_repstat == 0)
336 nd->nd_repstat = vfs_busy(mp, 0);
338 if (nd->nd_repstat == 0) {
339 (void)nfsvno_fillattr(nd, mp, vp, &nva,
340 &fh, 0, &attrbits, nd->nd_cred, p,
349 nfsrv_fillattr(nd, &nva);
357 NFSEXITCODE2(error, nd);
365 nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
379 if (nd->nd_repstat) {
380 nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
389 if (nd->nd_flag & ND_NFSV4) {
394 stateid.other[2] = *tl;
397 stateid.other[2] == 0x55555555 &&
401 error = nfsrv_sattr(nd, vp, &nva, &attrbits, aclp, p);
407 preat_ret = nfsvno_getattr(vp, &nva2, nd, p, 1, &retbits);
408 if (!nd->nd_repstat)
409 nd->nd_repstat = preat_ret;
412 if (nd->nd_flag & ND_NFSV3) {
416 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
419 if (!nd->nd_repstat && gcheck &&
422 nd->nd_repstat = NFSERR_NOT_SYNC;
423 if (nd->nd_repstat) {
428 nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
431 } else if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
432 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
439 if (!nd->nd_repstat) {
443 nd->nd_repstat = EROFS;
446 nd->nd_repstat = EINVAL;
447 else if (nva2.na_uid != nd->nd_cred->cr_uid ||
449 nd->nd_repstat = nfsvno_accchk(vp,
450 VWRITE, nd->nd_cred, exp, p,
459 if (nd->nd_repstat == 0 && (nd->nd_flag & ND_NFSV4) != 0 &&
461 nd->nd_repstat = nfsrv_checksetattr(vp, nd, &stateid,
464 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
474 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
476 if (!nd->nd_repstat) {
483 if (!nd->nd_repstat &&
487 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
489 if (!nd->nd_repstat)
492 if (!nd->nd_repstat &&
502 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
504 if (!nd->nd_repstat) {
511 if (!nd->nd_repstat &&
515 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
517 if (!nd->nd_repstat)
520 if (!nd->nd_repstat &&
525 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
527 if (!nd->nd_repstat) {
536 if (!nd->nd_repstat && aclp->acl_cnt > 0 &&
538 nd->nd_repstat = nfsrv_setacl(vp, aclp, nd->nd_cred, p);
539 if (!nd->nd_repstat)
543 } else if (!nd->nd_repstat) {
544 nd->nd_repstat = nfsvno_setattr(vp, &nva, nd->nd_cred, p,
547 if (nd->nd_flag & (ND_NFSV2 | ND_NFSV3)) {
548 postat_ret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
549 if (!nd->nd_repstat)
550 nd->nd_repstat = postat_ret;
556 if (nd->nd_flag & ND_NFSV3)
557 nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
558 else if (nd->nd_flag & ND_NFSV4)
559 (void) nfsrv_putattrbit(nd, &retbits);
560 else if (!nd->nd_repstat)
561 nfsrv_fillattr(nd, &nva);
564 NFSEXITCODE2(0, nd);
571 if (nd->nd_flag & ND_NFSV4) {
577 (void) nfsrv_putattrbit(nd, &retbits);
579 NFSEXITCODE2(error, nd);
588 nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
599 if (nd->nd_repstat) {
600 nfsrv_postopattr(nd, dattr_ret, &dattr);
608 if (dp->v_type == VLNK && (nd->nd_flag & ND_NFSV4)) {
609 nd->nd_repstat = NFSERR_SYMLINK;
614 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
617 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
623 if (!nd->nd_repstat) {
624 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, &dirp);
629 if (nd->nd_repstat) {
631 if (nd->nd_flag & ND_NFSV3)
632 dattr_ret = nfsvno_getattr(dirp, &dattr, nd, p,
636 if (nd->nd_flag & ND_NFSV3)
637 nfsrv_postopattr(nd, dattr_ret, &dattr);
642 if ((nd->nd_flag & ND_NFSV4) != 0 && !NFSVNO_EXPORTED(exp) &&
648 nd->nd_repstat = ENOENT;
649 if (nd->nd_repstat == 0) {
650 nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
655 if (nd->nd_repstat == EOPNOTSUPP)
656 nd->nd_repstat = ENOENT;
658 if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
659 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
660 if (vpp != NULL && nd->nd_repstat == 0)
665 if (nd->nd_flag & ND_NFSV3)
666 dattr_ret = nfsvno_getattr(dirp, &dattr, nd, p, 0,
670 if (nd->nd_repstat) {
671 if (nd->nd_flag & ND_NFSV3)
672 nfsrv_postopattr(nd, dattr_ret, &dattr);
675 if (nd->nd_flag & ND_NFSV2) {
676 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)fhp, 0, 0);
677 nfsrv_fillattr(nd, &nva);
678 } else if (nd->nd_flag & ND_NFSV3) {
679 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)fhp, 0, 0);
680 nfsrv_postopattr(nd, 0, &nva);
681 nfsrv_postopattr(nd, dattr_ret, &dattr);
685 NFSEXITCODE2(error, nd);
693 nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
703 if (nd->nd_repstat) {
704 nfsrv_postopattr(nd, getret, &nva);
708 if (nd->nd_flag & ND_NFSV2)
709 nd->nd_repstat = ENXIO;
711 nd->nd_repstat = EINVAL;
713 if (nd->nd_repstat == 0) {
714 if ((nd->nd_flag & ND_EXTPG) != 0)
715 nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred,
716 nd->nd_maxextsiz, p, &mp, &mpend, &len);
718 nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred,
721 if (nd->nd_flag & ND_NFSV3)
722 getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
724 if (nd->nd_flag & ND_NFSV3)
725 nfsrv_postopattr(nd, getret, &nva);
726 if (nd->nd_repstat)
731 nd->nd_mb->m_next = mp;
732 nd->nd_mb = mpend;
734 nd->nd_bextpg = mpend->m_epg_npgs - 1;
735 nd->nd_bpos = (char *)(void *)
736 PHYS_TO_DMAP(mpend->m_epg_pa[nd->nd_bextpg]);
737 off = (nd->nd_bextpg == 0) ? mpend->m_epg_1st_off : 0;
738 nd->nd_bpos += off + mpend->m_epg_last_len;
739 nd->nd_bextpgsiz = PAGE_SIZE - mpend->m_epg_last_len -
742 nd->nd_bpos = mtod(mpend, char *) + mpend->m_len;
746 NFSEXITCODE2(0, nd);
754 nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
769 if (nd->nd_repstat) {
770 nfsrv_postopattr(nd, getret, &nva);
773 if (nd->nd_flag & ND_NFSV2) {
774 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
777 } else if (nd->nd_flag & ND_NFSV3) {
780 tl += 2;
786 if (reqlen > NFS_SRVMAXDATA(nd)) {
787 reqlen = NFS_SRVMAXDATA(nd);
793 if (nd->nd_flag & ND_NFSV4) {
798 stp->ls_uid = nd->nd_cred->cr_uid;
802 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
803 if ((nd->nd_flag & ND_NFSV41) != 0)
804 clientid.qval = nd->nd_clientid.qval;
805 else if (nd->nd_clientid.qval != clientid.qval)
808 if ((nd->nd_flag & ND_NFSV41) != 0)
810 nd->nd_flag |= ND_IMPLIEDCLID;
811 nd->nd_clientid.qval = clientid.qval;
813 stp->ls_stateid.other[2] = *tl++;
817 if ((nd->nd_flag & ND_DSSERVER) != 0 &&
820 stp->ls_stateid.other[2] == 0x0) ||
823 stp->ls_stateid.other[2] == 0xffffffff) ||
825 nd->nd_repstat = NFSERR_BADSTATEID;
830 stp->ls_stateid.other[2] == 0x55555555)
834 tl += 2;
843 if (nd->nd_flag & ND_NFSV3)
844 nd->nd_repstat = EINVAL;
846 nd->nd_repstat = (vp->v_type == VDIR) ? EISDIR :
849 getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
850 if (!nd->nd_repstat)
851 nd->nd_repstat = getret;
852 if (!nd->nd_repstat &&
853 (nva.na_uid != nd->nd_cred->cr_uid ||
855 nd->nd_repstat = nfsvno_accchk(vp, VREAD,
856 nd->nd_cred, exp, p,
858 if (nd->nd_repstat)
859 nd->nd_repstat = nfsvno_accchk(vp, VEXEC,
860 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
867 if (nd->nd_repstat == 0 && (nd->nd_flag & (ND_NFSV4 | ND_DSSERVER)) ==
869 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
870 &stateid, exp, nd, p);
871 if (nd->nd_repstat) {
873 if (nd->nd_flag & ND_NFSV3)
874 nfsrv_postopattr(nd, getret, &nva);
896 if ((nd->nd_flag & ND_EXTPG) != 0 || (cnt > MCLBYTES &&
897 (nd->nd_flag & (ND_TLS | ND_SAVEREPLY)) == ND_TLS &&
898 (nd->nd_flag & (ND_NFSV4 | ND_NFSV41)) != ND_NFSV4))
899 nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred,
900 nd->nd_maxextsiz, p, &m3, &m2);
902 nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred,
904 if (!(nd->nd_flag & ND_NFSV4)) {
905 getret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
906 if (!nd->nd_repstat)
907 nd->nd_repstat = getret;
909 if (nd->nd_repstat) {
913 if (nd->nd_flag & ND_NFSV3)
914 nfsrv_postopattr(nd, getret, &nva);
919 if (nd->nd_flag & ND_NFSV2) {
920 nfsrv_fillattr(nd, &nva);
923 if (nd->nd_flag & ND_NFSV3) {
924 nfsrv_postopattr(nd, getret, &nva);
928 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
936 nd->nd_mb->m_next = m3;
937 nd->nd_mb = m2;
939 nd->nd_flag |= ND_EXTPG;
940 nd->nd_bextpg = m2->m_epg_npgs - 1;
941 nd->nd_bpos = (char *)(void *)
942 PHYS_TO_DMAP(m2->m_epg_pa[nd->nd_bextpg]);
943 poff = (nd->nd_bextpg == 0) ? m2->m_epg_1st_off : 0;
944 nd->nd_bpos += poff + m2->m_epg_last_len;
945 nd->nd_bextpgsiz = PAGE_SIZE - m2->m_epg_last_len -
948 nd->nd_bpos = mtod(m2, char *) + m2->m_len;
952 NFSEXITCODE2(0, nd);
956 NFSEXITCODE2(error, nd);
964 nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
979 if (nd->nd_repstat) {
980 nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
984 if (nd->nd_flag & ND_NFSV2) {
987 tl += 2;
989 } else if (nd->nd_flag & ND_NFSV3) {
1001 stp->ls_uid = nd->nd_cred->cr_uid;
1005 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
1006 if ((nd->nd_flag & ND_NFSV41) != 0)
1007 clientid.qval = nd->nd_clientid.qval;
1008 else if (nd->nd_clientid.qval != clientid.qval)
1011 if ((nd->nd_flag & ND_NFSV41) != 0)
1013 nd->nd_flag |= ND_IMPLIEDCLID;
1014 nd->nd_clientid.qval = clientid.qval;
1016 stp->ls_stateid.other[2] = *tl++;
1020 if ((nd->nd_flag & ND_DSSERVER) != 0 &&
1023 stp->ls_stateid.other[2] == 0x0) ||
1026 stp->ls_stateid.other[2] == 0xffffffff) ||
1028 nd->nd_repstat = NFSERR_BADSTATEID;
1033 stp->ls_stateid.other[2] == 0x55555555)
1037 tl += 2;
1050 nd->nd_repstat = EIO;
1051 if (vp->v_type != VREG && !nd->nd_repstat) {
1052 if (nd->nd_flag & ND_NFSV3)
1053 nd->nd_repstat = EINVAL;
1055 nd->nd_repstat = (vp->v_type == VDIR) ? EISDIR :
1060 forat_ret = nfsvno_getattr(vp, &forat, nd, p, 1, &attrbits);
1061 if (!nd->nd_repstat)
1062 nd->nd_repstat = forat_ret;
1063 if (!nd->nd_repstat &&
1064 (forat.na_uid != nd->nd_cred->cr_uid ||
1066 nd->nd_repstat = nfsvno_accchk(vp, VWRITE,
1067 nd->nd_cred, exp, p,
1073 if (nd->nd_repstat == 0 && (nd->nd_flag & (ND_NFSV4 | ND_DSSERVER)) ==
1075 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
1076 &stateid, exp, nd, p);
1077 if (nd->nd_repstat) {
1079 if (nd->nd_flag & ND_NFSV3)
1080 nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
1085 * For NFS Version 2, it is not obvious what a write of zero length
1090 nd->nd_repstat = nfsvno_write(vp, off, retlen, &stable,
1091 nd->nd_md, nd->nd_dpos, nd->nd_cred, p);
1092 error = nfsm_advance(nd, NFSM_RNDUP(retlen), -1);
1096 if (nd->nd_flag & ND_NFSV4)
1099 aftat_ret = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
1101 if (!nd->nd_repstat)
1102 nd->nd_repstat = aftat_ret;
1103 if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) {
1104 if (nd->nd_flag & ND_NFSV3)
1105 nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
1106 if (nd->nd_repstat)
1127 } else if (!nd->nd_repstat)
1128 nfsrv_fillattr(nd, &nva);
1131 NFSEXITCODE2(0, nd);
1135 NFSEXITCODE2(error, nd);
1146 nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
1161 int32_t cverf[2], tverf[2] = { 0, 0 };
1164 if (nd->nd_repstat) {
1165 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1168 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
1171 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1174 if (!nd->nd_repstat) {
1176 if (nd->nd_flag & ND_NFSV2) {
1205 error = nfsrv_sattr(nd, NULL, &nva, NULL, NULL, p);
1219 if (nd->nd_repstat) {
1221 if (nd->nd_flag & ND_NFSV3) {
1222 dirfor_ret = nfsvno_getattr(dp, &dirfor, nd, p, 1,
1224 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1231 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, &dirp);
1233 if (nd->nd_flag & ND_NFSV2) {
1237 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
1241 if (nd->nd_repstat) {
1242 if (nd->nd_flag & ND_NFSV3)
1243 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1250 if (!(nd->nd_flag & ND_NFSV2)) {
1254 nd->nd_repstat = EEXIST;
1270 nd->nd_repstat = nfsvno_createsub(nd, &named, &vp, &nva,
1273 if (!nd->nd_repstat) {
1274 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
1275 if (!nd->nd_repstat)
1276 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1,
1279 if (!nd->nd_repstat) {
1284 if (nd->nd_flag & ND_NFSV2) {
1285 if (!nd->nd_repstat) {
1286 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)&fh, 0, 0);
1287 nfsrv_fillattr(nd, &nva);
1290 if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0]
1292 nd->nd_repstat = EEXIST;
1293 diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
1295 if (!nd->nd_repstat) {
1296 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)&fh, 0, 1);
1297 nfsrv_postopattr(nd, 0, &nva);
1299 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1303 NFSEXITCODE2(0, nd);
1308 NFSEXITCODE2(error, nd);
1316 nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
1335 if (nd->nd_repstat) {
1336 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1347 if (nd->nd_flag & ND_NFSV4) {
1353 error = nfsvno_getsymlink(nd, &nva, p, &pathcp,
1360 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
1372 nd->nd_repstat = NFSERR_BADTYPE;
1380 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, cnflags | NOCACHE);
1382 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1385 if (!nd->nd_repstat) {
1386 if (nd->nd_flag & ND_NFSV3) {
1390 error = nfsrv_sattr(nd, NULL, &nva, &attrbits, aclp, p);
1394 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV3) &&
1396 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
1403 dirfor_ret = nfsvno_getattr(dp, &dirfor, nd, p, 0, NULL);
1404 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
1408 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
1410 if (nd->nd_repstat) {
1418 if (nd->nd_flag & ND_NFSV3)
1419 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1437 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, &dirp);
1438 if (nd->nd_repstat) {
1440 if (nd->nd_flag & ND_NFSV3)
1441 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd,
1448 if (nd->nd_flag & ND_NFSV3)
1449 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1454 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0, NULL);
1456 if ((nd->nd_flag & ND_NFSV4) && (vtyp == VDIR || vtyp == VLNK)) {
1458 nfsrvd_mkdirsub(nd, &named, &nva, fhp, vpp, dirp,
1466 nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
1477 nd->nd_repstat = nfsvno_mknod(&named, &nva, nd->nd_cred, p);
1478 if (!nd->nd_repstat) {
1480 nfsrv_fixattr(nd, vp, &nva, aclp, p, &attrbits, exp);
1481 nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
1482 if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat)
1483 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1,
1485 if (vpp != NULL && nd->nd_repstat == 0) {
1492 diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
1494 if (!nd->nd_repstat) {
1495 if (nd->nd_flag & ND_NFSV3) {
1496 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)fhp, 0, 1);
1497 nfsrv_postopattr(nd, 0, &nva);
1502 tl += 2;
1504 (void) nfsrv_putattrbit(nd, &attrbits);
1507 if (nd->nd_flag & ND_NFSV3)
1508 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1514 NFSEXITCODE2(0, nd);
1526 NFSEXITCODE2(error, nd);
1534 nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
1546 if (nd->nd_repstat) {
1547 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1550 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, DELETE,
1553 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1559 if (!nd->nd_repstat) {
1560 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, &dirp);
1566 if (!(nd->nd_flag & ND_NFSV2)) {
1567 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
1574 if (!nd->nd_repstat) {
1575 if (nd->nd_flag & ND_NFSV4) {
1577 nd->nd_repstat = nfsvno_rmdirsub(&named, 1,
1578 nd->nd_cred, p, exp);
1580 nd->nd_repstat = nfsvno_removesub(&named, 1,
1581 nd->nd_cred, p, exp);
1582 } else if (nd->nd_procnum == NFSPROC_RMDIR) {
1583 nd->nd_repstat = nfsvno_rmdirsub(&named, 0,
1584 nd->nd_cred, p, exp);
1586 nd->nd_repstat = nfsvno_removesub(&named, 0,
1587 nd->nd_cred, p, exp);
1590 if (!(nd->nd_flag & ND_NFSV2)) {
1592 diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0,
1596 if (nd->nd_flag & ND_NFSV3) {
1597 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1599 } else if (!nd->nd_repstat) {
1603 tl += 2;
1609 NFSEXITCODE2(error, nd);
1617 nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
1633 if (nd->nd_repstat) {
1634 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1635 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1638 if (!(nd->nd_flag & ND_NFSV2))
1639 fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd, p, 1, NULL);
1642 NFSNAMEICNDSET(&fromnd.ni_cnd, nd->nd_cred, DELETE, WANTPARENT);
1644 error = nfsrv_parsename(nd, bufp, hashp, &fromnd.ni_pathlen);
1657 if (nd->nd_flag & ND_NFSV4) {
1663 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 0,
1666 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 1,
1672 error = nfsrv_mtofh(nd, &tfh);
1688 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 1,
1693 nd->nd_cred->cr_uid = nd->nd_saveduid;
1694 nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL,
1697 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd,
1703 NFSNAMEICNDSET(&tond.ni_cnd, nd->nd_cred, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE);
1705 if (!nd->nd_repstat) {
1706 error = nfsrv_parsename(nd, tbufp, hashp, &tond.ni_pathlen);
1716 if (nd->nd_repstat) {
1717 if (nd->nd_flag & ND_NFSV3) {
1718 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret,
1720 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret,
1734 nd->nd_repstat = nfsvno_namei(nd, &fromnd, dp, 0, exp, &fdirp);
1735 if (nd->nd_repstat) {
1736 if (nd->nd_flag & ND_NFSV3) {
1737 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret,
1739 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret,
1751 nd->nd_repstat = nfsvno_namei(nd, &tond, tdp, 0, &tnes, &tdirp);
1752 nd->nd_repstat = nfsvno_rename(&fromnd, &tond, nd->nd_repstat,
1753 nd->nd_flag, nd->nd_cred, p);
1755 fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd, p, 0, NULL);
1757 tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd, p, 0, NULL);
1762 if (nd->nd_flag & ND_NFSV3) {
1763 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1764 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1765 } else if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
1769 tl += 2;
1771 tl += 2;
1774 tl += 2;
1779 NFSEXITCODE2(error, nd);
1787 nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
1802 if (nd->nd_repstat) {
1803 nfsrv_postopattr(nd, getret, &at);
1804 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1809 if (nd->nd_flag & ND_NFSV4)
1810 nd->nd_repstat = NFSERR_ISDIR;
1812 nd->nd_repstat = NFSERR_INVAL;
1816 if (!nd->nd_repstat) {
1817 if (nd->nd_flag & ND_NFSV4) {
1821 error = nfsrv_mtofh(nd, &dfh);
1827 nfsd_fhtovp(nd, &dfh, LK_EXCLUSIVE, &dp, &tnes, NULL,
1833 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, LOCKPARENT | NOCACHE);
1834 if (!nd->nd_repstat) {
1836 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1844 if (!nd->nd_repstat) {
1845 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, &tnes,
1854 if (nd->nd_flag & ND_NFSV2) {
1858 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
1862 if (!nd->nd_repstat) {
1864 if ((nd->nd_flag & (ND_IMPLIEDCLID | ND_NFSV41)) ==
1866 clientid.qval = nd->nd_clientid.qval;
1867 nd->nd_repstat = nfsvno_link(&named, vp, clientid, nd->nd_cred,
1870 if (nd->nd_flag & ND_NFSV3)
1871 getret = nfsvno_getattr(vp, &at, nd, p, 0, NULL);
1873 diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
1877 if (nd->nd_flag & ND_NFSV3) {
1878 nfsrv_postopattr(nd, getret, &at);
1879 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1880 } else if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
1884 tl += 2;
1889 NFSEXITCODE2(error, nd);
1897 nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
1908 if (nd->nd_repstat) {
1909 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1915 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
1918 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1919 if (!error && !nd->nd_repstat)
1920 error = nfsvno_getsymlink(nd, &nva, p, &pathcp, &pathlen);
1926 if (!nd->nd_repstat) {
1927 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, &dirp);
1932 if (dirp != NULL && !(nd->nd_flag & ND_NFSV3)) {
1941 if (!nd->nd_repstat) {
1943 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
1945 nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
1949 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0, NULL);
1955 if (nd->nd_flag & ND_NFSV3) {
1956 if (!nd->nd_repstat) {
1957 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)fhp, 0, 1);
1958 nfsrv_postopattr(nd, 0, &nva);
1960 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1964 NFSEXITCODE2(error, nd);
1972 nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
1981 nd->nd_repstat = nfsvno_symlink(ndp, nvap, pathcp, pathlen,
1982 !(nd->nd_flag & ND_NFSV2), nd->nd_saveduid, nd->nd_cred, p, exp);
1983 if (!nd->nd_repstat && !(nd->nd_flag & ND_NFSV2)) {
1984 nfsrv_fixattr(nd, ndp->ni_vp, nvap, aclp, p, attrbitp, exp);
1985 if (nd->nd_flag & ND_NFSV3) {
1986 nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p);
1987 if (!nd->nd_repstat)
1988 nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
1989 nvap, nd, p, 1, NULL);
1991 if (vpp != NULL && nd->nd_repstat == 0) {
1998 *diraft_retp = nfsvno_getattr(dirp, diraftp, nd, p, 0, NULL);
2001 if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
2005 tl += 2;
2007 (void) nfsrv_putattrbit(nd, attrbitp);
2010 NFSEXITCODE2(0, nd);
2017 nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
2029 if (nd->nd_repstat) {
2030 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
2033 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, LOCKPARENT | NOCACHE);
2035 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
2038 if (!nd->nd_repstat) {
2040 if (nd->nd_flag & ND_NFSV3) {
2041 error = nfsrv_sattr(nd, NULL, &nva, NULL, NULL, p);
2049 if (!nd->nd_repstat) {
2050 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, &dirp);
2055 if (dirp != NULL && !(nd->nd_flag & ND_NFSV3)) {
2059 if (nd->nd_repstat) {
2061 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0,
2065 if (nd->nd_flag & ND_NFSV3)
2066 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
2071 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0, NULL);
2076 nfsrvd_mkdirsub(nd, &named, &nva, fhp, vpp, dirp, &dirfor, &diraft,
2079 if (nd->nd_flag & ND_NFSV3) {
2080 if (!nd->nd_repstat) {
2081 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)fhp, 0, 1);
2082 nfsrv_postopattr(nd, 0, &nva);
2084 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
2085 } else if (!nd->nd_repstat) {
2086 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)fhp, 0, 0);
2087 nfsrv_fillattr(nd, &nva);
2091 NFSEXITCODE2(0, nd);
2096 NFSEXITCODE2(error, nd);
2104 nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
2114 nd->nd_repstat = nfsvno_mkdir(ndp, nvap, nd->nd_saveduid,
2115 nd->nd_cred, p, exp);
2116 if (!nd->nd_repstat) {
2118 nfsrv_fixattr(nd, vp, nvap, aclp, p, attrbitp, exp);
2119 nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
2120 if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
2121 nd->nd_repstat = nfsvno_getattr(vp, nvap, nd, p, 1,
2123 if (vpp && !nd->nd_repstat) {
2131 *diraft_retp = nfsvno_getattr(dirp, diraftp, nd, p, 0, NULL);
2134 if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
2138 tl += 2;
2140 (void) nfsrv_putattrbit(nd, attrbitp);
2143 NFSEXITCODE2(0, nd);
2150 nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
2159 if (nd->nd_repstat) {
2160 nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
2166 if (nd->nd_flag & ND_NFSV3)
2179 tl += 2;
2181 if (nd->nd_flag & ND_NFSV3)
2182 for_ret = nfsvno_getattr(vp, &bfor, nd, p, 1, NULL);
2183 nd->nd_repstat = nfsvno_fsync(vp, off, cnt, nd->nd_cred, p);
2184 if (nd->nd_flag & ND_NFSV3) {
2185 aft_ret = nfsvno_getattr(vp, &aft, nd, p, 1, NULL);
2186 nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
2189 if (!nd->nd_repstat) {
2196 NFSEXITCODE2(0, nd);
2200 NFSEXITCODE2(error, nd);
2208 nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
2219 if (nd->nd_repstat) {
2220 nfsrv_postopattr(nd, getret, &at);
2224 nd->nd_repstat = nfsvno_statfs(vp, sf);
2225 getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
2227 if (nd->nd_flag & ND_NFSV3)
2228 nfsrv_postopattr(nd, getret, &at);
2229 if (nd->nd_repstat)
2231 if (nd->nd_flag & ND_NFSV2) {
2242 txdr_hyper(tval, tl); tl += 2;
2245 txdr_hyper(tval, tl); tl += 2;
2248 txdr_hyper(tval, tl); tl += 2;
2250 txdr_hyper(tval, tl); tl += 2;
2252 txdr_hyper(tval, tl); tl += 2;
2254 txdr_hyper(tval, tl); tl += 2;
2260 NFSEXITCODE2(0, nd);
2268 nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
2277 if (nd->nd_repstat) {
2278 nfsrv_postopattr(nd, getret, &at);
2281 getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
2284 nfsrv_postopattr(nd, getret, &at);
2294 tl += 2;
2296 tl += 2;
2300 NFSEXITCODE2(0, nd);
2308 nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
2317 if (nd->nd_repstat) {
2318 nfsrv_postopattr(nd, getret, &at);
2321 nd->nd_repstat = nfsvno_pathconf(vp, _PC_LINK_MAX, &linkmax,
2322 nd->nd_cred, p);
2323 if (!nd->nd_repstat)
2324 nd->nd_repstat = nfsvno_pathconf(vp, _PC_NAME_MAX, &namemax,
2325 nd->nd_cred, p);
2326 if (!nd->nd_repstat)
2327 nd->nd_repstat=nfsvno_pathconf(vp, _PC_CHOWN_RESTRICTED,
2328 &chownres, nd->nd_cred, p);
2329 if (!nd->nd_repstat)
2330 nd->nd_repstat = nfsvno_pathconf(vp, _PC_NO_TRUNC, &notrunc,
2331 nd->nd_cred, p);
2332 getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL);
2334 nfsrv_postopattr(nd, getret, &at);
2335 if (!nd->nd_repstat) {
2352 NFSEXITCODE2(0, nd);
2360 nfsrvd_lock(struct nfsrv_descript *nd, __unused int isdgram,
2389 nd->nd_repstat = NFSERR_BADXDR;
2395 tl += 2;
2397 tl += 2;
2404 nd->nd_repstat = NFSERR_BADXDR;
2410 stp->ls_op = nd->nd_rp;
2421 if ((nd->nd_flag & ND_NFSV41) != 0 &&
2425 stp->ls_stateid.other[2] == 0) {
2426 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
2427 stp->ls_stateid = nd->nd_curstateid;
2430 nd->nd_repstat = NFSERR_BADSTATEID;
2438 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2439 if ((nd->nd_flag & ND_NFSV41) != 0)
2440 clientid.qval = nd->nd_clientid.qval;
2441 else if (nd->nd_clientid.qval != clientid.qval)
2444 if ((nd->nd_flag & ND_NFSV41) != 0)
2446 nd->nd_flag |= ND_IMPLIEDCLID;
2447 nd->nd_clientid.qval = clientid.qval;
2449 error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
2457 stp->ls_op = nd->nd_rp;
2467 if ((nd->nd_flag & ND_NFSV41) != 0 &&
2471 stp->ls_stateid.other[2] == 0) {
2472 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
2473 stp->ls_stateid = nd->nd_curstateid;
2476 nd->nd_repstat = NFSERR_BADSTATEID;
2484 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2485 if ((nd->nd_flag & ND_NFSV41) != 0)
2486 clientid.qval = nd->nd_clientid.qval;
2487 else if (nd->nd_clientid.qval != clientid.qval)
2490 if ((nd->nd_flag & ND_NFSV41) != 0)
2492 nd->nd_flag |= ND_IMPLIEDCLID;
2493 nd->nd_clientid.qval = clientid.qval;
2504 nd->nd_repstat = NFSERR_INVAL;
2508 stp->ls_uid = nd->nd_cred->cr_uid;
2513 if (!nd->nd_repstat && vp->v_type != VREG) {
2515 nd->nd_repstat = NFSERR_ISDIR;
2517 nd->nd_repstat = NFSERR_INVAL;
2519 if (!nd->nd_repstat) {
2521 nd->nd_repstat = nfsvno_accchk(vp, VWRITE,
2522 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2525 nd->nd_repstat = nfsvno_accchk(vp, VREAD,
2526 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2528 if (nd->nd_repstat)
2529 nd->nd_repstat = nfsvno_accchk(vp, VEXEC,
2530 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2540 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, &cf, clientid,
2541 &stateid, exp, nd, p);
2546 if (!nd->nd_repstat) {
2548 if ((nd->nd_flag & ND_NFSV41) != 0) {
2549 nd->nd_curstateid = stateid;
2550 nd->nd_flag |= ND_CURSTATEID;
2555 } else if (nd->nd_repstat == NFSERR_DENIED) {
2558 tl += 2;
2564 tl += 2;
2571 (void) nfsm_strtom(nd, cf.cl_owner, cf.cl_ownerlen);
2574 NFSEXITCODE2(0, nd);
2580 NFSEXITCODE2(error, nd);
2588 nfsrvd_lockt(struct nfsrv_descript *nd, __unused int isdgram,
2605 nd->nd_repstat = NFSERR_BADXDR;
2613 stp->ls_uid = nd->nd_cred->cr_uid;
2627 nd->nd_repstat = NFSERR_BADXDR;
2631 tl += 2;
2638 nd->nd_repstat = NFSERR_INVAL;
2640 tl += 2;
2643 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2644 if ((nd->nd_flag & ND_NFSV41) != 0)
2645 clientid.qval = nd->nd_clientid.qval;
2646 else if (nd->nd_clientid.qval != clientid.qval)
2649 if ((nd->nd_flag & ND_NFSV41) != 0)
2651 nd->nd_flag |= ND_IMPLIEDCLID;
2652 nd->nd_clientid.qval = clientid.qval;
2654 error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
2657 if (!nd->nd_repstat && vp->v_type != VREG) {
2659 nd->nd_repstat = NFSERR_ISDIR;
2661 nd->nd_repstat = NFSERR_INVAL;
2663 if (!nd->nd_repstat)
2664 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, &cf, clientid,
2665 &stateid, exp, nd, p);
2666 if (nd->nd_repstat) {
2667 if (nd->nd_repstat == NFSERR_DENIED) {
2670 tl += 2;
2676 tl += 2;
2683 (void) nfsm_strtom(nd, cf.cl_owner, cf.cl_ownerlen);
2689 NFSEXITCODE2(0, nd);
2695 NFSEXITCODE2(error, nd);
2703 nfsrvd_locku(struct nfsrv_descript *nd, __unused int isdgram,
2723 stp->ls_op = nd->nd_rp;
2735 nd->nd_repstat = NFSERR_BADXDR;
2741 stp->ls_uid = nd->nd_cred->cr_uid;
2752 if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
2754 stp->ls_stateid.other[2] == 0) {
2755 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
2756 stp->ls_stateid = nd->nd_curstateid;
2759 nd->nd_repstat = NFSERR_BADSTATEID;
2767 tl += 2;
2774 nd->nd_repstat = NFSERR_INVAL;
2778 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2779 if ((nd->nd_flag & ND_NFSV41) != 0)
2780 clientid.qval = nd->nd_clientid.qval;
2781 else if (nd->nd_clientid.qval != clientid.qval)
2784 if ((nd->nd_flag & ND_NFSV41) != 0)
2786 nd->nd_flag |= ND_IMPLIEDCLID;
2787 nd->nd_clientid.qval = clientid.qval;
2789 if (!nd->nd_repstat && vp->v_type != VREG) {
2791 nd->nd_repstat = NFSERR_ISDIR;
2793 nd->nd_repstat = NFSERR_INVAL;
2800 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
2801 &stateid, exp, nd, p);
2806 if (!nd->nd_repstat) {
2813 NFSEXITCODE2(error, nd);
2821 nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
2830 int32_t cverf[2], tverf[2] = { 0, 0 };
2853 nd->nd_repstat = NFSERR_BADXDR;
2859 stp->ls_op = nd->nd_rp;
2861 stp->ls_uid = nd->nd_cred->cr_uid;
2866 NFSV4OPEN_WANTPUSHDELEG)) != 0 && (nd->nd_flag & ND_NFSV41) != 0) {
2908 nd->nd_repstat = NFSERR_INVAL;
2924 nd->nd_repstat = NFSERR_INVAL;
2928 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2929 if ((nd->nd_flag & ND_NFSV41) != 0)
2930 clientid.qval = nd->nd_clientid.qval;
2931 else if (nd->nd_clientid.qval != clientid.qval)
2934 if ((nd->nd_flag & ND_NFSV41) != 0)
2936 nd->nd_flag |= ND_IMPLIEDCLID;
2937 nd->nd_clientid.qval = clientid.qval;
2939 error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
2945 if (!nd->nd_repstat)
2946 nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd, p, 0, NULL);
2955 error = nfsv4_sattr(nd, NULL, &nva, &attrbits, aclp, p);
2964 if (!nd->nd_repstat && NFSVNO_ISSETGID(&nva) &&
2967 if (!nd->nd_repstat)
2968 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
2979 error = nfsv4_sattr(nd, NULL, &nva, &attrbits, aclp, p);
2984 nd->nd_repstat = NFSERR_INVAL;
2991 if (nd->nd_repstat == 0 && NFSVNO_ISSETGID(&nva) &&
2994 if (nd->nd_repstat == 0)
2995 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
2998 nd->nd_repstat = NFSERR_BADXDR;
3002 nd->nd_repstat = NFSERR_BADXDR;
3025 if (!nd->nd_repstat && create == NFSV4OPEN_CREATE &&
3027 nd->nd_repstat = NFSERR_INVAL;
3028 if (nd->nd_repstat) {
3029 nd->nd_repstat = nfsrv_opencheck(clientid,
3030 &stateid, stp, NULL, nd, p, nd->nd_repstat);
3034 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
3037 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
3040 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
3048 NFSEXITCODE2(error, nd);
3051 if (!nd->nd_repstat) {
3052 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp,
3061 if (nd->nd_repstat == 0 && named.ni_vp != NULL) {
3073 if (nd->nd_repstat == 0 && named.ni_vp != NULL) {
3074 nd->nd_repstat = EEXIST;
3080 if (nd->nd_repstat == 0 && named.ni_vp == NULL)
3088 nfsvno_open(nd, &named, clientid, &stateid, stp,
3090 nd->nd_cred, done_namei, exp, &vp);
3106 nd->nd_repstat = NFSERR_BADXDR;
3111 if (nd->nd_repstat == 0 && create == NFSV4OPEN_CREATE)
3112 nd->nd_repstat = NFSERR_INVAL;
3117 nd->nd_repstat = nfsrv_opencheck(clientid, &stateid,
3118 stp, vp, nd, p, nd->nd_repstat);
3120 nd->nd_repstat = NFSERR_PERM;
3122 nd->nd_repstat = NFSERR_BADXDR;
3129 if (!nd->nd_repstat && vp->v_type != VREG) {
3134 nd->nd_repstat = (vp->v_type == VDIR) ? NFSERR_ISDIR : NFSERR_SYMLINK;
3161 if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_WRITEACCESS))
3162 nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred,
3164 if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_READACCESS)) {
3165 nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred,
3167 if (nd->nd_repstat)
3168 nd->nd_repstat = nfsvno_accchk(vp, VEXEC,
3169 nd->nd_cred, exp, p, override,
3173 if (!nd->nd_repstat) {
3174 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
3175 if (!nd->nd_repstat) {
3180 if (!nd->nd_repstat && exclusive_flag && (cverf[0] != tverf[0] ||
3182 nd->nd_repstat = EEXIST;
3186 if (!nd->nd_repstat)
3187 nd->nd_repstat = nfsrv_openctrl(nd, vp, &stp, clientid, &stateid,
3199 if (!nd->nd_repstat && dirp)
3200 nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd, p, 0, NULL);
3201 if (!nd->nd_repstat) {
3203 if ((nd->nd_flag & ND_NFSV41) != 0) {
3204 nd->nd_curstateid = stateid;
3205 nd->nd_flag |= ND_CURSTATEID;
3220 tl += 2;
3222 tl += 2;
3225 (void) nfsrv_putattrbit(nd, &attrbits);
3240 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
3244 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
3286 (void) nfsm_strtom(nd, "OWNER@", 6);
3297 NFSEXITCODE2(0, nd);
3306 NFSEXITCODE2(error, nd);
3314 nfsrvd_close(struct nfsrv_descript *nd, __unused int isdgram,
3328 stp->ls_op = nd->nd_rp;
3329 stp->ls_uid = nd->nd_cred->cr_uid;
3338 if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
3340 stp->ls_stateid.other[2] == 0) {
3341 if ((nd->nd_flag & ND_CURSTATEID) != 0)
3342 stp->ls_stateid = nd->nd_curstateid;
3344 nd->nd_repstat = NFSERR_BADSTATEID;
3352 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3353 if ((nd->nd_flag & ND_NFSV41) != 0)
3354 clientid.qval = nd->nd_clientid.qval;
3355 else if (nd->nd_clientid.qval != clientid.qval)
3358 if ((nd->nd_flag & ND_NFSV41) != 0)
3360 nd->nd_flag |= ND_IMPLIEDCLID;
3361 nd->nd_clientid.qval = clientid.qval;
3363 nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
3369 if (!nd->nd_repstat) {
3374 if ((nd->nd_flag & ND_CURSTATEID) != 0 &&
3375 stateid.other[0] == nd->nd_curstateid.other[0] &&
3376 stateid.other[1] == nd->nd_curstateid.other[1] &&
3377 stateid.other[2] == nd->nd_curstateid.other[2])
3378 nd->nd_flag &= ~ND_CURSTATEID;
3383 NFSEXITCODE2(0, nd);
3387 NFSEXITCODE2(error, nd);
3395 nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused int isdgram,
3403 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
3405 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
3408 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3409 if ((nd->nd_flag & ND_NFSV41) != 0)
3410 clientid.qval = nd->nd_clientid.qval;
3411 else if (nd->nd_clientid.qval != clientid.qval)
3414 if ((nd->nd_flag & ND_NFSV41) != 0)
3416 nd->nd_flag |= ND_IMPLIEDCLID;
3417 nd->nd_clientid.qval = clientid.qval;
3419 nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
3420 NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
3422 NFSEXITCODE2(error, nd);
3430 nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused int isdgram,
3445 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3446 if ((nd->nd_flag & ND_NFSV41) != 0)
3447 clientid.qval = nd->nd_clientid.qval;
3448 else if (nd->nd_clientid.qval != clientid.qval)
3451 if ((nd->nd_flag & ND_NFSV41) != 0)
3453 nd->nd_flag |= ND_IMPLIEDCLID;
3454 nd->nd_clientid.qval = clientid.qval;
3456 nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
3457 NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
3463 NFSEXITCODE2(error, nd);
3471 nfsrvd_getfh(struct nfsrv_descript *nd, __unused int isdgram,
3477 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
3479 if (!nd->nd_repstat)
3480 (void)nfsm_fhtom(NULL, nd, (u_int8_t *)&fh, 0, 0);
3481 NFSEXITCODE2(0, nd);
3489 nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused int isdgram,
3499 if ((nd->nd_flag & ND_NFSV41) != 0) {
3500 nd->nd_repstat = NFSERR_NOTSUPP;
3505 stp->ls_op = nd->nd_rp;
3506 stp->ls_uid = nd->nd_cred->cr_uid;
3515 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3516 if ((nd->nd_flag & ND_NFSV41) != 0)
3517 clientid.qval = nd->nd_clientid.qval;
3518 else if (nd->nd_clientid.qval != clientid.qval)
3521 if ((nd->nd_flag & ND_NFSV41) != 0)
3523 nd->nd_flag |= ND_IMPLIEDCLID;
3524 nd->nd_clientid.qval = clientid.qval;
3526 nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
3528 if (!nd->nd_repstat) {
3535 NFSEXITCODE2(error, nd);
3543 nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unused int isdgram,
3561 stp->ls_op = nd->nd_rp;
3562 stp->ls_uid = nd->nd_cred->cr_uid;
3572 if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
3574 stp->ls_stateid.other[2] == 0) {
3575 if ((nd->nd_flag & ND_CURSTATEID) != 0)
3576 stp->ls_stateid = nd->nd_curstateid;
3578 nd->nd_repstat = NFSERR_BADSTATEID;
3585 if ((nd->nd_flag & ND_NFSV41) != 0)
3599 nd->nd_repstat = NFSERR_INVAL;
3615 nd->nd_repstat = NFSERR_INVAL;
3620 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3621 if ((nd->nd_flag & ND_NFSV41) != 0)
3622 clientid.qval = nd->nd_clientid.qval;
3623 else if (nd->nd_clientid.qval != clientid.qval)
3626 if ((nd->nd_flag & ND_NFSV41) != 0)
3628 nd->nd_flag |= ND_IMPLIEDCLID;
3629 nd->nd_clientid.qval = clientid.qval;
3631 if (!nd->nd_repstat)
3632 nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
3633 nd, p, NULL);
3634 if (!nd->nd_repstat) {
3636 if ((nd->nd_flag & ND_NFSV41) != 0) {
3637 nd->nd_curstateid = stateid;
3638 nd->nd_flag |= ND_CURSTATEID;
3646 NFSEXITCODE2(error, nd);
3654 nfsrvd_renew(struct nfsrv_descript *nd, __unused int isdgram,
3662 if ((nd->nd_flag & ND_NFSV41) != 0) {
3663 nd->nd_repstat = NFSERR_NOTSUPP;
3666 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
3671 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3672 if ((nd->nd_flag & ND_NFSV41) != 0)
3673 clientid.qval = nd->nd_clientid.qval;
3674 else if (nd->nd_clientid.qval != clientid.qval)
3677 if ((nd->nd_flag & ND_NFSV41) != 0)
3679 nd->nd_flag |= ND_IMPLIEDCLID;
3680 nd->nd_clientid.qval = clientid.qval;
3682 nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_RENEWOP|CLOPS_RENEW),
3683 NULL, NULL, (nfsquad_t)((u_quad_t)0), 0, nd, p);
3685 NFSEXITCODE2(error, nd);
3693 nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
3712 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
3715 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
3721 if (!nd->nd_repstat) {
3722 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, &dirp);
3729 if (nd->nd_repstat)
3734 nd->nd_repstat = nfsvno_getfh(vp, (fhandle_t *)fh.nfsrvfh_data, p);
3736 savflag = nd->nd_flag;
3737 if (!nd->nd_repstat) {
3742 nfsd_fhtovp(nd, &fh, LK_SHARED, &vp, &retnes, NULL, 0,
3747 nd->nd_flag = savflag;
3748 if (nd->nd_repstat)
3760 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3763 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3769 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3775 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3777 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3790 (void) nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3792 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
3799 (void) nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3801 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
3808 (void) nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3810 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
3819 NFSEXITCODE2(error, nd);
3827 nfsrvd_secinfononame(struct nfsrv_descript *nd, int isdgram,
3847 nd->nd_repstat = NFSERR_NOTDIR;
3850 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
3853 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
3859 if (nd->nd_repstat == 0)
3860 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, &dirp);
3872 nd->nd_repstat = NFSERR_INVAL;
3875 if (nd->nd_repstat != 0)
3878 nd->nd_repstat = nfsvno_getfh(vp, (fhandle_t *)fh.nfsrvfh_data, p);
3880 savflag = nd->nd_flag;
3881 if (nd->nd_repstat == 0) {
3886 nfsd_fhtovp(nd, &fh, LK_SHARED, &vp, &retnes, NULL, 0,
3891 nd->nd_flag = savflag;
3892 if (nd->nd_repstat != 0)
3904 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3907 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3913 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3919 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3921 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3934 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3936 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3943 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3945 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3952 nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3954 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
3963 NFSEXITCODE2(error, nd);
3971 nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
3991 if ((nd->nd_flag & ND_NFSV41) != 0) {
3992 nd->nd_repstat = NFSERR_NOTSUPP;
3995 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4002 nd->nd_repstat = NFSERR_BADXDR;
4006 if (nd->nd_flag & ND_GSS)
4007 i += nd->nd_princlen;
4019 error = nfsrv_mtostr(nd, clp->lc_id, idlen);
4022 if (nd->nd_flag & ND_GSS) {
4024 if (nd->nd_flag & ND_GSSINTEGRITY)
4026 else if (nd->nd_flag & ND_GSSPRIVACY)
4031 if ((nd->nd_flag & ND_GSS) && nd->nd_princlen > 0) {
4033 clp->lc_namelen = nd->nd_princlen;
4035 NFSBCOPY(nd->nd_principal, clp->lc_name, clp->lc_namelen);
4037 clp->lc_uid = nd->nd_cred->cr_uid;
4038 clp->lc_gid = nd->nd_cred->cr_gid;
4042 if (nd->nd_flag & ND_TLS)
4047 error = nfsrv_getclientipaddr(nd, clp);
4060 nd->nd_repstat = nfsrv_setclient(nd, &clp, &clientid, &confirm, p);
4061 if (nd->nd_repstat == NFSERR_CLIDINUSE) {
4070 (void) nfsm_strtom(nd, "tcp", 3);
4072 (void) nfsm_strtom(nd, "udp", 3);
4077 ucp[1] & 0xff, ucp[2] & 0xff, ucp[3] & 0xff,
4084 (void) nfsm_strtom(nd, "tcp6", 4);
4086 (void) nfsm_strtom(nd, "udp6", 4);
4100 (void) nfsm_strtom(nd, addrbuf, strlen(addrbuf));
4109 if (!nd->nd_repstat) {
4110 NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_HYPER);
4118 NFSEXITCODE2(0, nd);
4127 NFSEXITCODE2(error, nd);
4135 nfsrvd_setclientidcfrm(struct nfsrv_descript *nd,
4144 if ((nd->nd_flag & ND_NFSV41) != 0) {
4145 nd->nd_repstat = NFSERR_NOTSUPP;
4148 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4150 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_HYPER);
4160 nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_CONFIRM|CLOPS_RENEW),
4161 NULL, NULL, confirm, 0, nd, p);
4163 NFSEXITCODE2(error, nd);
4171 nfsrvd_verify(struct nfsrv_descript *nd, int isdgram,
4182 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, NULL);
4183 if (!nd->nd_repstat)
4184 nd->nd_repstat = nfsvno_statfs(vp, sf);
4185 if (!nd->nd_repstat)
4186 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
4187 if (!nd->nd_repstat) {
4189 error = nfsv4_loadattr(nd, vp, &nva, NULL, &fh, fhsize, NULL,
4190 sf, NULL, &fs, NULL, 1, &ret, NULL, NULL, p, nd->nd_cred);
4192 if (nd->nd_procnum == NFSV4OP_NVERIFY) {
4194 nd->nd_repstat = NFSERR_SAME;
4196 nd->nd_repstat = ret;
4198 nd->nd_repstat = ret;
4203 NFSEXITCODE2(error, nd);
4211 nfsrvd_openattr(struct nfsrv_descript *nd, __unused int isdgram,
4220 nd->nd_repstat = NFSERR_NOTSUPP;
4223 NFSEXITCODE2(error, nd);
4231 nfsrvd_releaselckown(struct nfsrv_descript *nd, __unused int isdgram,
4240 if ((nd->nd_flag & ND_NFSV41) != 0) {
4241 nd->nd_repstat = NFSERR_NOTSUPP;
4244 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4247 len = fxdr_unsigned(int, *(tl + 2));
4249 nd->nd_repstat = NFSERR_BADXDR;
4257 stp->ls_uid = nd->nd_cred->cr_uid;
4260 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
4261 if ((nd->nd_flag & ND_NFSV41) != 0)
4262 clientid.qval = nd->nd_clientid.qval;
4263 else if (nd->nd_clientid.qval != clientid.qval)
4266 if ((nd->nd_flag & ND_NFSV41) != 0)
4268 nd->nd_flag |= ND_IMPLIEDCLID;
4269 nd->nd_clientid.qval = clientid.qval;
4271 error = nfsrv_mtostr(nd, stp->ls_owner, len);
4274 nd->nd_repstat = nfsrv_releaselckown(stp, clientid, p);
4277 NFSEXITCODE2(0, nd);
4282 NFSEXITCODE2(error, nd);
4290 nfsrvd_exchangeid(struct nfsrv_descript *nd, __unused int isdgram,
4310 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4317 nd->nd_repstat = NFSERR_BADXDR;
4321 if (nd->nd_flag & ND_GSS)
4322 i += nd->nd_princlen;
4331 switch (nd->nd_nam->sa_family) {
4335 sin = (struct sockaddr_in *)nd->nd_nam;
4345 sin6 = (struct sockaddr_in6 *)nd->nd_nam;
4356 error = nfsrv_mtostr(nd, clp->lc_id, idlen);
4359 if ((nd->nd_flag & ND_GSS) != 0) {
4361 if ((nd->nd_flag & ND_GSSINTEGRITY) != 0)
4363 else if ((nd->nd_flag & ND_GSSPRIVACY) != 0)
4367 if ((nd->nd_flag & ND_NFSV42) != 0)
4369 if ((nd->nd_flag & ND_GSS) != 0 && nd->nd_princlen > 0) {
4371 clp->lc_namelen = nd->nd_princlen;
4373 NFSBCOPY(nd->nd_principal, clp->lc_name, clp->lc_namelen);
4375 clp->lc_uid = nd->nd_cred->cr_uid;
4376 clp->lc_gid = nd->nd_cred->cr_gid;
4378 NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
4383 nd->nd_repstat = NFSERR_INVAL;
4396 if ((nd->nd_flag & (ND_GSSINTEGRITY | ND_GSSPRIVACY)) == 0 ||
4397 nd->nd_princlen == 0)
4398 nd->nd_repstat = (NFSERR_AUTHERR | AUTH_TOOWEAK);
4399 if (nd->nd_repstat == 0)
4400 nd->nd_repstat = nfsrv_getopbits(nd, &mustops, NULL);
4401 if (nd->nd_repstat == 0)
4402 nd->nd_repstat = nfsrv_getopbits(nd, &allowops, NULL);
4403 if (nd->nd_repstat != 0)
4411 nd->nd_repstat = NFSERR_NOTSUPP;
4422 nd->nd_repstat = nfsrv_setclient(nd, &clp, &clientid, &confirm, p);
4429 if (nd->nd_repstat == 0) {
4439 nfsrv_putopbit(nd, &mustops);
4440 nfsrv_putopbit(nd, &allowops);
4447 s = nd->nd_cred->cr_prison->pr_hostuuid;
4448 nfsm_strtom(nd, s, strlen(s)); /* Owner Major */
4452 s = nd->nd_cred->cr_prison->pr_hostuuid;
4453 nfsm_strtom(nd, s, strlen(s) ); /* Scope */
4456 (void)nfsm_strtom(nd, "freebsd.org", strlen("freebsd.org"));
4457 (void)nfsm_strtom(nd, version, strlen(version));
4463 NFSEXITCODE2(0, nd);
4472 NFSEXITCODE2(error, nd);
4480 nfsrvd_createsession(struct nfsrv_descript *nd, __unused int isdgram,
4491 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4497 NFSM_DISSECT(tl, uint32_t *, NFSX_HYPER + 2 * NFSX_UNSIGNED);
4529 nd->nd_repstat = NFSERR_BADXDR;
4544 nd->nd_repstat = NFSERR_BADXDR;
4556 nd->nd_repstat = nfsrv_getclient(clientid, CLOPS_CONFIRM | CLOPS_RENEW,
4557 NULL, sep, confirm, sep->sess_cbprogram, nd, p);
4558 if (nd->nd_repstat == 0) {
4586 if (nd->nd_repstat != 0 && sep != NULL)
4588 NFSEXITCODE2(error, nd);
4596 nfsrvd_sequence(struct nfsrv_descript *nd, __unused int isdgram,
4604 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4607 NFSBCOPY(tl, nd->nd_sessionid, NFSX_V4SESSIONID);
4610 nd->nd_slotid = fxdr_unsigned(uint32_t, *tl++);
4616 nd->nd_repstat = nfsrv_checksequence(nd, sequenceid, &highest_slotid,
4618 if (nd->nd_repstat != NFSERR_BADSLOT)
4619 nd->nd_flag |= ND_HASSEQUENCE;
4620 if (nd->nd_repstat == 0) {
4622 NFSBCOPY(nd->nd_sessionid, tl, NFSX_V4SESSIONID);
4625 *tl++ = txdr_unsigned(nd->nd_slotid);
4631 NFSEXITCODE2(error, nd);
4639 nfsrvd_reclaimcomplete(struct nfsrv_descript *nd, __unused int isdgram,
4658 nd->nd_repstat = nfsrv_checkreclaimcomplete(nd, onefs);
4660 NFSEXITCODE2(error, nd);
4668 nfsrvd_destroyclientid(struct nfsrv_descript *nd, __unused int isdgram,
4676 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4678 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED);
4681 nd->nd_repstat = nfsrv_destroyclient(nd, clientid, p);
4683 NFSEXITCODE2(error, nd);
4691 nfsrvd_bindconnsess(struct nfsrv_descript *nd, __unused int isdgram,
4698 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4700 NFSM_DISSECT(tl, uint32_t *, NFSX_V4SESSIONID + 2 * NFSX_UNSIGNED);
4706 nd->nd_repstat = NFSERR_NOTSUPP;
4710 nd->nd_repstat = nfsrv_bindconnsess(nd, sessid, &foreaft);
4711 if (nd->nd_repstat == 0) {
4712 NFSM_BUILD(tl, uint32_t *, NFSX_V4SESSIONID + 2 *
4720 NFSEXITCODE2(error, nd);
4728 nfsrvd_destroysession(struct nfsrv_descript *nd, __unused int isdgram,
4734 if ((nd->nd_repstat = nfsd_checkrootexp(nd)) != 0)
4738 nd->nd_repstat = nfsrv_destroysession(nd, sessid);
4740 NFSEXITCODE2(error, nd);
4748 nfsrvd_freestateid(struct nfsrv_descript *nd, __unused int isdgram,
4765 stateid.other[1] == 0 && stateid.other[2] == 0) {
4766 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
4767 stateid = nd->nd_curstateid;
4770 nd->nd_repstat = NFSERR_BADSTATEID;
4775 nd->nd_repstat = nfsrv_freestateid(nd, &stateid, p);
4778 if (nd->nd_repstat == 0 && (nd->nd_flag & ND_CURSTATEID) != 0 &&
4779 stateid.other[0] == nd->nd_curstateid.other[0] &&
4780 stateid.other[1] == nd->nd_curstateid.other[1] &&
4781 stateid.other[2] == nd->nd_curstateid.other[2])
4782 nd->nd_flag &= ~ND_CURSTATEID;
4784 NFSEXITCODE2(error, nd);
4792 nfsrvd_layoutget(struct nfsrv_descript *nd, __unused int isdgram,
4807 offset = fxdr_hyper(tl); tl += 2;
4808 len = fxdr_hyper(tl); tl += 2;
4809 minlen = fxdr_hyper(tl); tl += 2;
4820 nd->nd_repstat = NFSERR_INVAL;
4829 stateid.other[1] == 0 && stateid.other[2] == 0) {
4830 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
4831 stateid = nd->nd_curstateid;
4834 nd->nd_repstat = NFSERR_BADSTATEID;
4846 nd->nd_repstat = NFSERR_UNKNLAYOUTTYPE;
4848 nd->nd_repstat = nfsrv_layoutget(nd, vp, exp, layouttype,
4850 &retonclose, &layoutlen, layp, nd->nd_cred, p);
4851 NFSD_DEBUG(4, "nfsrv_layoutget stat=%u layoutlen=%d\n", nd->nd_repstat,
4853 if (nd->nd_repstat == 0) {
4855 if ((nd->nd_flag & ND_NFSV41) != 0) {
4856 nd->nd_curstateid = stateid;
4857 nd->nd_flag |= ND_CURSTATEID;
4860 2 * NFSX_HYPER);
4866 txdr_hyper(offset, tl); tl += 2;
4867 txdr_hyper(len, tl); tl += 2;
4870 nfsm_strtom(nd, layp, layoutlen);
4871 } else if (nd->nd_repstat == NFSERR_LAYOUTTRYLATER) {
4878 NFSEXITCODE2(error, nd);
4886 nfsrvd_layoutcommit(struct nfsrv_descript *nd, __unused int isdgram,
4899 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED + 2 * NFSX_HYPER +
4901 offset = fxdr_hyper(tl); tl += 2;
4902 len = fxdr_hyper(tl); tl += 2;
4912 stateid.other[1] == 0 && stateid.other[2] == 0) {
4913 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
4914 stateid = nd->nd_curstateid;
4917 nd->nd_repstat = NFSERR_BADSTATEID;
4925 newoff = fxdr_hyper(tl); tl += 2;
4930 NFSM_DISSECT(tl, uint32_t *, NFSX_V4TIME + 2 * NFSX_UNSIGNED);
4934 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED);
4939 error = nfsrv_mtostr(nd, layp, maxcnt);
4943 nd->nd_repstat = nfsrv_layoutcommit(nd, vp, layouttype, hasnewoff,
4945 maxcnt, layp, &hasnewsize, &newsize, nd->nd_cred, p);
4946 NFSD_DEBUG(4, "nfsrv_layoutcommit stat=%u\n", nd->nd_repstat);
4947 if (nd->nd_repstat == 0) {
4960 NFSEXITCODE2(error, nd);
4968 nfsrvd_layoutreturn(struct nfsrv_descript *nd, __unused int isdgram,
4986 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_HYPER + NFSX_STATEID +
4988 offset = fxdr_hyper(tl); tl += 2;
4989 len = fxdr_hyper(tl); tl += 2;
4999 stateid.other[1] == 0 && stateid.other[2] == 0) {
5000 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
5001 stateid = nd->nd_curstateid;
5004 nd->nd_repstat = NFSERR_BADSTATEID;
5018 error = nfsrv_mtostr(nd, (char *)layp, maxcnt);
5024 nd->nd_repstat = NFSERR_INVAL;
5030 nd->nd_repstat = nfsrv_layoutreturn(nd, vp, layouttype, iomode,
5032 nd->nd_cred, p);
5033 NFSD_DEBUG(4, "nfsrv_layoutreturn stat=%u fnd=%d\n", nd->nd_repstat,
5035 if (nd->nd_repstat == 0) {
5048 NFSEXITCODE2(error, nd);
5056 nfsrvd_layouterror(struct nfsrv_descript *nd, __unused int isdgram,
5066 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_HYPER + NFSX_STATEID +
5068 offset = fxdr_hyper(tl); tl += 2;
5069 len = fxdr_hyper(tl); tl += 2;
5081 stateid.other[1] == 0 && stateid.other[2] == 0) {
5082 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
5083 stateid = nd->nd_curstateid;
5086 nd->nd_repstat = NFSERR_BADSTATEID;
5095 NFSM_DISSECT(tl, uint32_t *, NFSX_V4DEVICEID + 2 *
5116 NFSEXITCODE2(error, nd);
5124 nfsrvd_layoutstats(struct nfsrv_descript *nd, __unused int isdgram,
5136 NFSX_V4DEVICEID + 2 * NFSX_UNSIGNED);
5137 offset = fxdr_hyper(tl); tl += 2;
5138 len = fxdr_hyper(tl); tl += 2;
5142 readcount = fxdr_hyper(tl); tl += 2;
5143 readbytes = fxdr_hyper(tl); tl += 2;
5144 writecount = fxdr_hyper(tl); tl += 2;
5145 writebytes = fxdr_hyper(tl); tl += 2;
5150 error = nfsm_advance(nd, NFSM_RNDUP(cnt), -1);
5159 stateid.other[1] == 0 && stateid.other[2] == 0) {
5160 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
5161 stateid = nd->nd_curstateid;
5164 nd->nd_repstat = NFSERR_BADSTATEID;
5174 NFSEXITCODE2(error, nd);
5182 nfsrvd_ioadvise(struct nfsrv_descript *nd, __unused int isdgram,
5191 NFSM_DISSECT(tl, uint32_t *, NFSX_STATEID + 2 * NFSX_HYPER);
5195 offset = fxdr_hyper(tl); tl += 2;
5197 error = nfsrv_getattrbits(nd, &hints, NULL, NULL);
5205 stateid.other[1] == 0 && stateid.other[2] == 0) {
5206 if ((nd->nd_flag & ND_CURSTATEID) != 0) {
5207 stateid = nd->nd_curstateid;
5210 nd->nd_repstat = NFSERR_BADSTATEID;
5216 nd->nd_repstat = NFSERR_INVAL;
5223 nd->nd_repstat = NFSERR_ISDIR;
5225 nd->nd_repstat = NFSERR_WRONGTYPE;
5259 nfsrv_putattrbit(nd, &hints);
5260 NFSEXITCODE2(error, nd);
5264 NFSEXITCODE2(error, nd);
5272 nfsrvd_getdevinfo(struct nfsrv_descript *nd, __unused int isdgram,
5289 nd->nd_repstat = NFSERR_INVAL;
5306 nd->nd_repstat = NFSERR_NOENT;
5311 nd->nd_repstat = nfsrv_getdevinfo(devid, layouttype, &maxcnt,
5313 NFSD_DEBUG(4, "nfsrv_getdevinfo stat=%u\n", nd->nd_repstat);
5314 if (nd->nd_repstat == 0) {
5317 nfsm_strtom(nd, devaddr, devaddrlen);
5327 } else if (nd->nd_repstat == NFSERR_TOOSMALL) {
5332 NFSEXITCODE2(error, nd);
5340 nfsrvd_teststateid(struct nfsrv_descript *nd, __unused int isdgram,
5351 nd->nd_repstat = NFSERR_BADXDR;
5366 ret = nfsrv_teststateid(nd, tstateidp, p);
5373 NFSEXITCODE2(error, nd);
5381 nfsrvd_allocate(struct nfsrv_descript *nd, __unused int isdgram,
5398 * for NFSv4.2. This cannot be done 'per filesystem', but
5399 * must be for the entire nfsd NFSv4.2 service.
5401 nd->nd_repstat = NFSERR_NOTSUPP;
5405 NFSM_DISSECT(tl, uint32_t *, NFSX_STATEID + 2 * NFSX_HYPER);
5410 stp->ls_uid = nd->nd_cred->cr_uid;
5414 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
5415 if ((nd->nd_flag & ND_NFSV41) != 0)
5416 clientid.qval = nd->nd_clientid.qval;
5417 else if (nd->nd_clientid.qval != clientid.qval)
5420 if ((nd->nd_flag & ND_NFSV41) != 0)
5422 nd->nd_flag |= ND_IMPLIEDCLID;
5423 nd->nd_clientid.qval = clientid.qval;
5425 stp->ls_stateid.other[2] = *tl++;
5429 if ((nd->nd_flag & ND_DSSERVER) != 0)
5430 nd->nd_repstat = NFSERR_NOTSUPP;
5435 stp->ls_stateid.other[2] == 0x55555555)
5437 off = fxdr_hyper(tl); tl += 2;
5450 if (nd->nd_repstat == 0 && (len <= 0 || off < 0 || lop->lo_end >
5452 nd->nd_repstat = NFSERR_INVAL;
5454 if (nd->nd_repstat == 0 && vp->v_type != VREG)
5455 nd->nd_repstat = NFSERR_WRONGTYPE;
5458 forat_ret = nfsvno_getattr(vp, &forat, nd, curthread, 1, &attrbits);
5459 if (nd->nd_repstat == 0)
5460 nd->nd_repstat = forat_ret;
5461 if (nd->nd_repstat == 0 && (forat.na_uid != nd->nd_cred->cr_uid ||
5463 nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp,
5466 if (nd->nd_repstat == 0 && gotproxystateid == 0)
5467 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
5468 &stateid, exp, nd, curthread);
5471 (intmax_t)off, (intmax_t)len, nd->nd_repstat);
5472 if (nd->nd_repstat == 0)
5473 nd->nd_repstat = nfsvno_allocate(vp, off, len, nd->nd_cred,
5476 nd->nd_repstat);
5478 NFSEXITCODE2(0, nd);
5482 NFSEXITCODE2(error, nd);
5490 nfsrvd_deallocate(struct nfsrv_descript *nd, __unused int isdgram,
5504 NFSM_DISSECT(tl, uint32_t *, NFSX_STATEID + 2 * NFSX_HYPER);
5509 stp->ls_uid = nd->nd_cred->cr_uid;
5513 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
5514 if ((nd->nd_flag & ND_NFSV41) != 0)
5515 clientid.qval = nd->nd_clientid.qval;
5516 else if (nd->nd_clientid.qval != clientid.qval)
5519 if ((nd->nd_flag & ND_NFSV41) != 0)
5521 nd->nd_flag |= ND_IMPLIEDCLID;
5522 nd->nd_clientid.qval = clientid.qval;
5524 stp->ls_stateid.other[2] = *tl++;
5528 if ((nd->nd_flag & ND_DSSERVER) != 0)
5529 nd->nd_repstat = NFSERR_NOTSUPP;
5534 stp->ls_stateid.other[2] == 0x55555555)
5536 off = fxdr_hyper(tl); tl += 2;
5555 if (nd->nd_repstat == 0) {
5557 nd->nd_repstat = NFSERR_FBIG;
5559 nd->nd_repstat = NFSERR_INVAL;
5562 if (nd->nd_repstat == 0 && vp->v_type != VREG)
5563 nd->nd_repstat = NFSERR_WRONGTYPE;
5566 forat_ret = nfsvno_getattr(vp, &forat, nd, curthread, 1, &attrbits);
5567 if (nd->nd_repstat == 0)
5568 nd->nd_repstat = forat_ret;
5569 if (nd->nd_repstat == 0 && (forat.na_uid != nd->nd_cred->cr_uid ||
5571 nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp,
5574 if (nd->nd_repstat == 0 && gotproxystateid == 0)
5575 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
5576 &stateid, exp, nd, curthread);
5578 if (nd->nd_repstat == 0)
5579 nd->nd_repstat = nfsvno_deallocate(vp, off, len, nd->nd_cred,
5582 NFSD_DEBUG(4, "eo deallocate=%d\n", nd->nd_repstat);
5583 NFSEXITCODE2(0, nd);
5587 NFSEXITCODE2(error, nd);
5595 nfsrvd_copy_file_range(struct nfsrv_descript *nd, __unused int isdgram,
5618 nd->nd_repstat = NFSERR_NOTSUPP;
5623 nd->nd_repstat = NFSERR_INVAL;
5626 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_STATEID + 3 * NFSX_HYPER +
5632 instp->ls_uid = nd->nd_cred->cr_uid;
5636 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0)
5637 clientid.qval = nd->nd_clientid.qval;
5638 instp->ls_stateid.other[2] = *tl++;
5643 outstp->ls_uid = nd->nd_cred->cr_uid;
5647 outstp->ls_stateid.other[2] = *tl++;
5648 inoff = fxdr_hyper(tl); tl += 2;
5650 outoff = fxdr_hyper(tl); tl += 2;
5652 len = fxdr_hyper(tl); tl += 2;
5666 tl += 2;
5669 if ((nd->nd_flag & ND_DSSERVER) != 0 || cnt != 0)
5670 nd->nd_repstat = NFSERR_NOTSUPP;
5671 if (nd->nd_repstat == 0 && (inoff > OFF_MAX || outoff > OFF_MAX ||
5675 nd->nd_repstat = NFSERR_INVAL;
5677 if (nd->nd_repstat == 0 && vp->v_type != VREG)
5678 nd->nd_repstat = NFSERR_WRONGTYPE;
5683 ret = nfsvno_getattr(vp, &at, nd, curthread, 1, &attrbits);
5684 if (nd->nd_repstat == 0)
5685 nd->nd_repstat = ret;
5686 if (nd->nd_repstat == 0 && (at.na_uid != nd->nd_cred->cr_uid ||
5688 nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred, exp,
5691 if (nd->nd_repstat == 0)
5692 nd->nd_repstat = nfsrv_lockctrl(vp, &instp, &inlop, NULL,
5693 clientid, &stateid, exp, nd, curthread);
5695 if (nd->nd_repstat != 0)
5702 nd->nd_repstat = NFSERR_WRONGTYPE;
5705 ret = nfsvno_getattr(tovp, &at, nd, curthread, 1, &attrbits);
5706 if (nd->nd_repstat == 0)
5707 nd->nd_repstat = ret;
5708 if (nd->nd_repstat == 0 && (at.na_uid != nd->nd_cred->cr_uid ||
5710 nd->nd_repstat = nfsvno_accchk(tovp, VWRITE, nd->nd_cred, toexp,
5713 if (nd->nd_repstat == 0)
5714 nd->nd_repstat = nfsrv_lockctrl(tovp, &outstp, &outlop, NULL,
5715 clientid, &stateid, toexp, nd, curthread);
5719 if (nd->nd_repstat == 0) {
5746 ret = nfsvno_getattr(vp, &at, nd, curthread, 1, NULL);
5764 * the file size, however the NFSv4.2
5769 nd->nd_repstat = NFSERR_INVAL;
5773 if (ret != 0 && nd->nd_repstat == 0)
5774 nd->nd_repstat = ret;
5775 } else if (nd->nd_repstat == 0)
5776 nd->nd_repstat = error;
5788 if (nd->nd_repstat == 0) {
5789 nd->nd_repstat = vn_copy_file_range(vp, &inoff, tovp, &outoff,
5790 &xfer, COPY_FILE_RANGE_TIMEO1SEC, nd->nd_cred, nd->nd_cred,
5792 if (nd->nd_repstat == 0)
5802 if (nd->nd_repstat == 0) {
5806 txdr_hyper(len, tl); tl += 2;
5816 NFSEXITCODE2(error, nd);
5821 NFSEXITCODE2(error, nd);
5829 nfsrvd_seek(struct nfsrv_descript *nd, __unused int isdgram,
5843 off = fxdr_hyper(tl); tl += 2;
5850 nd->nd_repstat = NFSERR_BADXDR;
5851 if (nd->nd_repstat == 0 && vp->v_type == VDIR)
5852 nd->nd_repstat = NFSERR_ISDIR;
5853 if (nd->nd_repstat == 0 && vp->v_type != VREG)
5854 nd->nd_repstat = NFSERR_WRONGTYPE;
5855 if (nd->nd_repstat == 0 && off < 0)
5856 nd->nd_repstat = NFSERR_NXIO;
5857 if (nd->nd_repstat == 0) {
5861 nd->nd_repstat = nfsvno_getattr(vp, &at, nd, curthread, 1,
5864 if (nd->nd_repstat == 0 && (at.na_uid != nd->nd_cred->cr_uid ||
5866 nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred, exp,
5869 if (nd->nd_repstat != 0)
5873 nd->nd_repstat = nfsvno_seek(nd, vp, cmd, &off, content, &eof,
5874 nd->nd_cred, curthread);
5875 if (nd->nd_repstat == 0 && eof && content == NFSV4CONTENT_DATA &&
5877 nd->nd_repstat = NFSERR_NXIO;
5878 if (nd->nd_repstat == 0) {
5886 NFSEXITCODE2(error, nd);
5890 NFSEXITCODE2(error, nd);
5898 nfsrvd_getxattr(struct nfsrv_descript *nd, __unused int isdgram,
5912 nd->nd_repstat = NFSERR_BADXDR;
5916 nd->nd_repstat = NFSERR_NOXATTR;
5920 nd->nd_repstat = nfsrv_mtostr(nd, name, len);
5921 if (nd->nd_repstat == 0)
5922 nd->nd_repstat = nfsvno_getxattr(vp, name,
5923 nd->nd_maxresp, nd->nd_cred, nd->nd_flag,
5924 nd->nd_maxextsiz, p, &mp, &mpend, &len);
5925 if (nd->nd_repstat == ENOATTR)
5926 nd->nd_repstat = NFSERR_NOXATTR;
5927 else if (nd->nd_repstat == EOPNOTSUPP)
5928 nd->nd_repstat = NFSERR_NOTSUPP;
5929 if (nd->nd_repstat == 0) {
5933 nd->nd_mb->m_next = mp;
5934 nd->nd_mb = mpend;
5936 nd->nd_flag |= ND_EXTPG;
5937 nd->nd_bextpg = mpend->m_epg_npgs - 1;
5938 nd->nd_bpos = (char *)(void *)
5939 PHYS_TO_DMAP(mpend->m_epg_pa[nd->nd_bextpg]);
5940 off = (nd->nd_bextpg == 0) ?
5942 nd->nd_bpos += off + mpend->m_epg_last_len;
5943 nd->nd_bextpgsiz = PAGE_SIZE -
5946 nd->nd_bpos = mtod(mpend, char *) +
5953 if (nd->nd_repstat == 0)
5954 nd->nd_repstat = error;
5956 NFSEXITCODE2(0, nd);
5964 nfsrvd_setxattr(struct nfsrv_descript *nd, __unused int isdgram,
5977 NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED);
5981 nd->nd_repstat = NFSERR_BADXDR;
5985 nd->nd_repstat = NFSERR_NOXATTR;
5989 error = nfsrv_mtostr(nd, name, len);
5995 nd->nd_repstat = NFSERR_XATTR2BIG;
6001 &siz, nd->nd_cred, p);
6003 nd->nd_repstat = NFSERR_EXIST;
6008 &siz, nd->nd_cred, p);
6010 nd->nd_repstat = NFSERR_NOXATTR;
6015 nd->nd_repstat = NFSERR_BADXDR;
6017 if (nd->nd_repstat != 0)
6023 nd->nd_repstat = nfsvno_getattr(vp, &ova, nd, p, 1, &attrbits);
6024 if (nd->nd_repstat == 0) {
6025 nd->nd_repstat = nfsvno_setxattr(vp, name, len, nd->nd_md,
6026 nd->nd_dpos, nd->nd_cred, p);
6027 if (nd->nd_repstat == ENXIO)
6028 nd->nd_repstat = NFSERR_XATTR2BIG;
6030 if (nd->nd_repstat == 0 && len > 0)
6031 nd->nd_repstat = nfsm_advance(nd, NFSM_RNDUP(len), -1);
6032 if (nd->nd_repstat == 0)
6033 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, &attrbits);
6034 if (nd->nd_repstat == 0) {
6035 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_HYPER + NFSX_UNSIGNED);
6037 txdr_hyper(ova.na_filerev, tl); tl += 2;
6043 if (nd->nd_repstat == 0)
6044 nd->nd_repstat = error;
6046 NFSEXITCODE2(0, nd);
6054 nfsrvd_rmxattr(struct nfsrv_descript *nd, __unused int isdgram,
6069 nd->nd_repstat = NFSERR_BADXDR;
6073 nd->nd_repstat = NFSERR_NOXATTR;
6077 error = nfsrv_mtostr(nd, name, len);
6081 if ((nd->nd_flag & ND_IMPLIEDCLID) == 0) {
6092 nd->nd_repstat = nfsvno_getattr(vp, &ova, nd, p, 1, &attrbits);
6093 if (nd->nd_repstat == 0) {
6094 nd->nd_repstat = nfsvno_rmxattr(nd, vp, name, nd->nd_cred, p);
6095 if (nd->nd_repstat == ENOATTR)
6096 nd->nd_repstat = NFSERR_NOXATTR;
6098 if (nd->nd_repstat == 0)
6099 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1, &attrbits);
6100 if (nd->nd_repstat == 0) {
6101 NFSM_BUILD(tl, uint32_t *, 2 * NFSX_HYPER + NFSX_UNSIGNED);
6103 txdr_hyper(ova.na_filerev, tl); tl += 2;
6109 if (nd->nd_repstat == 0)
6110 nd->nd_repstat = error;
6112 NFSEXITCODE2(0, nd);
6120 nfsrvd_listxattr(struct nfsrv_descript *nd, __unused int isdgram,
6137 cookie = fxdr_hyper(tl); tl += 2;
6140 nd->nd_repstat = NFSERR_BADXDR;
6143 if (len > nd->nd_maxresp - NFS_MAXXDR)
6144 len = nd->nd_maxresp - NFS_MAXXDR;
6146 nd->nd_repstat = nfsvno_listxattr(vp, cookie, nd->nd_cred, p, &buf,
6148 if (nd->nd_repstat == EOPNOTSUPP)
6149 nd->nd_repstat = NFSERR_NOTSUPP;
6150 if (nd->nd_repstat == 0) {
6153 nd->nd_repstat = NFSERR_BADXDR;
6155 retlen = NFSX_HYPER + 2 * NFSX_UNSIGNED;
6156 if (nd->nd_repstat == 0 && len2 < retlen)
6157 nd->nd_repstat = NFSERR_TOOSMALL;
6158 if (nd->nd_repstat == 0) {
6162 NFSM_BUILD(tl, uint32_t *, NFSX_HYPER + 2 *
6164 txdr_hyper(cookie2, tl); tl += 2;
6177 nd->nd_repstat = NFSERR_INVAL;
6190 txdr_hyper(cookie2, tl); tl += 2;
6192 retlen += nfsm_strtom(nd, &buf[pos + 1], i);
6214 nd->nd_repstat = NFSERR_TOOSMALL;
6219 if (nd->nd_repstat == 0)
6220 nd->nd_repstat = error;
6222 NFSEXITCODE2(0, nd);
6230 nfsrvd_notsupp(struct nfsrv_descript *nd, __unused int isdgram,
6234 nd->nd_repstat = NFSERR_NOTSUPP;
6235 NFSEXITCODE2(0, nd);