Lines Matching refs:nd
77 static void nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
83 static void nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
93 nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
102 if (nd->nd_repstat) {
103 nfsrv_postopattr(nd, 1, &nva);
108 if ((nd->nd_flag & ND_NFSV4) &&
112 nd->nd_repstat = NFSERR_INVAL;
118 if (nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p,
124 if (nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp, p,
130 if (nfsvno_accchk(vp, VWRITE | VAPPEND, nd->nd_cred, exp, p,
140 if (nfsvno_accchk(vp, deletebit, nd->nd_cred, exp, p,
150 if (nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p,
155 if (nd->nd_flag & ND_NFSV3) {
156 getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
157 nfsrv_postopattr(nd, getret, &nva);
160 if (nd->nd_flag & ND_NFSV4) {
168 NFSEXITCODE2(0, nd);
172 NFSEXITCODE2(error, nd);
180 nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
194 if (nd->nd_repstat)
196 if (nd->nd_flag & ND_NFSV4) {
197 error = nfsrv_getattrbits(nd, &attrbits, NULL, NULL);
208 (void) nfsrv_putreferralattr(nd, &attrbits, refp, 1,
209 &nd->nd_repstat);
213 if (nd->nd_repstat == 0) {
234 nd->nd_repstat = nfsvno_accchk(vp, accmode,
235 nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
239 if (!nd->nd_repstat)
240 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
241 if (!nd->nd_repstat) {
242 if (nd->nd_flag & ND_NFSV4) {
244 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
245 if (!nd->nd_repstat)
246 nd->nd_repstat = nfsrv_checkgetattr(nd, vp,
247 &nva, &attrbits, nd->nd_cred, p);
248 if (nd->nd_repstat == 0) {
263 if ((nd->nd_repstat =
265 nd->nd_repstat = VOP_GETATTR(
266 tvp, &va, nd->nd_cred);
270 if (nd->nd_repstat == 0)
276 if (nd->nd_repstat == 0)
277 nd->nd_repstat = vfs_busy(mp, 0);
279 if (nd->nd_repstat == 0) {
280 (void)nfsvno_fillattr(nd, mp, vp, &nva,
281 &fh, 0, &attrbits, nd->nd_cred, p,
290 nfsrv_fillattr(nd, &nva);
298 NFSEXITCODE2(error, nd);
306 nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
317 if (nd->nd_repstat) {
318 nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
327 if (nd->nd_flag & ND_NFSV4) {
332 error = nfsrv_sattr(nd, vp, &nva, &attrbits, aclp, p);
335 preat_ret = nfsvno_getattr(vp, &nva2, nd->nd_cred, p, 1);
336 if (!nd->nd_repstat)
337 nd->nd_repstat = preat_ret;
338 if (nd->nd_flag & ND_NFSV3) {
345 if (!nd->nd_repstat && gcheck &&
348 nd->nd_repstat = NFSERR_NOT_SYNC;
349 if (nd->nd_repstat) {
354 nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
357 } else if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
358 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
365 if (!nd->nd_repstat) {
369 nd->nd_repstat = EROFS;
372 nd->nd_repstat = EINVAL;
373 else if (nva2.na_uid != nd->nd_cred->cr_uid ||
375 nd->nd_repstat = nfsvno_accchk(vp,
376 VWRITE, nd->nd_cred, exp, p,
381 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
382 nd->nd_repstat = nfsrv_checksetattr(vp, nd, &stateid,
385 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
395 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
397 if (!nd->nd_repstat) {
404 if (!nd->nd_repstat &&
408 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
410 if (!nd->nd_repstat)
413 if (!nd->nd_repstat &&
423 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
425 if (!nd->nd_repstat) {
432 if (!nd->nd_repstat &&
436 nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
438 if (!nd->nd_repstat)
443 if (!nd->nd_repstat && aclp->acl_cnt > 0 &&
445 nd->nd_repstat = nfsrv_setacl(vp, aclp, nd->nd_cred, p);
446 if (!nd->nd_repstat)
450 } else if (!nd->nd_repstat) {
451 nd->nd_repstat = nfsvno_setattr(vp, &nva, nd->nd_cred, p,
454 if (nd->nd_flag & (ND_NFSV2 | ND_NFSV3)) {
455 postat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
456 if (!nd->nd_repstat)
457 nd->nd_repstat = postat_ret;
463 if (nd->nd_flag & ND_NFSV3)
464 nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
465 else if (nd->nd_flag & ND_NFSV4)
466 (void) nfsrv_putattrbit(nd, &retbits);
467 else if (!nd->nd_repstat)
468 nfsrv_fillattr(nd, &nva);
471 NFSEXITCODE2(0, nd);
478 if (nd->nd_flag & ND_NFSV4) {
484 (void) nfsrv_putattrbit(nd, &retbits);
486 NFSEXITCODE2(error, nd);
495 nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
506 if (nd->nd_repstat) {
507 nfsrv_postopattr(nd, dattr_ret, &dattr);
515 if (dp->v_type == VLNK && (nd->nd_flag & ND_NFSV4)) {
516 nd->nd_repstat = NFSERR_SYMLINK;
521 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
524 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
530 if (!nd->nd_repstat) {
531 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
536 if (nd->nd_repstat) {
538 if (nd->nd_flag & ND_NFSV3)
540 nd->nd_cred, p, 0);
543 if (nd->nd_flag & ND_NFSV3)
544 nfsrv_postopattr(nd, dattr_ret, &dattr);
551 if ((nd->nd_flag & ND_NFSV4) != 0 && !NFSVNO_EXPORTED(exp) &&
557 nd->nd_repstat = ENOENT;
558 if (nd->nd_repstat == 0)
559 nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
560 if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
561 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
562 if (vpp != NULL && nd->nd_repstat == 0)
567 if (nd->nd_flag & ND_NFSV3)
568 dattr_ret = nfsvno_getattr(dirp, &dattr, nd->nd_cred,
572 if (nd->nd_repstat) {
573 if (nd->nd_flag & ND_NFSV3)
574 nfsrv_postopattr(nd, dattr_ret, &dattr);
577 if (nd->nd_flag & ND_NFSV2) {
578 (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
579 nfsrv_fillattr(nd, &nva);
580 } else if (nd->nd_flag & ND_NFSV3) {
581 (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
582 nfsrv_postopattr(nd, 0, &nva);
583 nfsrv_postopattr(nd, dattr_ret, &dattr);
587 NFSEXITCODE2(error, nd);
595 nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
603 if (nd->nd_repstat) {
604 nfsrv_postopattr(nd, getret, &nva);
608 if (nd->nd_flag & ND_NFSV2)
609 nd->nd_repstat = ENXIO;
611 nd->nd_repstat = EINVAL;
613 if (!nd->nd_repstat)
614 nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred, p,
616 if (nd->nd_flag & ND_NFSV3)
617 getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
619 if (nd->nd_flag & ND_NFSV3)
620 nfsrv_postopattr(nd, getret, &nva);
621 if (nd->nd_repstat)
625 mbuf_setnext(nd->nd_mb, mp);
626 nd->nd_mb = mpend;
627 nd->nd_bpos = NFSMTOD(mpend, caddr_t) + mbuf_len(mpend);
630 NFSEXITCODE2(0, nd);
638 nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
651 if (nd->nd_repstat) {
652 nfsrv_postopattr(nd, getret, &nva);
655 if (nd->nd_flag & ND_NFSV2) {
659 } else if (nd->nd_flag & ND_NFSV3) {
668 if (reqlen > NFS_SRVMAXDATA(nd)) {
669 reqlen = NFS_SRVMAXDATA(nd);
674 if (nd->nd_flag & ND_NFSV4) {
679 stp->ls_uid = nd->nd_cred->cr_uid;
683 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
684 if ((nd->nd_flag & ND_NFSV41) != 0)
685 clientid.qval = nd->nd_clientid.qval;
686 else if (nd->nd_clientid.qval != clientid.qval)
689 if ((nd->nd_flag & ND_NFSV41) != 0)
691 nd->nd_flag |= ND_IMPLIEDCLID;
692 nd->nd_clientid.qval = clientid.qval;
706 if (nd->nd_flag & ND_NFSV3)
707 nd->nd_repstat = EINVAL;
709 nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
712 getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
713 if (!nd->nd_repstat)
714 nd->nd_repstat = getret;
715 if (!nd->nd_repstat &&
716 (nva.na_uid != nd->nd_cred->cr_uid ||
718 nd->nd_repstat = nfsvno_accchk(vp, VREAD,
719 nd->nd_cred, exp, p,
721 if (nd->nd_repstat)
722 nd->nd_repstat = nfsvno_accchk(vp, VEXEC,
723 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
726 if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
727 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
728 &stateid, exp, nd, p);
729 if (nd->nd_repstat) {
731 if (nd->nd_flag & ND_NFSV3)
732 nfsrv_postopattr(nd, getret, &nva);
747 nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred, p,
749 if (!(nd->nd_flag & ND_NFSV4)) {
750 getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
751 if (!nd->nd_repstat)
752 nd->nd_repstat = getret;
754 if (nd->nd_repstat) {
757 if (nd->nd_flag & ND_NFSV3)
758 nfsrv_postopattr(nd, getret, &nva);
763 if (nd->nd_flag & ND_NFSV2) {
764 nfsrv_fillattr(nd, &nva);
767 if (nd->nd_flag & ND_NFSV3) {
768 nfsrv_postopattr(nd, getret, &nva);
780 mbuf_setnext(nd->nd_mb, m3);
781 nd->nd_mb = m2;
782 nd->nd_bpos = NFSMTOD(m2, caddr_t) + mbuf_len(m2);
786 NFSEXITCODE2(0, nd);
790 NFSEXITCODE2(error, nd);
798 nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
813 if (nd->nd_repstat) {
814 nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
817 if (nd->nd_flag & ND_NFSV2) {
822 } else if (nd->nd_flag & ND_NFSV3) {
834 stp->ls_uid = nd->nd_cred->cr_uid;
838 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
839 if ((nd->nd_flag & ND_NFSV41) != 0)
840 clientid.qval = nd->nd_clientid.qval;
841 else if (nd->nd_clientid.qval != clientid.qval)
844 if ((nd->nd_flag & ND_NFSV41) != 0)
846 nd->nd_flag |= ND_IMPLIEDCLID;
847 nd->nd_clientid.qval = clientid.qval;
869 mp = nd->nd_md;
870 i = NFSMTOD(mp, caddr_t) + mbuf_len(mp) - nd->nd_dpos;
887 nd->nd_repstat = EIO;
888 if (vnode_vtype(vp) != VREG && !nd->nd_repstat) {
889 if (nd->nd_flag & ND_NFSV3)
890 nd->nd_repstat = EINVAL;
892 nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
895 forat_ret = nfsvno_getattr(vp, &forat, nd->nd_cred, p, 1);
896 if (!nd->nd_repstat)
897 nd->nd_repstat = forat_ret;
898 if (!nd->nd_repstat &&
899 (forat.na_uid != nd->nd_cred->cr_uid ||
901 nd->nd_repstat = nfsvno_accchk(vp, VWRITE,
902 nd->nd_cred, exp, p,
904 if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
905 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
906 &stateid, exp, nd, p);
908 if (nd->nd_repstat) {
910 if (nd->nd_flag & ND_NFSV3)
911 nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
921 nd->nd_repstat = nfsvno_write(vp, off, retlen, cnt, stable,
922 nd->nd_md, nd->nd_dpos, nd->nd_cred, p);
923 error = nfsm_advance(nd, NFSM_RNDUP(retlen), -1);
927 if (nd->nd_flag & ND_NFSV4)
930 aftat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
932 if (!nd->nd_repstat)
933 nd->nd_repstat = aftat_ret;
934 if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) {
935 if (nd->nd_flag & ND_NFSV3)
936 nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
937 if (nd->nd_repstat)
958 } else if (!nd->nd_repstat)
959 nfsrv_fillattr(nd, &nva);
962 NFSEXITCODE2(0, nd);
966 NFSEXITCODE2(error, nd);
977 nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
994 if (nd->nd_repstat) {
995 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
998 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
1001 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1004 if (!nd->nd_repstat) {
1006 if (nd->nd_flag & ND_NFSV2) {
1035 error = nfsrv_sattr(nd, NULL, &nva, NULL, NULL, p);
1049 if (nd->nd_repstat) {
1051 if (nd->nd_flag & ND_NFSV3) {
1052 dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred,
1054 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1061 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
1063 if (nd->nd_flag & ND_NFSV2) {
1067 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
1071 if (nd->nd_repstat) {
1072 if (nd->nd_flag & ND_NFSV3)
1073 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1080 if (!(nd->nd_flag & ND_NFSV2)) {
1084 nd->nd_repstat = EEXIST;
1100 nd->nd_repstat = nfsvno_createsub(nd, &named, &vp, &nva,
1103 if (!nd->nd_repstat) {
1104 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
1105 if (!nd->nd_repstat)
1106 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
1109 if (!nd->nd_repstat) {
1114 if (nd->nd_flag & ND_NFSV2) {
1115 if (!nd->nd_repstat) {
1116 (void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 0);
1117 nfsrv_fillattr(nd, &nva);
1120 if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0]
1122 nd->nd_repstat = EEXIST;
1123 diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
1125 if (!nd->nd_repstat) {
1126 (void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 1);
1127 nfsrv_postopattr(nd, 0, &nva);
1129 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1133 NFSEXITCODE2(0, nd);
1138 NFSEXITCODE2(error, nd);
1146 nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
1165 if (nd->nd_repstat) {
1166 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1177 if (nd->nd_flag & ND_NFSV4) {
1183 error = nfsvno_getsymlink(nd, &nva, p, &pathcp,
1202 nd->nd_repstat = NFSERR_BADTYPE;
1210 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, cnflags | NOCACHE);
1212 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1215 if (!nd->nd_repstat) {
1216 if (nd->nd_flag & ND_NFSV3) {
1220 error = nfsrv_sattr(nd, NULL, &nva, &attrbits, aclp, p);
1224 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV3) &&
1233 dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
1234 if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
1238 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
1240 if (nd->nd_repstat) {
1248 if (nd->nd_flag & ND_NFSV3)
1249 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1267 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
1268 if (nd->nd_repstat) {
1270 if (nd->nd_flag & ND_NFSV3)
1272 nd->nd_cred, p, 0);
1278 if (nd->nd_flag & ND_NFSV3)
1279 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1284 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
1286 if ((nd->nd_flag & ND_NFSV4) && (vtyp == VDIR || vtyp == VLNK)) {
1288 nfsrvd_mkdirsub(nd, &named, &nva, fhp, vpp, dirp,
1296 nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
1307 nd->nd_repstat = nfsvno_mknod(&named, &nva, nd->nd_cred, p);
1308 if (!nd->nd_repstat) {
1310 nfsrv_fixattr(nd, vp, &nva, aclp, p, &attrbits, exp);
1311 nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
1312 if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat)
1313 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
1315 if (vpp != NULL && nd->nd_repstat == 0) {
1322 diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
1324 if (!nd->nd_repstat) {
1325 if (nd->nd_flag & ND_NFSV3) {
1326 (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 1);
1327 nfsrv_postopattr(nd, 0, &nva);
1334 (void) nfsrv_putattrbit(nd, &attrbits);
1337 if (nd->nd_flag & ND_NFSV3)
1338 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1344 NFSEXITCODE2(0, nd);
1356 NFSEXITCODE2(error, nd);
1364 nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
1375 if (nd->nd_repstat) {
1376 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1379 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, DELETE,
1382 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1388 if (!nd->nd_repstat) {
1389 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
1395 if (!(nd->nd_flag & ND_NFSV2)) {
1397 nd->nd_cred, p, 0);
1403 if (!nd->nd_repstat) {
1404 if (nd->nd_flag & ND_NFSV4) {
1406 nd->nd_repstat = nfsvno_rmdirsub(&named, 1,
1407 nd->nd_cred, p, exp);
1409 nd->nd_repstat = nfsvno_removesub(&named, 1,
1410 nd->nd_cred, p, exp);
1411 } else if (nd->nd_procnum == NFSPROC_RMDIR) {
1412 nd->nd_repstat = nfsvno_rmdirsub(&named, 0,
1413 nd->nd_cred, p, exp);
1415 nd->nd_repstat = nfsvno_removesub(&named, 0,
1416 nd->nd_cred, p, exp);
1419 if (!(nd->nd_flag & ND_NFSV2)) {
1421 diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred,
1425 if (nd->nd_flag & ND_NFSV3) {
1426 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1428 } else if (!nd->nd_repstat) {
1438 NFSEXITCODE2(error, nd);
1446 nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
1462 if (nd->nd_repstat) {
1463 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1464 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1467 if (!(nd->nd_flag & ND_NFSV2))
1468 fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p, 1);
1471 NFSNAMEICNDSET(&fromnd.ni_cnd, nd->nd_cred, DELETE, WANTPARENT | SAVESTART);
1473 error = nfsrv_parsename(nd, bufp, hashp, &fromnd.ni_pathlen);
1486 if (nd->nd_flag & ND_NFSV4) {
1491 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
1494 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
1500 error = nfsrv_mtofh(nd, &tfh);
1516 tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
1521 nd->nd_cred->cr_uid = nd->nd_saveduid;
1522 nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL,
1526 nd->nd_cred, p, 1);
1531 NFSNAMEICNDSET(&tond.ni_cnd, nd->nd_cred, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART);
1533 if (!nd->nd_repstat) {
1534 error = nfsrv_parsename(nd, tbufp, hashp, &tond.ni_pathlen);
1544 if (nd->nd_repstat) {
1545 if (nd->nd_flag & ND_NFSV3) {
1546 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret,
1548 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret,
1562 nd->nd_repstat = nfsvno_namei(nd, &fromnd, dp, 0, exp, p, &fdirp);
1563 if (nd->nd_repstat) {
1564 if (nd->nd_flag & ND_NFSV3) {
1565 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret,
1567 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret,
1579 nd->nd_repstat = nfsvno_namei(nd, &tond, tdp, 0, &tnes, p, &tdirp);
1580 nd->nd_repstat = nfsvno_rename(&fromnd, &tond, nd->nd_repstat,
1581 nd->nd_flag, nd->nd_cred, p);
1583 fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd->nd_cred, p,
1586 tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd->nd_cred, p,
1592 if (nd->nd_flag & ND_NFSV3) {
1593 nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1594 nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1595 } else if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
1609 NFSEXITCODE2(error, nd);
1617 nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
1631 if (nd->nd_repstat) {
1632 nfsrv_postopattr(nd, getret, &at);
1633 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1638 if (nd->nd_flag & ND_NFSV4)
1639 nd->nd_repstat = NFSERR_ISDIR;
1641 nd->nd_repstat = NFSERR_INVAL;
1645 if (!nd->nd_repstat) {
1646 if (nd->nd_flag & ND_NFSV4) {
1650 error = nfsrv_mtofh(nd, &dfh);
1656 nfsd_fhtovp(nd, &dfh, LK_EXCLUSIVE, &dp, &tnes, NULL, 0,
1662 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
1664 if (!nd->nd_repstat) {
1666 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1674 if (!nd->nd_repstat) {
1675 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, &tnes,
1684 if (nd->nd_flag & ND_NFSV2) {
1689 nd->nd_cred, p, 0);
1692 if (!nd->nd_repstat)
1693 nd->nd_repstat = nfsvno_link(&named, vp, nd->nd_cred, p, exp);
1694 if (nd->nd_flag & ND_NFSV3)
1695 getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 0);
1697 diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
1701 if (nd->nd_flag & ND_NFSV3) {
1702 nfsrv_postopattr(nd, getret, &at);
1703 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1704 } else if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
1713 NFSEXITCODE2(error, nd);
1721 nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
1732 if (nd->nd_repstat) {
1733 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1739 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
1742 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1743 if (!error && !nd->nd_repstat)
1744 error = nfsvno_getsymlink(nd, &nva, p, &pathcp, &pathlen);
1750 if (!nd->nd_repstat) {
1751 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
1756 if (dirp != NULL && !(nd->nd_flag & ND_NFSV3)) {
1765 if (!nd->nd_repstat) {
1767 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
1769 nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
1773 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
1779 if (nd->nd_flag & ND_NFSV3) {
1780 if (!nd->nd_repstat) {
1781 (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 1);
1782 nfsrv_postopattr(nd, 0, &nva);
1784 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1788 NFSEXITCODE2(error, nd);
1796 nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
1805 nd->nd_repstat = nfsvno_symlink(ndp, nvap, pathcp, pathlen,
1806 !(nd->nd_flag & ND_NFSV2), nd->nd_saveduid, nd->nd_cred, p, exp);
1807 if (!nd->nd_repstat && !(nd->nd_flag & ND_NFSV2)) {
1808 nfsrv_fixattr(nd, ndp->ni_vp, nvap, aclp, p, attrbitp, exp);
1809 if (nd->nd_flag & ND_NFSV3) {
1810 nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p);
1811 if (!nd->nd_repstat)
1812 nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
1813 nvap, nd->nd_cred, p, 1);
1815 if (vpp != NULL && nd->nd_repstat == 0) {
1822 *diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
1825 if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
1831 (void) nfsrv_putattrbit(nd, attrbitp);
1834 NFSEXITCODE2(0, nd);
1841 nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
1853 if (nd->nd_repstat) {
1854 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1857 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
1860 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
1863 if (!nd->nd_repstat) {
1865 if (nd->nd_flag & ND_NFSV3) {
1866 error = nfsrv_sattr(nd, NULL, &nva, NULL, NULL, p);
1874 if (!nd->nd_repstat) {
1875 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
1880 if (dirp != NULL && !(nd->nd_flag & ND_NFSV3)) {
1884 if (nd->nd_repstat) {
1886 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
1890 if (nd->nd_flag & ND_NFSV3)
1891 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
1896 dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
1901 nfsrvd_mkdirsub(nd, &named, &nva, fhp, vpp, dirp, &dirfor, &diraft,
1904 if (nd->nd_flag & ND_NFSV3) {
1905 if (!nd->nd_repstat) {
1906 (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 1);
1907 nfsrv_postopattr(nd, 0, &nva);
1909 nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
1910 } else if (!nd->nd_repstat) {
1911 (void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
1912 nfsrv_fillattr(nd, &nva);
1916 NFSEXITCODE2(0, nd);
1921 NFSEXITCODE2(error, nd);
1929 nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
1939 nd->nd_repstat = nfsvno_mkdir(ndp, nvap, nd->nd_saveduid,
1940 nd->nd_cred, p, exp);
1941 if (!nd->nd_repstat) {
1943 nfsrv_fixattr(nd, vp, nvap, aclp, p, attrbitp, exp);
1944 nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
1945 if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
1946 nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred,
1948 if (vpp && !nd->nd_repstat) {
1956 *diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
1959 if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
1965 (void) nfsrv_putattrbit(nd, attrbitp);
1968 NFSEXITCODE2(0, nd);
1975 nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
1983 if (nd->nd_repstat) {
1984 nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
1990 if (nd->nd_flag & ND_NFSV3)
2005 if (nd->nd_flag & ND_NFSV3)
2006 for_ret = nfsvno_getattr(vp, &bfor, nd->nd_cred, p, 1);
2007 nd->nd_repstat = nfsvno_fsync(vp, off, cnt, nd->nd_cred, p);
2008 if (nd->nd_flag & ND_NFSV3) {
2009 aft_ret = nfsvno_getattr(vp, &aft, nd->nd_cred, p, 1);
2010 nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
2013 if (!nd->nd_repstat) {
2020 NFSEXITCODE2(0, nd);
2024 NFSEXITCODE2(error, nd);
2032 nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
2042 if (nd->nd_repstat) {
2043 nfsrv_postopattr(nd, getret, &at);
2047 nd->nd_repstat = nfsvno_statfs(vp, sf);
2048 getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
2050 if (nd->nd_flag & ND_NFSV3)
2051 nfsrv_postopattr(nd, getret, &at);
2052 if (nd->nd_repstat)
2054 if (nd->nd_flag & ND_NFSV2) {
2082 NFSEXITCODE2(0, nd);
2090 nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
2098 if (nd->nd_repstat) {
2099 nfsrv_postopattr(nd, getret, &at);
2102 getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
2105 nfsrv_postopattr(nd, getret, &at);
2121 NFSEXITCODE2(0, nd);
2129 nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
2137 if (nd->nd_repstat) {
2138 nfsrv_postopattr(nd, getret, &at);
2141 nd->nd_repstat = nfsvno_pathconf(vp, _PC_LINK_MAX, &linkmax,
2142 nd->nd_cred, p);
2143 if (!nd->nd_repstat)
2144 nd->nd_repstat = nfsvno_pathconf(vp, _PC_NAME_MAX, &namemax,
2145 nd->nd_cred, p);
2146 if (!nd->nd_repstat)
2147 nd->nd_repstat=nfsvno_pathconf(vp, _PC_CHOWN_RESTRICTED,
2148 &chownres, nd->nd_cred, p);
2149 if (!nd->nd_repstat)
2150 nd->nd_repstat = nfsvno_pathconf(vp, _PC_NO_TRUNC, ¬runc,
2151 nd->nd_cred, p);
2152 getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
2154 nfsrv_postopattr(nd, getret, &at);
2155 if (!nd->nd_repstat) {
2172 NFSEXITCODE2(0, nd);
2180 nfsrvd_lock(struct nfsrv_descript *nd, __unused int isdgram,
2208 nd->nd_repstat = NFSERR_BADXDR;
2223 nd->nd_repstat = NFSERR_BADXDR;
2229 stp->ls_op = nd->nd_rp;
2238 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2239 if ((nd->nd_flag & ND_NFSV41) != 0)
2240 clientid.qval = nd->nd_clientid.qval;
2241 else if (nd->nd_clientid.qval != clientid.qval)
2244 if ((nd->nd_flag & ND_NFSV41) != 0)
2246 nd->nd_flag |= ND_IMPLIEDCLID;
2247 nd->nd_clientid.qval = clientid.qval;
2249 error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
2257 stp->ls_op = nd->nd_rp;
2265 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2266 if ((nd->nd_flag & ND_NFSV41) != 0)
2267 clientid.qval = nd->nd_clientid.qval;
2268 else if (nd->nd_clientid.qval != clientid.qval)
2271 if ((nd->nd_flag & ND_NFSV41) != 0)
2273 nd->nd_flag |= ND_IMPLIEDCLID;
2274 nd->nd_clientid.qval = clientid.qval;
2285 nd->nd_repstat = NFSERR_INVAL;
2289 stp->ls_uid = nd->nd_cred->cr_uid;
2294 if (!nd->nd_repstat && vnode_vtype(vp) != VREG) {
2296 nd->nd_repstat = NFSERR_ISDIR;
2298 nd->nd_repstat = NFSERR_INVAL;
2300 if (!nd->nd_repstat) {
2302 nd->nd_repstat = nfsvno_accchk(vp, VWRITE,
2303 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2306 nd->nd_repstat = nfsvno_accchk(vp, VREAD,
2307 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2309 if (nd->nd_repstat)
2310 nd->nd_repstat = nfsvno_accchk(vp, VEXEC,
2311 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2321 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, &cf, clientid,
2322 &stateid, exp, nd, p);
2327 if (!nd->nd_repstat) {
2331 } else if (nd->nd_repstat == NFSERR_DENIED) {
2347 (void) nfsm_strtom(nd, cf.cl_owner, cf.cl_ownerlen);
2350 NFSEXITCODE2(0, nd);
2356 NFSEXITCODE2(error, nd);
2364 nfsrvd_lockt(struct nfsrv_descript *nd, __unused int isdgram,
2380 nd->nd_repstat = NFSERR_BADXDR;
2388 stp->ls_uid = nd->nd_cred->cr_uid;
2402 nd->nd_repstat = NFSERR_BADXDR;
2413 nd->nd_repstat = NFSERR_INVAL;
2418 nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2419 if ((nd->nd_flag & ND_NFSV41) != 0)
2420 clientid.qval = nd->nd_clientid.qval;
2421 else if (nd->nd_clientid.qval != clientid.qval)
2424 if ((nd->nd_flag & ND_NFSV41) != 0)
2426 nd->nd_flag |= ND_IMPLIEDCLID;
2427 nd->nd_clientid.qval = clientid.qval;
2429 error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
2432 if (!nd->nd_repstat && vnode_vtype(vp) != VREG) {
2434 nd->nd_repstat = NFSERR_ISDIR;
2436 nd->nd_repstat = NFSERR_INVAL;
2438 if (!nd->nd_repstat)
2439 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, &cf, clientid,
2440 &stateid, exp, nd, p);
2441 if (nd->nd_repstat) {
2442 if (nd->nd_repstat == NFSERR_DENIED) {
2458 (void) nfsm_strtom(nd, cf.cl_owner, cf.cl_ownerlen);
2464 NFSEXITCODE2(0, nd);
2470 NFSEXITCODE2(error, nd);
2478 nfsrvd_locku(struct nfsrv_descript *nd, __unused int isdgram,
2497 stp->ls_op = nd->nd_rp;
2509 nd->nd_repstat = NFSERR_BADXDR;
2515 stp->ls_uid = nd->nd_cred->cr_uid;
2529 nd->nd_repstat = NFSERR_INVAL;
2533 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2534 if ((nd->nd_flag & ND_NFSV41) != 0)
2535 clientid.qval = nd->nd_clientid.qval;
2536 else if (nd->nd_clientid.qval != clientid.qval)
2539 if ((nd->nd_flag & ND_NFSV41) != 0)
2541 nd->nd_flag |= ND_IMPLIEDCLID;
2542 nd->nd_clientid.qval = clientid.qval;
2544 if (!nd->nd_repstat && vnode_vtype(vp) != VREG) {
2546 nd->nd_repstat = NFSERR_ISDIR;
2548 nd->nd_repstat = NFSERR_INVAL;
2555 nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
2556 &stateid, exp, nd, p);
2561 if (!nd->nd_repstat) {
2568 NFSEXITCODE2(error, nd);
2576 nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
2607 nd->nd_repstat = NFSERR_BADXDR;
2613 stp->ls_op = nd->nd_rp;
2615 stp->ls_uid = nd->nd_cred->cr_uid;
2620 NFSV4OPEN_WANTPUSHDELEG)) != 0 && (nd->nd_flag & ND_NFSV41) != 0) {
2662 nd->nd_repstat = NFSERR_INVAL;
2678 nd->nd_repstat = NFSERR_INVAL;
2682 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
2683 if ((nd->nd_flag & ND_NFSV41) != 0)
2684 clientid.qval = nd->nd_clientid.qval;
2685 else if (nd->nd_clientid.qval != clientid.qval)
2688 if ((nd->nd_flag & ND_NFSV41) != 0)
2690 nd->nd_flag |= ND_IMPLIEDCLID;
2691 nd->nd_clientid.qval = clientid.qval;
2693 error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
2699 if (!nd->nd_repstat)
2700 nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
2709 error = nfsv4_sattr(nd, NULL, &nva, &attrbits, aclp, p);
2718 if (!nd->nd_repstat && NFSVNO_ISSETGID(&nva) &&
2721 if (!nd->nd_repstat)
2722 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
2733 error = nfsv4_sattr(nd, vp, &nva, &attrbits, aclp, p);
2738 nd->nd_repstat = NFSERR_INVAL;
2745 if (nd->nd_repstat == 0 && NFSVNO_ISSETGID(&nva) &&
2748 if (nd->nd_repstat == 0)
2749 nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
2752 nd->nd_repstat = NFSERR_BADXDR;
2756 nd->nd_repstat = NFSERR_BADXDR;
2777 if (!nd->nd_repstat && create == NFSV4OPEN_CREATE &&
2779 nd->nd_repstat = NFSERR_INVAL;
2780 if (nd->nd_repstat) {
2781 nd->nd_repstat = nfsrv_opencheck(clientid,
2782 &stateid, stp, NULL, nd, p, nd->nd_repstat);
2786 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
2789 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
2792 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
2800 NFSEXITCODE2(error, nd);
2803 if (!nd->nd_repstat) {
2804 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp,
2825 if (named.ni_vp && !nd->nd_repstat)
2826 nd->nd_repstat = EEXIST;
2838 nfsvno_open(nd, &named, clientid, &stateid, stp,
2840 nd->nd_cred, p, exp, &vp);
2855 nd->nd_repstat = NFSERR_BADXDR;
2861 if (nd->nd_repstat == 0 && create == NFSV4OPEN_CREATE)
2862 nd->nd_repstat = NFSERR_INVAL;
2867 nd->nd_repstat = nfsrv_opencheck(clientid, &stateid,
2868 stp, vp, nd, p, nd->nd_repstat);
2870 nd->nd_repstat = NFSERR_PERM;
2872 nd->nd_repstat = NFSERR_BADXDR;
2879 if (!nd->nd_repstat && vnode_vtype(vp) != VREG) {
2884 nd->nd_repstat = (vp->v_type == VDIR) ? NFSERR_ISDIR : NFSERR_SYMLINK;
2886 if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_WRITEACCESS))
2887 nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred,
2889 if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_READACCESS)) {
2890 nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred,
2892 if (nd->nd_repstat)
2893 nd->nd_repstat = nfsvno_accchk(vp, VEXEC,
2894 nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
2898 if (!nd->nd_repstat) {
2899 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
2900 if (!nd->nd_repstat) {
2905 if (!nd->nd_repstat && exclusive_flag && (cverf[0] != tverf[0] ||
2907 nd->nd_repstat = EEXIST;
2911 if (!nd->nd_repstat)
2912 nd->nd_repstat = nfsrv_openctrl(nd, vp, &stp, clientid, &stateid,
2924 if (!nd->nd_repstat && dirp)
2925 nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p,
2927 if (!nd->nd_repstat) {
2946 (void) nfsrv_putattrbit(nd, &attrbits);
2994 (void) nfsm_strtom(nd, "OWNER@", 6);
3005 NFSEXITCODE2(0, nd);
3014 NFSEXITCODE2(error, nd);
3022 nfsrvd_close(struct nfsrv_descript *nd, __unused int isdgram,
3034 stp->ls_op = nd->nd_rp;
3035 stp->ls_uid = nd->nd_cred->cr_uid;
3042 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3043 if ((nd->nd_flag & ND_NFSV41) != 0)
3044 clientid.qval = nd->nd_clientid.qval;
3045 else if (nd->nd_clientid.qval != clientid.qval)
3048 if ((nd->nd_flag & ND_NFSV41) != 0)
3050 nd->nd_flag |= ND_IMPLIEDCLID;
3051 nd->nd_clientid.qval = clientid.qval;
3053 nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
3055 if (!nd->nd_repstat) {
3060 NFSEXITCODE2(0, nd);
3064 NFSEXITCODE2(error, nd);
3072 nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused int isdgram,
3079 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3080 nd->nd_repstat = NFSERR_WRONGSEC;
3086 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3087 if ((nd->nd_flag & ND_NFSV41) != 0)
3088 clientid.qval = nd->nd_clientid.qval;
3089 else if (nd->nd_clientid.qval != clientid.qval)
3092 if ((nd->nd_flag & ND_NFSV41) != 0)
3094 nd->nd_flag |= ND_IMPLIEDCLID;
3095 nd->nd_clientid.qval = clientid.qval;
3097 nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
3098 NFSV4OP_DELEGPURGE, nd->nd_cred, p);
3100 NFSEXITCODE2(error, nd);
3108 nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused int isdgram,
3121 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3122 if ((nd->nd_flag & ND_NFSV41) != 0)
3123 clientid.qval = nd->nd_clientid.qval;
3124 else if (nd->nd_clientid.qval != clientid.qval)
3127 if ((nd->nd_flag & ND_NFSV41) != 0)
3129 nd->nd_flag |= ND_IMPLIEDCLID;
3130 nd->nd_clientid.qval = clientid.qval;
3132 nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
3133 NFSV4OP_DELEGRETURN, nd->nd_cred, p);
3136 NFSEXITCODE2(error, nd);
3144 nfsrvd_getfh(struct nfsrv_descript *nd, __unused int isdgram,
3149 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
3151 if (!nd->nd_repstat)
3152 (void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 0);
3153 NFSEXITCODE2(0, nd);
3161 nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused int isdgram,
3170 if ((nd->nd_flag & ND_NFSV41) != 0) {
3171 nd->nd_repstat = NFSERR_NOTSUPP;
3176 stp->ls_op = nd->nd_rp;
3177 stp->ls_uid = nd->nd_cred->cr_uid;
3186 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3187 if ((nd->nd_flag & ND_NFSV41) != 0)
3188 clientid.qval = nd->nd_clientid.qval;
3189 else if (nd->nd_clientid.qval != clientid.qval)
3192 if ((nd->nd_flag & ND_NFSV41) != 0)
3194 nd->nd_flag |= ND_IMPLIEDCLID;
3195 nd->nd_clientid.qval = clientid.qval;
3197 nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
3198 if (!nd->nd_repstat) {
3205 NFSEXITCODE2(error, nd);
3213 nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unused int isdgram,
3230 stp->ls_op = nd->nd_rp;
3231 stp->ls_uid = nd->nd_cred->cr_uid;
3250 nd->nd_repstat = NFSERR_BADXDR;
3266 nd->nd_repstat = NFSERR_BADXDR;
3271 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3272 if ((nd->nd_flag & ND_NFSV41) != 0)
3273 clientid.qval = nd->nd_clientid.qval;
3274 else if (nd->nd_clientid.qval != clientid.qval)
3277 if ((nd->nd_flag & ND_NFSV41) != 0)
3279 nd->nd_flag |= ND_IMPLIEDCLID;
3280 nd->nd_clientid.qval = clientid.qval;
3282 if (!nd->nd_repstat)
3283 nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
3284 nd, p);
3285 if (!nd->nd_repstat) {
3292 NFSEXITCODE2(error, nd);
3300 nfsrvd_renew(struct nfsrv_descript *nd, __unused int isdgram,
3307 if ((nd->nd_flag & ND_NFSV41) != 0) {
3308 nd->nd_repstat = NFSERR_NOTSUPP;
3311 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3312 nd->nd_repstat = NFSERR_WRONGSEC;
3318 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3319 if ((nd->nd_flag & ND_NFSV41) != 0)
3320 clientid.qval = nd->nd_clientid.qval;
3321 else if (nd->nd_clientid.qval != clientid.qval)
3324 if ((nd->nd_flag & ND_NFSV41) != 0)
3326 nd->nd_flag |= ND_IMPLIEDCLID;
3327 nd->nd_clientid.qval = clientid.qval;
3329 nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_RENEWOP|CLOPS_RENEW),
3330 NULL, NULL, (nfsquad_t)((u_quad_t)0), 0, nd, p);
3332 NFSEXITCODE2(error, nd);
3340 nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
3357 NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
3360 error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
3366 if (!nd->nd_repstat) {
3367 nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
3374 if (nd->nd_repstat)
3380 nd->nd_repstat = nfsvno_getfh(vp, (fhandle_t *)fh.nfsrvfh_data, p);
3382 savflag = nd->nd_flag;
3383 if (!nd->nd_repstat) {
3384 nfsd_fhtovp(nd, &fh, LK_SHARED, &vp, &retnes, NULL, 0, p);
3388 nd->nd_flag = savflag;
3389 if (nd->nd_repstat)
3406 (void) nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3415 (void) nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3424 (void) nfsm_strtom(nd, nfsgss_mechlist[KERBV_MECH].str,
3435 NFSEXITCODE2(error, nd);
3443 nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
3454 if ((nd->nd_flag & ND_NFSV41) != 0) {
3455 nd->nd_repstat = NFSERR_NOTSUPP;
3458 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3459 nd->nd_repstat = NFSERR_WRONGSEC;
3467 nd->nd_repstat = NFSERR_BADXDR;
3471 if (nd->nd_flag & ND_GSS)
3472 i += nd->nd_princlen;
3483 error = nfsrv_mtostr(nd, clp->lc_id, idlen);
3486 if (nd->nd_flag & ND_GSS) {
3488 if (nd->nd_flag & ND_GSSINTEGRITY)
3490 else if (nd->nd_flag & ND_GSSPRIVACY)
3495 if ((nd->nd_flag & ND_GSS) && nd->nd_princlen > 0) {
3497 clp->lc_namelen = nd->nd_princlen;
3499 NFSBCOPY(nd->nd_principal, clp->lc_name, clp->lc_namelen);
3501 clp->lc_uid = nd->nd_cred->cr_uid;
3502 clp->lc_gid = nd->nd_cred->cr_gid;
3506 error = nfsrv_getclientipaddr(nd, clp);
3519 nd->nd_repstat = nfsrv_setclient(nd, &clp, &clientid, &confirm, p);
3520 if (nd->nd_repstat == NFSERR_CLIDINUSE) {
3522 (void) nfsm_strtom(nd, "tcp", 3);
3524 (void) nfsm_strtom(nd, "udp", 3);
3531 (void) nfsm_strtom(nd, addrbuf, strlen(addrbuf));
3539 nd->nd_repstat) {
3548 NFSEXITCODE2(0, nd);
3557 NFSEXITCODE2(error, nd);
3565 nfsrvd_setclientidcfrm(struct nfsrv_descript *nd,
3573 if ((nd->nd_flag & ND_NFSV41) != 0) {
3574 nd->nd_repstat = NFSERR_NOTSUPP;
3577 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3578 nd->nd_repstat = NFSERR_WRONGSEC;
3591 nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_CONFIRM|CLOPS_RENEW),
3592 NULL, NULL, confirm, 0, nd, p);
3594 NFSEXITCODE2(error, nd);
3602 nfsrvd_verify(struct nfsrv_descript *nd, int isdgram,
3611 nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
3612 if (!nd->nd_repstat)
3613 nd->nd_repstat = nfsvno_statfs(vp, &sf);
3614 if (!nd->nd_repstat)
3615 nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
3616 if (!nd->nd_repstat) {
3618 error = nfsv4_loadattr(nd, vp, &nva, NULL, &fh, fhsize, NULL,
3619 &sf, NULL, &fs, NULL, 1, &ret, NULL, NULL, p, nd->nd_cred);
3621 if (nd->nd_procnum == NFSV4OP_NVERIFY) {
3623 nd->nd_repstat = NFSERR_SAME;
3625 nd->nd_repstat = ret;
3627 nd->nd_repstat = ret;
3631 NFSEXITCODE2(error, nd);
3639 nfsrvd_openattr(struct nfsrv_descript *nd, __unused int isdgram,
3648 nd->nd_repstat = NFSERR_NOTSUPP;
3651 NFSEXITCODE2(error, nd);
3659 nfsrvd_releaselckown(struct nfsrv_descript *nd, __unused int isdgram,
3667 if ((nd->nd_flag & ND_NFSV41) != 0) {
3668 nd->nd_repstat = NFSERR_NOTSUPP;
3671 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3672 nd->nd_repstat = NFSERR_WRONGSEC;
3678 nd->nd_repstat = NFSERR_BADXDR;
3686 stp->ls_uid = nd->nd_cred->cr_uid;
3689 if ((nd->nd_flag & ND_IMPLIEDCLID) != 0) {
3690 if ((nd->nd_flag & ND_NFSV41) != 0)
3691 clientid.qval = nd->nd_clientid.qval;
3692 else if (nd->nd_clientid.qval != clientid.qval)
3695 if ((nd->nd_flag & ND_NFSV41) != 0)
3697 nd->nd_flag |= ND_IMPLIEDCLID;
3698 nd->nd_clientid.qval = clientid.qval;
3700 error = nfsrv_mtostr(nd, stp->ls_owner, len);
3703 nd->nd_repstat = nfsrv_releaselckown(stp, clientid, p);
3706 NFSEXITCODE2(0, nd);
3711 NFSEXITCODE2(error, nd);
3719 nfsrvd_exchangeid(struct nfsrv_descript *nd, __unused int isdgram,
3731 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3732 nd->nd_repstat = NFSERR_WRONGSEC;
3740 nd->nd_repstat = NFSERR_BADXDR;
3744 if (nd->nd_flag & ND_GSS)
3745 i += nd->nd_princlen;
3756 error = nfsrv_mtostr(nd, clp->lc_id, idlen);
3759 if ((nd->nd_flag & ND_GSS) != 0) {
3761 if ((nd->nd_flag & ND_GSSINTEGRITY) != 0)
3763 else if ((nd->nd_flag & ND_GSSPRIVACY) != 0)
3767 if ((nd->nd_flag & ND_GSS) != 0 && nd->nd_princlen > 0) {
3769 clp->lc_namelen = nd->nd_princlen;
3771 NFSBCOPY(nd->nd_principal, clp->lc_name, clp->lc_namelen);
3773 clp->lc_uid = nd->nd_cred->cr_uid;
3774 clp->lc_gid = nd->nd_cred->cr_gid;
3781 nd->nd_repstat = NFSERR_INVAL;
3791 nd->nd_repstat = NFSERR_NOTSUPP;
3802 nd->nd_repstat = nfsrv_setclient(nd, &clp, &clientid, &confirm, p);
3809 if (nd->nd_repstat == 0) {
3820 (void)nfsm_strtom(nd, nd->nd_cred->cr_prison->pr_hostuuid,
3821 strlen(nd->nd_cred->cr_prison->pr_hostuuid)); /* Major */
3826 (void)nfsm_strtom(nd, "freebsd.org", strlen("freebsd.org"));
3827 (void)nfsm_strtom(nd, version, strlen(version));
3833 NFSEXITCODE2(0, nd);
3842 NFSEXITCODE2(error, nd);
3850 nfsrvd_createsession(struct nfsrv_descript *nd, __unused int isdgram,
3859 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3860 nd->nd_repstat = NFSERR_WRONGSEC;
3887 nd->nd_repstat = NFSERR_BADXDR;
3902 nd->nd_repstat = NFSERR_BADXDR;
3914 nd->nd_repstat = nfsrv_getclient(clientid, CLOPS_CONFIRM | CLOPS_RENEW,
3915 NULL, sep, confirm, sep->sess_cbprogram, nd, p);
3916 if (nd->nd_repstat == 0) {
3944 if (nd->nd_repstat != 0 && sep != NULL)
3946 NFSEXITCODE2(error, nd);
3954 nfsrvd_sequence(struct nfsrv_descript *nd, __unused int isdgram,
3961 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
3962 nd->nd_repstat = NFSERR_WRONGSEC;
3966 NFSBCOPY(tl, nd->nd_sessionid, NFSX_V4SESSIONID);
3969 nd->nd_slotid = fxdr_unsigned(uint32_t, *tl++);
3975 nd->nd_flag |= ND_HASSEQUENCE;
3976 nd->nd_repstat = nfsrv_checksequence(nd, sequenceid, &highest_slotid,
3978 if (nd->nd_repstat == 0) {
3980 NFSBCOPY(nd->nd_sessionid, tl, NFSX_V4SESSIONID);
3983 *tl++ = txdr_unsigned(nd->nd_slotid);
3989 NFSEXITCODE2(error, nd);
3997 nfsrvd_reclaimcomplete(struct nfsrv_descript *nd, __unused int isdgram,
4003 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
4004 nd->nd_repstat = NFSERR_WRONGSEC;
4009 nd->nd_repstat = NFSERR_NOTSUPP;
4011 nd->nd_repstat = nfsrv_checkreclaimcomplete(nd);
4013 NFSEXITCODE2(error, nd);
4021 nfsrvd_destroyclientid(struct nfsrv_descript *nd, __unused int isdgram,
4028 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
4029 nd->nd_repstat = NFSERR_WRONGSEC;
4035 nd->nd_repstat = nfsrv_destroyclient(clientid, p);
4037 NFSEXITCODE2(error, nd);
4045 nfsrvd_destroysession(struct nfsrv_descript *nd, __unused int isdgram,
4051 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
4052 nd->nd_repstat = NFSERR_WRONGSEC;
4057 nd->nd_repstat = nfsrv_destroysession(nd, sessid);
4059 NFSEXITCODE2(error, nd);
4067 nfsrvd_freestateid(struct nfsrv_descript *nd, __unused int isdgram,
4074 if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
4075 nd->nd_repstat = NFSERR_WRONGSEC;
4081 nd->nd_repstat = nfsrv_freestateid(nd, &stateid, p);
4083 NFSEXITCODE2(error, nd);
4091 nfsrvd_notsupp(struct nfsrv_descript *nd, __unused int isdgram,
4095 nd->nd_repstat = NFSERR_NOTSUPP;
4096 NFSEXITCODE2(0, nd);