Lines Matching +full:vp +full:- +full:p
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
92 static pid_t nfsd_master_pid = (pid_t)-1;
210 if (error != 0 || req->newptr == NULL) in sysctl_dsdirsize()
236 if (error != 0 || req->newptr == NULL) in sysctl_srvmaxio()
248 if ((newsrvmaxio & (newsrvmaxio - 1)) != 0) { in sysctl_srvmaxio()
275 tval += MCLBYTES - 1; /* Round up divide. */ in sysctl_srvmaxio()
307 if (error != 0 || req->newptr == NULL) in sysctl_dolocallocks()
311 if (jailed(curthread->td_ucred)) in sysctl_dolocallocks()
339 struct vnode *nh_vp; /* vp to match (unreferenced pointer) */
349 nfsrv_sequential_heuristic(struct uio *uio, struct vnode *vp) in nfsrv_sequential_heuristic() argument
356 hi = ((int)(vm_offset_t)vp / sizeof(struct vnode)) % NUM_HEURISTIC; in nfsrv_sequential_heuristic()
358 while (try--) { in nfsrv_sequential_heuristic()
359 if (nfsheur[hi].nh_vp == vp) { in nfsrv_sequential_heuristic()
364 --nfsheur[hi].nh_use; in nfsrv_sequential_heuristic()
366 if (nfsheur[hi].nh_use < nh->nh_use) in nfsrv_sequential_heuristic()
371 if (nh->nh_vp != vp) { in nfsrv_sequential_heuristic()
372 nh->nh_vp = vp; in nfsrv_sequential_heuristic()
373 nh->nh_nextoff = uio->uio_offset; in nfsrv_sequential_heuristic()
374 nh->nh_use = NHUSE_INIT; in nfsrv_sequential_heuristic()
375 if (uio->uio_offset == 0) in nfsrv_sequential_heuristic()
376 nh->nh_seqcount = 4; in nfsrv_sequential_heuristic()
378 nh->nh_seqcount = 1; in nfsrv_sequential_heuristic()
382 if ((uio->uio_offset == 0 && nh->nh_seqcount > 0) || in nfsrv_sequential_heuristic()
383 uio->uio_offset == nh->nh_nextoff) { in nfsrv_sequential_heuristic()
385 nh->nh_seqcount += howmany(uio->uio_resid, 16384); in nfsrv_sequential_heuristic()
386 if (nh->nh_seqcount > IO_SEQMAX) in nfsrv_sequential_heuristic()
387 nh->nh_seqcount = IO_SEQMAX; in nfsrv_sequential_heuristic()
388 } else if (qabs(uio->uio_offset - nh->nh_nextoff) <= MAX_REORDERED_RPC * in nfsrv_sequential_heuristic()
389 imax(vp->v_mount->mnt_stat.f_iosize, uio->uio_resid)) { in nfsrv_sequential_heuristic()
391 } else if (nh->nh_seqcount > 1) { in nfsrv_sequential_heuristic()
392 nh->nh_seqcount /= 2; in nfsrv_sequential_heuristic()
394 nh->nh_seqcount = 0; in nfsrv_sequential_heuristic()
396 nh->nh_use += NHUSE_INC; in nfsrv_sequential_heuristic()
397 if (nh->nh_use > NHUSE_MAX) in nfsrv_sequential_heuristic()
398 nh->nh_use = NHUSE_MAX; in nfsrv_sequential_heuristic()
406 nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, in nfsvno_getattr() argument
407 struct nfsrv_descript *nd, struct thread *p, int vpislocked, in nfsvno_getattr() argument
419 if (NFSVOPISLOCKED(vp) != LK_EXCLUSIVE) { in nfsvno_getattr()
421 NFSVOPLOCK(vp, LK_SHARED | LK_RETRY); in nfsvno_getattr()
429 * - non-NFSv4 RPCs or in nfsvno_getattr()
430 * - when attrbitp == NULL or in nfsvno_getattr()
431 * - an NFSv4 RPC with any of the above attributes in attrbitp. in nfsvno_getattr()
437 if (vp->v_type == VREG && nfsrv_devidcnt > 0 && (attrbitp == NULL || in nfsvno_getattr()
438 (nd->nd_flag & ND_NFSV4) == 0 || in nfsvno_getattr()
444 error = nfsrv_proxyds(vp, 0, 0, nd->nd_cred, p, in nfsvno_getattr()
451 nvap->na_bsdflags = 0; in nfsvno_getattr()
452 nvap->na_flags = 0; in nfsvno_getattr()
453 error = VOP_GETATTR(vp, &nvap->na_vattr, nd->nd_cred); in nfsvno_getattr()
455 NFSVOPUNLOCK(vp); in nfsvno_getattr()
462 nvap->na_atime = na.na_atime; in nfsvno_getattr()
463 nvap->na_mtime = na.na_mtime; in nfsvno_getattr()
464 nvap->na_filerev = na.na_filerev; in nfsvno_getattr()
465 nvap->na_size = na.na_size; in nfsvno_getattr()
466 nvap->na_bytes = na.na_bytes; in nfsvno_getattr()
479 nfsvno_getfh(struct vnode *vp, fhandle_t *fhp, struct thread *p) in nfsvno_getfh() argument
484 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid; in nfsvno_getfh()
485 error = VOP_VPTOFH(vp, &fhp->fh_fid); in nfsvno_getfh()
495 * 1 - You must check for exported rdonly as well as MNT_RDONLY for the write
497 * 2 - The owner is to be given access irrespective of mode bits for some
502 nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred, in nfsvno_accchk() argument
503 struct nfsexstuff *exp, struct thread *p, int override, int vpislocked, in nfsvno_accchk() argument
510 if (NFSVOPLOCK(vp, LK_SHARED) != 0) { in nfsvno_accchk()
518 * Disallow write attempts on read-only file systems; in nfsvno_accchk()
523 (vp->v_mount->mnt_flag & MNT_RDONLY)) { in nfsvno_accchk()
524 switch (vp->v_type) { in nfsvno_accchk()
538 if (VOP_IS_TEXT(vp) && error == 0) in nfsvno_accchk()
543 NFSVOPUNLOCK(vp); in nfsvno_accchk()
550 error = VOP_ACCESSX(vp, accmode, cred, p); in nfsvno_accchk()
556 error = VOP_ACCESSX(vp, accmode | VEXPLICIT_DENY, cred, p); in nfsvno_accchk()
558 if (vp->v_type == VDIR) { in nfsvno_accchk()
561 error = VOP_ACCESSX(vp, accmode, cred, p); in nfsvno_accchk()
574 if (cred->cr_uid == 0 && (override & NFSACCCHK_ALLOWROOT)) in nfsvno_accchk()
577 getret = VOP_GETATTR(vp, &vattr, cred); in nfsvno_accchk()
578 if (getret == 0 && cred->cr_uid == vattr.va_uid) in nfsvno_accchk()
583 NFSVOPUNLOCK(vp); in nfsvno_accchk()
594 nfsvno_setattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred, in nfsvno_setattr() argument
595 struct thread *p, struct nfsexstuff *exp) in nfsvno_setattr() argument
607 if (vp->v_type == VREG && (vp->v_mount->mnt_flag & MNT_EXPORTED) != 0 && in nfsvno_setattr()
608 nfsrv_devidcnt != 0 && nvap->na_vattr.va_size != VNOVAL && in nfsvno_setattr()
609 nvap->na_vattr.va_size > 0) { in nfsvno_setattr()
610 savsize = nvap->na_vattr.va_size; in nfsvno_setattr()
611 nvap->na_vattr.va_size = VNOVAL; in nfsvno_setattr()
612 if (nvap->na_vattr.va_uid != (uid_t)VNOVAL || in nfsvno_setattr()
613 nvap->na_vattr.va_gid != (gid_t)VNOVAL || in nfsvno_setattr()
614 nvap->na_vattr.va_mode != (mode_t)VNOVAL || in nfsvno_setattr()
615 nvap->na_vattr.va_atime.tv_sec != VNOVAL || in nfsvno_setattr()
616 nvap->na_vattr.va_mtime.tv_sec != VNOVAL) in nfsvno_setattr()
622 error = VOP_SETATTR(vp, &nvap->na_vattr, cred); in nfsvno_setattr()
624 nvap->na_vattr.va_size = savsize; in nfsvno_setattr()
625 if (error == 0 && (nvap->na_vattr.va_uid != (uid_t)VNOVAL || in nfsvno_setattr()
626 nvap->na_vattr.va_gid != (gid_t)VNOVAL || in nfsvno_setattr()
627 nvap->na_vattr.va_size != VNOVAL || in nfsvno_setattr()
628 nvap->na_vattr.va_mode != (mode_t)VNOVAL || in nfsvno_setattr()
629 nvap->na_vattr.va_atime.tv_sec != VNOVAL || in nfsvno_setattr()
630 nvap->na_vattr.va_mtime.tv_sec != VNOVAL)) { in nfsvno_setattr()
632 savbtime = nvap->na_vattr.va_birthtime.tv_sec; in nfsvno_setattr()
633 nvap->na_vattr.va_birthtime.tv_sec = VNOVAL; in nfsvno_setattr()
635 error = nfsrv_proxyds(vp, 0, 0, cred, p, NFSPROC_SETATTR, in nfsvno_setattr()
637 nvap->na_vattr.va_birthtime.tv_sec = savbtime; in nfsvno_setattr()
653 struct componentname *cnp = &ndp->ni_cnd; in nfsvno_namei()
657 int lockleaf = (cnp->cn_flags & LOCKLEAF) != 0, linklen; in nfsvno_namei()
662 cnp->cn_nameptr = cnp->cn_pnbuf; in nfsvno_namei()
663 ndp->ni_lcf = 0; in nfsvno_namei()
667 if (dp->v_type != VDIR) { in nfsvno_namei()
681 cnp->cn_flags |= RDONLY; in nfsvno_namei()
682 ndp->ni_segflg = UIO_SYSSPACE; in nfsvno_namei()
684 if (nd->nd_flag & ND_PUBLOOKUP) { in nfsvno_namei()
685 ndp->ni_loopcnt = 0; in nfsvno_namei()
686 if (cnp->cn_pnbuf[0] == '/') { in nfsvno_namei()
692 for (i = 1; i < ndp->ni_pathlen; i++) in nfsvno_namei()
693 if (cnp->cn_pnbuf[i] != '/') in nfsvno_namei()
695 if (i == ndp->ni_pathlen) { in nfsvno_namei()
703 (nd->nd_flag & ND_NFSV4) == 0) { in nfsvno_namei()
709 cnp->cn_flags |= NOCROSSMOUNT; in nfsvno_namei()
717 ndp->ni_startdir = dp; in nfsvno_namei()
718 ndp->ni_rootdir = rootvnode; in nfsvno_namei()
719 ndp->ni_topdir = NULL; in nfsvno_namei()
722 cnp->cn_flags |= LOCKLEAF; in nfsvno_namei()
724 cnp->cn_nameptr = cnp->cn_pnbuf; in nfsvno_namei()
727 * ndp->ni_vp and ni_dvp are left uninitialized or NULL and in nfsvno_namei()
740 if ((cnp->cn_flags & ISSYMLINK) == 0) { in nfsvno_namei()
741 if (ndp->ni_vp && !lockleaf) in nfsvno_namei()
742 NFSVOPUNLOCK(ndp->ni_vp); in nfsvno_namei()
749 if ((cnp->cn_flags & LOCKPARENT) && ndp->ni_pathlen == 1) in nfsvno_namei()
750 NFSVOPUNLOCK(ndp->ni_dvp); in nfsvno_namei()
751 if (!(nd->nd_flag & ND_PUBLOOKUP)) { in nfsvno_namei()
756 if (ndp->ni_loopcnt++ >= MAXSYMLINKS) { in nfsvno_namei()
760 if (ndp->ni_pathlen > 1) in nfsvno_namei()
763 cp = cnp->cn_pnbuf; in nfsvno_namei()
773 error = VOP_READLINK(ndp->ni_vp, &auio, cnp->cn_cred); in nfsvno_namei()
776 if (ndp->ni_pathlen > 1) in nfsvno_namei()
779 vrele(ndp->ni_dvp); in nfsvno_namei()
780 vput(ndp->ni_vp); in nfsvno_namei()
783 linklen = MAXPATHLEN - auio.uio_resid; in nfsvno_namei()
788 if (linklen + ndp->ni_pathlen >= MAXPATHLEN) { in nfsvno_namei()
796 if (ndp->ni_pathlen > 1) { in nfsvno_namei()
797 NFSBCOPY(ndp->ni_next, cp + linklen, ndp->ni_pathlen); in nfsvno_namei()
798 uma_zfree(namei_zone, cnp->cn_pnbuf); in nfsvno_namei()
799 cnp->cn_pnbuf = cp; in nfsvno_namei()
801 cnp->cn_pnbuf[linklen] = '\0'; in nfsvno_namei()
802 ndp->ni_pathlen += linklen; in nfsvno_namei()
811 vput(ndp->ni_vp); in nfsvno_namei()
812 ndp->ni_vp = NULL; in nfsvno_namei()
814 if (cnp->cn_pnbuf[0] == '/') { in nfsvno_namei()
815 vrele(ndp->ni_dvp); in nfsvno_namei()
816 ndp->ni_dvp = ndp->ni_rootdir; in nfsvno_namei()
817 VREF(ndp->ni_dvp); in nfsvno_namei()
819 ndp->ni_startdir = ndp->ni_dvp; in nfsvno_namei()
820 ndp->ni_dvp = NULL; in nfsvno_namei()
823 cnp->cn_flags &= ~LOCKLEAF; in nfsvno_namei()
828 ndp->ni_vp = NULL; in nfsvno_namei()
829 ndp->ni_dvp = NULL; in nfsvno_namei()
830 ndp->ni_startdir = NULL; in nfsvno_namei()
831 } else if ((ndp->ni_cnd.cn_flags & (WANTPARENT|LOCKPARENT)) == 0) { in nfsvno_namei()
832 ndp->ni_dvp = NULL; in nfsvno_namei()
847 struct componentname *cnp = &ndp->ni_cnd; in nfsvno_setpathbuf()
849 cnp->cn_flags |= (NOMACCHECK); in nfsvno_setpathbuf()
850 cnp->cn_pnbuf = uma_zalloc(namei_zone, M_WAITOK); in nfsvno_setpathbuf()
853 *bufpp = cnp->cn_pnbuf; in nfsvno_setpathbuf()
863 uma_zfree(namei_zone, ndp->ni_cnd.cn_pnbuf); in nfsvno_relpathbuf()
864 ndp->ni_cnd.cn_pnbuf = NULL; in nfsvno_relpathbuf()
871 nfsvno_readlink(struct vnode *vp, struct ucred *cred, int maxextsiz, in nfsvno_readlink() argument
872 struct thread *p, struct mbuf **mpp, struct mbuf **mpendp, int *lenp) in nfsvno_readlink() argument
881 uiop->uio_iovcnt = nfsrv_createiovec_extpgs(len, maxextsiz, in nfsvno_readlink()
884 uiop->uio_iovcnt = nfsrv_createiovec(len, &mp3, &mp, &iv); in nfsvno_readlink()
885 uiop->uio_iov = iv; in nfsvno_readlink()
886 uiop->uio_offset = 0; in nfsvno_readlink()
887 uiop->uio_resid = len; in nfsvno_readlink()
888 uiop->uio_rw = UIO_READ; in nfsvno_readlink()
889 uiop->uio_segflg = UIO_SYSSPACE; in nfsvno_readlink()
890 uiop->uio_td = NULL; in nfsvno_readlink()
891 error = VOP_READLINK(vp, uiop, cred); in nfsvno_readlink()
898 if (uiop->uio_resid > 0) { in nfsvno_readlink()
899 len -= uiop->uio_resid; in nfsvno_readlink()
905 mp = nfsrv_adj(mp3, NFS_MAXPATHLEN - tlen, in nfsvno_readlink()
906 tlen - len); in nfsvno_readlink()
940 m->m_len = 0; in nfsrv_createiovec()
942 left -= siz; in nfsrv_createiovec()
945 m2->m_next = m; in nfsrv_createiovec()
959 iv->iov_base = mtod(m, caddr_t) + m->m_len; in nfsrv_createiovec()
960 iv->iov_len = siz; in nfsrv_createiovec()
961 m->m_len += siz; in nfsrv_createiovec()
962 left -= siz; in nfsrv_createiovec()
966 m = m->m_next; in nfsrv_createiovec()
997 left -= siz; in nfsrv_createiovec_extpgs()
998 i += m->m_epg_npgs; in nfsrv_createiovec_extpgs()
1000 m2->m_next = m; in nfsrv_createiovec_extpgs()
1015 iv->iov_base = (void *)PHYS_TO_DMAP(m->m_epg_pa[pgno]); in nfsrv_createiovec_extpgs()
1016 iv->iov_len = siz; in nfsrv_createiovec_extpgs()
1017 m->m_len += siz; in nfsrv_createiovec_extpgs()
1018 if (pgno == m->m_epg_npgs - 1) in nfsrv_createiovec_extpgs()
1019 m->m_epg_last_len = siz; in nfsrv_createiovec_extpgs()
1020 left -= siz; in nfsrv_createiovec_extpgs()
1025 if (pgno == m->m_epg_npgs && left > 0) { in nfsrv_createiovec_extpgs()
1026 m = m->m_next; in nfsrv_createiovec_extpgs()
1041 nfsvno_read(struct vnode *vp, off_t off, int cnt, struct ucred *cred, in nfsvno_read() argument
1042 int maxextsiz, struct thread *p, struct mbuf **mpp, in nfsvno_read() argument
1056 error = nfsrv_proxyds(vp, off, cnt, cred, p, NFSPROC_READDS, mpp, in nfsvno_read()
1063 uiop->uio_iovcnt = nfsrv_createiovec_extpgs(len, maxextsiz, in nfsvno_read()
1066 uiop->uio_iovcnt = nfsrv_createiovec(len, &m3, &m, &iv); in nfsvno_read()
1067 uiop->uio_iov = iv; in nfsvno_read()
1068 uiop->uio_offset = off; in nfsvno_read()
1069 uiop->uio_resid = len; in nfsvno_read()
1070 uiop->uio_rw = UIO_READ; in nfsvno_read()
1071 uiop->uio_segflg = UIO_SYSSPACE; in nfsvno_read()
1072 uiop->uio_td = NULL; in nfsvno_read()
1073 nh = nfsrv_sequential_heuristic(uiop, vp); in nfsvno_read()
1074 ioflag |= nh->nh_seqcount << IO_SEQSHIFT; in nfsvno_read()
1076 NFSD_VNET(nfsstatsv1_p)->srvbytes[NFSV4OP_READ] += uiop->uio_resid; in nfsvno_read()
1077 error = VOP_READ(vp, uiop, IO_NODELOCKED | ioflag, cred); in nfsvno_read()
1084 nh->nh_nextoff = uiop->uio_offset; in nfsvno_read()
1085 tlen = len - uiop->uio_resid; in nfsvno_read()
1092 m = nfsrv_adj(m3, len - tlen, tlen - cnt); in nfsvno_read()
1121 i = mtod(mp, caddr_t) + mp->m_len - cp; in nfsrv_createiovecw()
1124 len -= i; in nfsrv_createiovecw()
1127 mp = mp->m_next; in nfsrv_createiovecw()
1132 i = mp->m_len; in nfsrv_createiovecw()
1140 i = mtod(mp, caddr_t) + mp->m_len - cp; in nfsrv_createiovecw()
1147 ivp->iov_base = cp; in nfsrv_createiovecw()
1148 ivp->iov_len = i; in nfsrv_createiovecw()
1150 len -= i; in nfsrv_createiovecw()
1152 mp = mp->m_next; in nfsrv_createiovecw()
1154 i = mp->m_len; in nfsrv_createiovecw()
1165 nfsvno_write(struct vnode *vp, off_t off, int retlen, int *stable, in nfsvno_write() argument
1166 struct mbuf *mp, char *cp, struct ucred *cred, struct thread *p) in nfsvno_write() argument
1177 error = nfsrv_proxyds(vp, off, retlen, cred, p, NFSPROC_WRITEDS, in nfsvno_write()
1191 uiop->uio_iov = iv; in nfsvno_write()
1192 uiop->uio_iovcnt = cnt; in nfsvno_write()
1193 uiop->uio_resid = retlen; in nfsvno_write()
1194 uiop->uio_rw = UIO_WRITE; in nfsvno_write()
1195 uiop->uio_segflg = UIO_SYSSPACE; in nfsvno_write()
1196 NFSUIOPROC(uiop, p); in nfsvno_write()
1197 uiop->uio_offset = off; in nfsvno_write()
1198 nh = nfsrv_sequential_heuristic(uiop, vp); in nfsvno_write()
1199 ioflags |= nh->nh_seqcount << IO_SEQSHIFT; in nfsvno_write()
1201 NFSD_VNET(nfsstatsv1_p)->srvbytes[NFSV4OP_WRITE] += uiop->uio_resid; in nfsvno_write()
1202 error = VOP_WRITE(vp, uiop, ioflags, cred); in nfsvno_write()
1204 nh->nh_nextoff = uiop->uio_offset; in nfsvno_write()
1221 struct thread *p = curthread; in nfsvno_createsub() local
1223 error = nd->nd_repstat; in nfsvno_createsub()
1224 if (!error && ndp->ni_vp == NULL) { in nfsvno_createsub()
1225 if (nvap->na_type == VREG || nvap->na_type == VSOCK) { in nfsvno_createsub()
1226 error = VOP_CREATE(ndp->ni_dvp, in nfsvno_createsub()
1227 &ndp->ni_vp, &ndp->ni_cnd, &nvap->na_vattr); in nfsvno_createsub()
1229 if (error == 0 && nvap->na_type == VREG) { in nfsvno_createsub()
1235 nfsrv_pnfscreate(ndp->ni_vp, &nvap->na_vattr, in nfsvno_createsub()
1236 nd->nd_cred, p); in nfsvno_createsub()
1238 VOP_VPUT_PAIR(ndp->ni_dvp, error == 0 ? &ndp->ni_vp : in nfsvno_createsub()
1245 nvap->na_atime.tv_sec = cverf[0]; in nfsvno_createsub()
1246 nvap->na_atime.tv_nsec = cverf[1]; in nfsvno_createsub()
1247 error = VOP_SETATTR(ndp->ni_vp, in nfsvno_createsub()
1248 &nvap->na_vattr, nd->nd_cred); in nfsvno_createsub()
1250 vput(ndp->ni_vp); in nfsvno_createsub()
1251 ndp->ni_vp = NULL; in nfsvno_createsub()
1260 } else if (nvap->na_type == VCHR || nvap->na_type == VBLK || in nfsvno_createsub()
1261 nvap->na_type == VFIFO) { in nfsvno_createsub()
1262 if (nvap->na_type == VCHR && rdev == 0xffffffff) in nfsvno_createsub()
1263 nvap->na_type = VFIFO; in nfsvno_createsub()
1264 if (nvap->na_type != VFIFO && in nfsvno_createsub()
1265 (error = priv_check_cred(nd->nd_cred, PRIV_VFS_MKNOD_DEV))) { in nfsvno_createsub()
1267 vput(ndp->ni_dvp); in nfsvno_createsub()
1270 nvap->na_rdev = rdev; in nfsvno_createsub()
1271 error = VOP_MKNOD(ndp->ni_dvp, &ndp->ni_vp, in nfsvno_createsub()
1272 &ndp->ni_cnd, &nvap->na_vattr); in nfsvno_createsub()
1273 VOP_VPUT_PAIR(ndp->ni_dvp, error == 0 ? &ndp->ni_vp : in nfsvno_createsub()
1280 vput(ndp->ni_dvp); in nfsvno_createsub()
1284 *vpp = ndp->ni_vp; in nfsvno_createsub()
1289 * 1 - clean up the lookup in nfsvno_createsub()
1290 * 2 - iff !error and na_size set, truncate it in nfsvno_createsub()
1293 *vpp = ndp->ni_vp; in nfsvno_createsub()
1294 if (ndp->ni_dvp == *vpp) in nfsvno_createsub()
1295 vrele(ndp->ni_dvp); in nfsvno_createsub()
1297 vput(ndp->ni_dvp); in nfsvno_createsub()
1298 if (!error && nvap->na_size != VNOVAL) { in nfsvno_createsub()
1300 nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, in nfsvno_createsub()
1303 tempsize = nvap->na_size; in nfsvno_createsub()
1305 nvap->na_size = tempsize; in nfsvno_createsub()
1307 nd->nd_cred, p, exp); in nfsvno_createsub()
1324 struct thread *p) in nfsvno_mknod() argument
1329 vtyp = nvap->na_type; in nfsvno_mknod()
1333 if (ndp->ni_vp) { in nfsvno_mknod()
1335 vput(ndp->ni_dvp); in nfsvno_mknod()
1336 vrele(ndp->ni_vp); in nfsvno_mknod()
1342 vput(ndp->ni_dvp); in nfsvno_mknod()
1347 error = VOP_CREATE(ndp->ni_dvp, &ndp->ni_vp, in nfsvno_mknod()
1348 &ndp->ni_cnd, &nvap->na_vattr); in nfsvno_mknod()
1349 VOP_VPUT_PAIR(ndp->ni_dvp, error == 0 ? &ndp->ni_vp : NULL, in nfsvno_mknod()
1353 if (nvap->na_type != VFIFO && in nfsvno_mknod()
1356 vput(ndp->ni_dvp); in nfsvno_mknod()
1359 error = VOP_MKNOD(ndp->ni_dvp, &ndp->ni_vp, in nfsvno_mknod()
1360 &ndp->ni_cnd, &nvap->na_vattr); in nfsvno_mknod()
1361 VOP_VPUT_PAIR(ndp->ni_dvp, error == 0 ? &ndp->ni_vp : NULL, in nfsvno_mknod()
1380 struct ucred *cred, struct thread *p, struct nfsexstuff *exp) in nfsvno_mkdir() argument
1384 if (ndp->ni_vp != NULL) { in nfsvno_mkdir()
1385 if (ndp->ni_dvp == ndp->ni_vp) in nfsvno_mkdir()
1386 vrele(ndp->ni_dvp); in nfsvno_mkdir()
1388 vput(ndp->ni_dvp); in nfsvno_mkdir()
1389 vrele(ndp->ni_vp); in nfsvno_mkdir()
1394 error = VOP_MKDIR(ndp->ni_dvp, &ndp->ni_vp, &ndp->ni_cnd, in nfsvno_mkdir()
1395 &nvap->na_vattr); in nfsvno_mkdir()
1396 VOP_VPUT_PAIR(ndp->ni_dvp, error == 0 ? &ndp->ni_vp : NULL, false); in nfsvno_mkdir()
1409 int pathlen, int not_v2, uid_t saved_uid, struct ucred *cred, struct thread *p, in nfsvno_symlink() argument
1414 if (ndp->ni_vp) { in nfsvno_symlink()
1416 if (ndp->ni_dvp == ndp->ni_vp) in nfsvno_symlink()
1417 vrele(ndp->ni_dvp); in nfsvno_symlink()
1419 vput(ndp->ni_dvp); in nfsvno_symlink()
1420 vrele(ndp->ni_vp); in nfsvno_symlink()
1425 error = VOP_SYMLINK(ndp->ni_dvp, &ndp->ni_vp, &ndp->ni_cnd, in nfsvno_symlink()
1426 &nvap->na_vattr, pathcp); in nfsvno_symlink()
1433 VOP_VPUT_PAIR(ndp->ni_dvp, &ndp->ni_vp, !not_v2 && error == 0); in nfsvno_symlink()
1445 * So, if it returns with uiop->uio_iov->iov_base != NULL, that must
1450 struct thread *p, char **pathcpp, int *lenp) in nfsvno_getsymlink() argument
1459 if ((nd->nd_flag & ND_NFSV3) && in nfsvno_getsymlink()
1460 (error = nfsrv_sattr(nd, NULL, nvap, NULL, NULL, p))) in nfsvno_getsymlink()
1472 if (nd->nd_flag & ND_NFSV2) { in nfsvno_getsymlink()
1474 nvap->na_mode = fxdr_unsigned(u_int16_t, sp->sa_mode); in nfsvno_getsymlink()
1488 * Remove a non-directory object.
1492 struct thread *p, struct nfsexstuff *exp) in nfsvno_removesub() argument
1494 struct vnode *vp, *dsdvp[NFSDEV_MAXMIRRORS], *newvp; in nfsvno_removesub() local
1500 vp = ndp->ni_vp; in nfsvno_removesub()
1502 if (vp->v_type == VDIR) { in nfsvno_removesub()
1505 if (nfsrv_recalldeleg || (nd->nd_flag & ND_NFSV41) == 0) in nfsvno_removesub()
1506 error = nfsrv_checkremove(vp, 1, NULL, in nfsvno_removesub()
1507 (nfsquad_t)((u_quad_t)0), p); in nfsvno_removesub()
1509 error = nfsrv_checkremove(vp, 1, NULL, nd->nd_clientid, in nfsvno_removesub()
1510 p); in nfsvno_removesub()
1513 nfsrv_pnfsremovesetup(vp, p, dsdvp, &mirrorcnt, fname, &fh); in nfsvno_removesub()
1515 error = VOP_REMOVE(ndp->ni_dvp, vp, &ndp->ni_cnd); in nfsvno_removesub()
1517 nfsrv_pnfsremove(dsdvp, mirrorcnt, fname, &fh, p); in nfsvno_removesub()
1518 if (is_v4 && (nd->nd_flag & ND_NFSV41) != 0 && error == 0) in nfsvno_removesub()
1519 error = nfsvno_getfh(vp, &fh, p); in nfsvno_removesub()
1520 if (ndp->ni_dvp == vp) in nfsvno_removesub()
1521 vrele(ndp->ni_dvp); in nfsvno_removesub()
1523 vput(ndp->ni_dvp); in nfsvno_removesub()
1524 vput(vp); in nfsvno_removesub()
1527 if (is_v4 && (nd->nd_flag & ND_NFSV41) != 0 && error == 0) { in nfsvno_removesub()
1542 nfsrv_removedeleg(&fh, nd, p); in nfsvno_removesub()
1556 struct thread *p, struct nfsexstuff *exp) in nfsvno_rmdirsub() argument
1558 struct vnode *vp; in nfsvno_rmdirsub() local
1561 vp = ndp->ni_vp; in nfsvno_rmdirsub()
1562 if (vp->v_type != VDIR) { in nfsvno_rmdirsub()
1569 if (ndp->ni_dvp == vp) { in nfsvno_rmdirsub()
1576 if (vp->v_vflag & VV_ROOT) in nfsvno_rmdirsub()
1580 error = VOP_RMDIR(ndp->ni_dvp, vp, &ndp->ni_cnd); in nfsvno_rmdirsub()
1581 if (ndp->ni_dvp == vp) in nfsvno_rmdirsub()
1582 vrele(ndp->ni_dvp); in nfsvno_rmdirsub()
1584 vput(ndp->ni_dvp); in nfsvno_rmdirsub()
1585 vput(vp); in nfsvno_rmdirsub()
1596 struct nfsrv_descript *nd, struct thread *p) in nfsvno_rename() argument
1605 fvp = fromndp->ni_vp; in nfsvno_rename()
1606 if (nd->nd_repstat != 0) { in nfsvno_rename()
1607 vrele(fromndp->ni_dvp); in nfsvno_rename()
1609 error = nd->nd_repstat; in nfsvno_rename()
1612 tdvp = tondp->ni_dvp; in nfsvno_rename()
1613 tvp = tondp->ni_vp; in nfsvno_rename()
1615 if (fvp->v_type == VDIR && tvp->v_type != VDIR) { in nfsvno_rename()
1616 error = (nd->nd_flag & ND_NFSV2) ? EISDIR : EEXIST; in nfsvno_rename()
1618 } else if (fvp->v_type != VDIR && tvp->v_type == VDIR) { in nfsvno_rename()
1619 error = (nd->nd_flag & ND_NFSV2) ? ENOTDIR : EEXIST; in nfsvno_rename()
1622 if (tvp->v_type == VDIR && tvp->v_mountedhere) { in nfsvno_rename()
1623 error = (nd->nd_flag & ND_NFSV2) ? ENOTEMPTY : EXDEV; in nfsvno_rename()
1632 if ((tondp->ni_cnd.cn_namelen == 1 && in nfsvno_rename()
1633 tondp->ni_cnd.cn_nameptr[0] == '.') || in nfsvno_rename()
1634 (tondp->ni_cnd.cn_namelen == 2 && in nfsvno_rename()
1635 tondp->ni_cnd.cn_nameptr[0] == '.' && in nfsvno_rename()
1636 tondp->ni_cnd.cn_nameptr[1] == '.')) { in nfsvno_rename()
1641 if (fvp->v_type == VDIR && fvp->v_mountedhere) { in nfsvno_rename()
1642 error = (nd->nd_flag & ND_NFSV2) ? ENOTEMPTY : EXDEV; in nfsvno_rename()
1645 if (fvp->v_mount != tdvp->v_mount) { in nfsvno_rename()
1646 error = (nd->nd_flag & ND_NFSV2) ? ENOTEMPTY : EXDEV; in nfsvno_rename()
1650 error = (nd->nd_flag & ND_NFSV2) ? ENOTEMPTY : EINVAL; in nfsvno_rename()
1662 if (nd->nd_flag & ND_NFSV4) { in nfsvno_rename()
1664 if (nfsrv_recalldeleg || (nd->nd_flag & ND_NFSV41) == 0) in nfsvno_rename()
1666 (nfsquad_t)((u_quad_t)0), p); in nfsvno_rename()
1669 nd->nd_clientid, p); in nfsvno_rename()
1674 if (nfsrv_recalldeleg || (nd->nd_flag & ND_NFSV41) == 0) in nfsvno_rename()
1676 (nfsquad_t)((u_quad_t)0), p); in nfsvno_rename()
1679 nd->nd_clientid, p); in nfsvno_rename()
1689 nfsd_recalldelegation(fvp, p); in nfsvno_rename()
1692 if ((nd->nd_flag & ND_NFSV41) != 0) in nfsvno_rename()
1693 error = nfsvno_getfh(tvp, &fh2, p); in nfsvno_rename()
1695 nfsrv_pnfsremovesetup(tvp, p, dsdvp, &mirrorcnt, fname, in nfsvno_rename()
1698 " dsdvp=%p\n", dsdvp[0]); in nfsvno_rename()
1703 error = VOP_GETWRITEMOUNT(tondp->ni_dvp, &mp); in nfsvno_rename()
1708 error = lockmgr(&mp->mnt_renamelock, in nfsvno_rename()
1716 error = VOP_RENAME(fromndp->ni_dvp, fromndp->ni_vp, in nfsvno_rename()
1717 &fromndp->ni_cnd, tondp->ni_dvp, tondp->ni_vp, in nfsvno_rename()
1718 &tondp->ni_cnd); in nfsvno_rename()
1719 lockmgr(&mp->mnt_renamelock, LK_RELEASE, 0); in nfsvno_rename()
1728 vrele(fromndp->ni_dvp); in nfsvno_rename()
1733 lockmgr(&mp->mnt_renamelock, LK_EXCLUSIVE, 0); in nfsvno_rename()
1734 lockmgr(&mp->mnt_renamelock, LK_RELEASE, 0); in nfsvno_rename()
1745 nfsrv_pnfsremove(dsdvp, mirrorcnt, fname, &fh, p); in nfsvno_rename()
1750 if ((nd->nd_flag & ND_NFSV41) != 0 && error == 0) { in nfsvno_rename()
1765 nfsrv_removedeleg(&fh2, nd, p); in nfsvno_rename()
1780 nfsvno_link(struct nameidata *ndp, struct vnode *vp, nfsquad_t clientid, in nfsvno_link() argument
1781 struct ucred *cred, struct thread *p, struct nfsexstuff *exp) in nfsvno_link() argument
1786 xp = ndp->ni_vp; in nfsvno_link()
1790 xp = ndp->ni_dvp; in nfsvno_link()
1791 if (vp->v_mount != xp->v_mount) in nfsvno_link()
1795 NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY); in nfsvno_link()
1796 if (!VN_IS_DOOMED(vp)) { in nfsvno_link()
1797 error = nfsrv_checkremove(vp, 0, NULL, clientid, p); in nfsvno_link()
1799 error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd); in nfsvno_link()
1802 if (ndp->ni_dvp == vp) { in nfsvno_link()
1803 vrele(ndp->ni_dvp); in nfsvno_link()
1804 NFSVOPUNLOCK(vp); in nfsvno_link()
1806 vref(vp); in nfsvno_link()
1807 VOP_VPUT_PAIR(ndp->ni_dvp, &vp, true); in nfsvno_link()
1810 if (ndp->ni_dvp == ndp->ni_vp) in nfsvno_link()
1811 vrele(ndp->ni_dvp); in nfsvno_link()
1813 vput(ndp->ni_dvp); in nfsvno_link()
1814 if (ndp->ni_vp) in nfsvno_link()
1815 vrele(ndp->ni_vp); in nfsvno_link()
1826 nfsvno_fsync(struct vnode *vp, u_int64_t off, int cnt, struct ucred *cred, in nfsvno_fsync() argument
1840 (vp->v_mount->mnt_kern_flag & MNTK_USES_BCACHE) == 0) { in nfsvno_fsync()
1844 vnode_pager_clean_sync(vp); in nfsvno_fsync()
1845 error = VOP_FSYNC(vp, MNT_WAIT, td); in nfsvno_fsync()
1852 int iosize = vp->v_mount->mnt_stat.f_iosize; in nfsvno_fsync()
1853 int iomask = iosize - 1; in nfsvno_fsync()
1858 * Align to iosize boundary, super-align to page boundary. in nfsvno_fsync()
1870 if (vp->v_object && vm_object_mightbedirty(vp->v_object)) { in nfsvno_fsync()
1871 VM_OBJECT_WLOCK(vp->v_object); in nfsvno_fsync()
1872 vm_object_page_clean(vp->v_object, off, off + cnt, in nfsvno_fsync()
1874 VM_OBJECT_WUNLOCK(vp->v_object); in nfsvno_fsync()
1877 bo = &vp->v_bufobj; in nfsvno_fsync()
1892 if ((bp = gbincore(&vp->v_bufobj, lblkno)) != NULL) { in nfsvno_fsync()
1898 if ((bp->b_flags & (B_DELWRI|B_INVAL)) == in nfsvno_fsync()
1901 bp->b_flags &= ~B_ASYNC; in nfsvno_fsync()
1911 cnt -= iosize; in nfsvno_fsync()
1924 nfsvno_statfs(struct vnode *vp, struct statfs *sf) in nfsvno_statfs() argument
1933 error = nfsrv_pnfsstatfs(tsf, vp->v_mount); in nfsvno_statfs()
1939 error = VFS_STATFS(vp->v_mount, sf); in nfsvno_statfs()
1942 sf->f_blocks = tsf->f_blocks; in nfsvno_statfs()
1943 sf->f_bavail = tsf->f_bavail; in nfsvno_statfs()
1944 sf->f_bfree = tsf->f_bfree; in nfsvno_statfs()
1945 sf->f_bsize = tsf->f_bsize; in nfsvno_statfs()
1954 if (sf->f_bavail < 0) in nfsvno_statfs()
1955 sf->f_bavail = 0; in nfsvno_statfs()
1956 if (sf->f_ffree < 0) in nfsvno_statfs()
1957 sf->f_ffree = 0; in nfsvno_statfs()
1975 struct vnode *vp = NULL; in nfsvno_open() local
1978 struct thread *p = curthread; in nfsvno_open() local
1981 if (ndp->ni_vp == NULL) { in nfsvno_open()
1986 oldrepstat = nd->nd_repstat; in nfsvno_open()
1987 nd->nd_repstat = nfsrv_opencheck(clientid, in nfsvno_open()
1988 stateidp, stp, NULL, nd, p, nd->nd_repstat); in nfsvno_open()
1989 if (nd->nd_repstat != 0 && oldrepstat == 0) in nfsvno_open()
1992 if (!nd->nd_repstat) { in nfsvno_open()
1993 if (ndp->ni_vp == NULL) { in nfsvno_open()
1994 nd->nd_repstat = VOP_CREATE(ndp->ni_dvp, in nfsvno_open()
1995 &ndp->ni_vp, &ndp->ni_cnd, &nvap->na_vattr); in nfsvno_open()
1997 if (nd->nd_repstat == 0) { in nfsvno_open()
2003 nfsrv_pnfscreate(ndp->ni_vp, &nvap->na_vattr, in nfsvno_open()
2004 cred, p); in nfsvno_open()
2006 VOP_VPUT_PAIR(ndp->ni_dvp, nd->nd_repstat == 0 ? in nfsvno_open()
2007 &ndp->ni_vp : NULL, false); in nfsvno_open()
2009 if (!nd->nd_repstat) { in nfsvno_open()
2013 nvap->na_atime.tv_sec = cverf[0]; in nfsvno_open()
2014 nvap->na_atime.tv_nsec = cverf[1]; in nfsvno_open()
2015 nd->nd_repstat = VOP_SETATTR(ndp->ni_vp, in nfsvno_open()
2016 &nvap->na_vattr, cred); in nfsvno_open()
2017 if (nd->nd_repstat != 0) { in nfsvno_open()
2018 vput(ndp->ni_vp); in nfsvno_open()
2019 ndp->ni_vp = NULL; in nfsvno_open()
2020 nd->nd_repstat = NFSERR_NOTSUPP; in nfsvno_open()
2025 nfsrv_fixattr(nd, ndp->ni_vp, nvap, in nfsvno_open()
2026 aclp, p, attrbitp, exp); in nfsvno_open()
2029 vp = ndp->ni_vp; in nfsvno_open()
2032 vp = ndp->ni_vp; in nfsvno_open()
2034 if (ndp->ni_dvp == vp) in nfsvno_open()
2035 vrele(ndp->ni_dvp); in nfsvno_open()
2037 vput(ndp->ni_dvp); in nfsvno_open()
2039 if (NFSVNO_ISSETSIZE(nvap) && vp->v_type == VREG) { in nfsvno_open()
2040 if (ndp->ni_cnd.cn_flags & RDONLY) in nfsvno_open()
2044 nd->nd_repstat = nfsvno_accchk(vp, in nfsvno_open()
2045 VWRITE, cred, &nes, p, in nfsvno_open()
2048 nd->nd_repstat = nfsrv_opencheck(clientid, in nfsvno_open()
2049 stateidp, stp, vp, nd, p, nd->nd_repstat); in nfsvno_open()
2050 if (!nd->nd_repstat) { in nfsvno_open()
2051 tempsize = nvap->na_size; in nfsvno_open()
2053 nvap->na_size = tempsize; in nfsvno_open()
2054 nd->nd_repstat = nfsvno_setattr(vp, in nfsvno_open()
2055 nvap, cred, p, exp); in nfsvno_open()
2057 } else if (vp->v_type == VREG) { in nfsvno_open()
2058 nd->nd_repstat = nfsrv_opencheck(clientid, in nfsvno_open()
2059 stateidp, stp, vp, nd, p, nd->nd_repstat); in nfsvno_open()
2072 if (ndp->ni_dvp == ndp->ni_vp) in nfsvno_open()
2073 vrele(ndp->ni_dvp); in nfsvno_open()
2075 vput(ndp->ni_dvp); in nfsvno_open()
2076 if (ndp->ni_vp) in nfsvno_open()
2077 vput(ndp->ni_vp); in nfsvno_open()
2079 *vpp = vp; in nfsvno_open()
2091 nfsvno_updfilerev(struct vnode *vp, struct nfsvattr *nvap, in nfsvno_updfilerev() argument
2092 struct nfsrv_descript *nd, struct thread *p) in nfsvno_updfilerev() argument
2098 if (NFSVOPISLOCKED(vp) != LK_EXCLUSIVE) { in nfsvno_updfilerev()
2099 NFSVOPLOCK(vp, LK_UPGRADE | LK_RETRY); in nfsvno_updfilerev()
2100 if (VN_IS_DOOMED(vp)) in nfsvno_updfilerev()
2103 (void) VOP_SETATTR(vp, &va, nd->nd_cred); in nfsvno_updfilerev()
2104 (void) nfsvno_getattr(vp, nvap, nd, p, 1, NULL); in nfsvno_updfilerev()
2112 nfsvno_fillattr(struct nfsrv_descript *nd, struct mount *mp, struct vnode *vp, in nfsvno_fillattr() argument
2114 struct ucred *cred, struct thread *p, int isdgram, int reterr, in nfsvno_fillattr() argument
2133 error = nfsv4_fillattr(nd, mp, vp, NULL, &nvap->na_vattr, fhp, rderror, in nfsvno_fillattr()
2134 attrbitp, cred, p, isdgram, reterr, supports_nfsv4acls, at_root, in nfsvno_fillattr()
2144 static void nfs_dtypetovtype(struct nfsvattr *nvap, struct vnode *vp, in nfs_dtypetovtype() argument
2148 if ((vn_irflag_read(vp) & VIRF_NAMEDDIR) != 0) { in nfs_dtypetovtype()
2149 nvap->na_type = VREG; in nfs_dtypetovtype()
2150 nvap->na_bsdflags |= SFBSD_NAMEDATTR; in nfs_dtypetovtype()
2152 nvap->na_type = dtype_to_vnode[dtype]; in nfs_dtypetovtype()
2154 nvap->na_type = VNON; in nfs_dtypetovtype()
2161 * - mallocs what it thinks is enough to read
2163 * - calls VOP_READDIR()
2164 * - loops around building the reply
2168 * - it trims out records with d_fileno == 0
2171 * - it trims out records with d_type == DT_WHT
2184 struct vnode *vp, struct nfsexstuff *exp) in nfsrvd_readdir() argument
2198 struct thread *p = curthread; in nfsrvd_readdir() local
2200 if (nd->nd_repstat) { in nfsrvd_readdir()
2204 if (nd->nd_flag & ND_NFSV2) { in nfsrvd_readdir()
2218 siz = ((cnt + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1)); in nfsrvd_readdir()
2220 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdir()
2221 nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1, in nfsrvd_readdir()
2230 if (!nd->nd_repstat && toff && verf != at.na_filerev) in nfsrvd_readdir()
2231 nd->nd_repstat = NFSERR_BAD_COOKIE; in nfsrvd_readdir()
2234 if (!nd->nd_repstat && vp->v_type != VDIR) in nfsrvd_readdir()
2235 nd->nd_repstat = NFSERR_NOTDIR; in nfsrvd_readdir()
2236 if (nd->nd_repstat == 0 && cnt == 0) { in nfsrvd_readdir()
2237 if (nd->nd_flag & ND_NFSV2) in nfsrvd_readdir()
2239 nd->nd_repstat = EPERM; in nfsrvd_readdir()
2241 nd->nd_repstat = NFSERR_TOOSMALL; in nfsrvd_readdir()
2243 if (!nd->nd_repstat) in nfsrvd_readdir()
2244 nd->nd_repstat = nfsvno_accchk(vp, VEXEC, in nfsrvd_readdir()
2245 nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, in nfsrvd_readdir()
2247 if (nd->nd_repstat) { in nfsrvd_readdir()
2248 vput(vp); in nfsrvd_readdir()
2249 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdir()
2253 is_ufs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "ufs") == 0; in nfsrvd_readdir()
2271 nd->nd_repstat = VOP_READDIR(vp, &io, nd->nd_cred, &eofflag, &ncookies, in nfsrvd_readdir()
2275 siz -= io.uio_resid; in nfsrvd_readdir()
2277 if (!cookies && !nd->nd_repstat) in nfsrvd_readdir()
2278 nd->nd_repstat = NFSERR_PERM; in nfsrvd_readdir()
2279 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdir()
2280 getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL); in nfsrvd_readdir()
2281 if (!nd->nd_repstat) in nfsrvd_readdir()
2282 nd->nd_repstat = getret; in nfsrvd_readdir()
2286 * Handles the failed cases. nd->nd_repstat == 0 past here. in nfsrvd_readdir()
2288 if (nd->nd_repstat) { in nfsrvd_readdir()
2289 vput(vp); in nfsrvd_readdir()
2293 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdir()
2302 vput(vp); in nfsrvd_readdir()
2303 if (nd->nd_flag & ND_NFSV2) { in nfsrvd_readdir()
2335 (dp->d_fileno == 0 || dp->d_type == DT_WHT || in nfsrvd_readdir()
2337 cpos += dp->d_reclen; in nfsrvd_readdir()
2340 ncookies--; in nfsrvd_readdir()
2347 vput(vp); in nfsrvd_readdir()
2356 (nd->nd_flag & (ND_TLS | ND_EXTPG | ND_SAVEREPLY)) == ND_TLS && in nfsrvd_readdir()
2357 (nd->nd_flag & (ND_NFSV4 | ND_NFSV41)) != ND_NFSV4) in nfsrvd_readdir()
2358 nd->nd_flag |= ND_EXTPG; in nfsrvd_readdir()
2366 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdir()
2377 nlen = dp->d_namlen; in nfsrvd_readdir()
2378 if (dp->d_fileno != 0 && dp->d_type != DT_WHT && in nfsrvd_readdir()
2380 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdir()
2393 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdir()
2396 txdr_hyper(dp->d_fileno, tl); in nfsrvd_readdir()
2400 *tl = txdr_unsigned(dp->d_fileno); in nfsrvd_readdir()
2402 (void) nfsm_strtom(nd, dp->d_name, nlen); in nfsrvd_readdir()
2403 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdir()
2411 cpos += dp->d_reclen; in nfsrvd_readdir()
2414 ncookies--; in nfsrvd_readdir()
2431 vput(vp); in nfsrvd_readdir()
2441 struct vnode *vp, struct nfsexstuff *exp) in nfsrvd_readdirplus() argument
2464 struct thread *p = curthread; in nfsrvd_readdirplus() local
2470 if (nd->nd_repstat) { in nfsrvd_readdirplus()
2504 siz = ((siz + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1)); in nfsrvd_readdirplus()
2506 if (nd->nd_flag & ND_NFSV4) { in nfsrvd_readdirplus()
2529 nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL); in nfsrvd_readdirplus()
2531 if (!nd->nd_repstat) { in nfsrvd_readdirplus()
2539 if (nd->nd_flag & ND_NFSV4) { in nfsrvd_readdirplus()
2540 nd->nd_repstat = NFSERR_NOTSAME; in nfsrvd_readdirplus()
2542 nd->nd_repstat = NFSERR_BAD_COOKIE; in nfsrvd_readdirplus()
2547 if (!nd->nd_repstat && vp->v_type != VDIR) in nfsrvd_readdirplus()
2548 nd->nd_repstat = NFSERR_NOTDIR; in nfsrvd_readdirplus()
2549 if (!nd->nd_repstat && cnt == 0) in nfsrvd_readdirplus()
2550 nd->nd_repstat = NFSERR_TOOSMALL; in nfsrvd_readdirplus()
2551 if (!nd->nd_repstat) in nfsrvd_readdirplus()
2552 nd->nd_repstat = nfsvno_accchk(vp, VEXEC, in nfsrvd_readdirplus()
2553 nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, in nfsrvd_readdirplus()
2555 if (nd->nd_repstat) { in nfsrvd_readdirplus()
2556 vput(vp); in nfsrvd_readdirplus()
2557 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdirplus()
2561 is_ufs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "ufs") == 0; in nfsrvd_readdirplus()
2562 is_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs") == 0; in nfsrvd_readdirplus()
2581 nd->nd_repstat = VOP_READDIR(vp, &io, nd->nd_cred, &eofflag, &ncookies, in nfsrvd_readdirplus()
2585 siz -= io.uio_resid; in nfsrvd_readdirplus()
2587 getret = nfsvno_getattr(vp, &at, nd, p, 1, NULL); in nfsrvd_readdirplus()
2589 if (!cookies && !nd->nd_repstat) in nfsrvd_readdirplus()
2590 nd->nd_repstat = NFSERR_PERM; in nfsrvd_readdirplus()
2591 if (!nd->nd_repstat) in nfsrvd_readdirplus()
2592 nd->nd_repstat = getret; in nfsrvd_readdirplus()
2593 if (nd->nd_repstat) { in nfsrvd_readdirplus()
2594 vput(vp); in nfsrvd_readdirplus()
2598 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdirplus()
2607 vput(vp); in nfsrvd_readdirplus()
2608 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdirplus()
2637 (dp->d_fileno == 0 || dp->d_type == DT_WHT || in nfsrvd_readdirplus()
2639 ((nd->nd_flag & ND_NFSV4) && in nfsrvd_readdirplus()
2640 ((dp->d_namlen == 1 && dp->d_name[0] == '.') || in nfsrvd_readdirplus()
2641 (dp->d_namlen==2 && dp->d_name[0]=='.' && dp->d_name[1]=='.'))))) { in nfsrvd_readdirplus()
2642 cpos += dp->d_reclen; in nfsrvd_readdirplus()
2645 ncookies--; in nfsrvd_readdirplus()
2657 mp = vp->v_mount; in nfsrvd_readdirplus()
2659 NFSVOPUNLOCK(vp); in nfsrvd_readdirplus()
2660 nd->nd_repstat = vfs_busy(mp, 0); in nfsrvd_readdirplus()
2662 if (nd->nd_repstat != 0) { in nfsrvd_readdirplus()
2663 vrele(vp); in nfsrvd_readdirplus()
2666 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdirplus()
2686 cn.cn_cred = nd->nd_cred; in nfsrvd_readdirplus()
2701 (nd->nd_flag & (ND_TLS | ND_EXTPG | ND_SAVEREPLY)) == ND_TLS && in nfsrvd_readdirplus()
2702 (nd->nd_flag & (ND_NFSV4 | ND_NFSV41)) != ND_NFSV4) in nfsrvd_readdirplus()
2703 nd->nd_flag |= ND_EXTPG; in nfsrvd_readdirplus()
2709 mb0 = nd->nd_mb; in nfsrvd_readdirplus()
2710 bpos0 = nd->nd_bpos; in nfsrvd_readdirplus()
2711 bextpg0 = nd->nd_bextpg; in nfsrvd_readdirplus()
2712 bextpgsiz0 = nd->nd_bextpgsiz; in nfsrvd_readdirplus()
2720 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdirplus()
2732 mb1 = nd->nd_mb; in nfsrvd_readdirplus()
2733 bpos1 = nd->nd_bpos; in nfsrvd_readdirplus()
2734 bextpg1 = nd->nd_bextpg; in nfsrvd_readdirplus()
2735 bextpgsiz1 = nd->nd_bextpgsiz; in nfsrvd_readdirplus()
2740 nlen = dp->d_namlen; in nfsrvd_readdirplus()
2741 if (dp->d_fileno != 0 && dp->d_type != DT_WHT && in nfsrvd_readdirplus()
2743 ((nd->nd_flag & ND_NFSV3) || nlen > 2 || in nfsrvd_readdirplus()
2744 (nlen==2 && (dp->d_name[0]!='.' || dp->d_name[1]!='.')) in nfsrvd_readdirplus()
2745 || (nlen == 1 && dp->d_name[0] != '.'))) { in nfsrvd_readdirplus()
2750 mb1 = nd->nd_mb; in nfsrvd_readdirplus()
2751 bpos1 = nd->nd_bpos; in nfsrvd_readdirplus()
2752 bextpg1 = nd->nd_bextpg; in nfsrvd_readdirplus()
2753 bextpgsiz1 = nd->nd_bextpgsiz; in nfsrvd_readdirplus()
2765 mounted_on_fileno = (uint64_t)dp->d_fileno; in nfsrvd_readdirplus()
2766 if ((nd->nd_flag & ND_NFSV3) || in nfsrvd_readdirplus()
2768 dp->d_type == DT_UNKNOWN || in nfsrvd_readdirplus()
2769 (dp->d_type == DT_DIR && in nfsrvd_readdirplus()
2771 if (nd->nd_flag & ND_NFSV4) in nfsrvd_readdirplus()
2773 vp, dp->d_fileno); in nfsrvd_readdirplus()
2776 r = VFS_VGET(mp, dp->d_fileno, in nfsrvd_readdirplus()
2780 if (r == 0 && (vn_irflag_read(vp) & in nfsrvd_readdirplus()
2792 nd->nd_cred; in nfsrvd_readdirplus()
2794 cn.cn_nameptr = dp->d_name; in nfsrvd_readdirplus()
2798 if ((vn_irflag_read(vp) & in nfsrvd_readdirplus()
2803 dp->d_name[0] == '.' && in nfsrvd_readdirplus()
2804 dp->d_name[1] == '.') in nfsrvd_readdirplus()
2807 if (NFSVOPLOCK(vp, LK_SHARED) in nfsrvd_readdirplus()
2809 nd->nd_repstat = EPERM; in nfsrvd_readdirplus()
2812 if ((vp->v_vflag & VV_ROOT) != 0 in nfsrvd_readdirplus()
2815 vref(vp); in nfsrvd_readdirplus()
2816 nvp = vp; in nfsrvd_readdirplus()
2819 r = VOP_LOOKUP(vp, &nvp, in nfsrvd_readdirplus()
2821 if (vp != nvp) in nfsrvd_readdirplus()
2822 NFSVOPUNLOCK(vp); in nfsrvd_readdirplus()
2833 (nd->nd_flag & ND_NFSV4) != 0 && in nfsrvd_readdirplus()
2834 nvp->v_type == VDIR && in nfsrvd_readdirplus()
2835 nvp->v_mountedhere != NULL) { in nfsrvd_readdirplus()
2836 new_mp = nvp->v_mountedhere; in nfsrvd_readdirplus()
2863 ((nd->nd_flag & ND_NFSV3) || in nfsrvd_readdirplus()
2865 r = nfsvno_getfh(nvp, &nfh, p); in nfsrvd_readdirplus()
2867 r = nfsvno_getattr(nvp, nvap, nd, p, in nfsrvd_readdirplus()
2871 (nd->nd_flag & ND_NFSV4) != 0 && in nfsrvd_readdirplus()
2872 nvp->v_type == VDIR && in nfsrvd_readdirplus()
2873 vp->v_mount != nvp->v_mount) { in nfsrvd_readdirplus()
2883 new_mp = nvp->v_mount; in nfsrvd_readdirplus()
2908 if ((nd->nd_flag & ND_NFSV3) || in nfsrvd_readdirplus()
2911 nd->nd_repstat = r; in nfsrvd_readdirplus()
2917 VATTR_NULL(&nvap->na_vattr); in nfsrvd_readdirplus()
2918 nvap->na_fileid = dp->d_fileno; in nfsrvd_readdirplus()
2919 nfs_dtypetovtype(nvap, vp, dp->d_type); in nfsrvd_readdirplus()
2925 if (nd->nd_flag & ND_NFSV3) { in nfsrvd_readdirplus()
2928 txdr_hyper(dp->d_fileno, tl); in nfsrvd_readdirplus()
2929 dirlen += nfsm_strtom(nd, dp->d_name, nlen); in nfsrvd_readdirplus()
2942 dirlen += nfsm_strtom(nd, dp->d_name, nlen); in nfsrvd_readdirplus()
2954 nd->nd_cred, p); in nfsrvd_readdirplus()
2975 &nd->nd_repstat); in nfsrvd_readdirplus()
2976 if (nd->nd_repstat) { in nfsrvd_readdirplus()
2986 nd->nd_cred, p, isdgram, 0, in nfsrvd_readdirplus()
2993 nd->nd_cred, p, isdgram, 0, in nfsrvd_readdirplus()
3008 cpos += dp->d_reclen; in nfsrvd_readdirplus()
3011 ncookies--; in nfsrvd_readdirplus()
3013 vrele(vp); in nfsrvd_readdirplus()
3020 if (dirlen > cnt || nd->nd_repstat) { in nfsrvd_readdirplus()
3021 if (!nd->nd_repstat && entrycnt == 0) in nfsrvd_readdirplus()
3022 nd->nd_repstat = NFSERR_TOOSMALL; in nfsrvd_readdirplus()
3023 if (nd->nd_repstat) { in nfsrvd_readdirplus()
3025 if (nd->nd_flag & ND_NFSV3) in nfsrvd_readdirplus()
3032 if (!nd->nd_repstat) { in nfsrvd_readdirplus()
3047 vput(vp); in nfsrvd_readdirplus()
3057 nfsrv_sattr(struct nfsrv_descript *nd, vnode_t vp, struct nfsvattr *nvap, in nfsrv_sattr() argument
3058 nfsattrbit_t *attrbitp, NFSACL_T *aclp, struct thread *p) in nfsrv_sattr() argument
3064 switch (nd->nd_flag & (ND_NFSV2 | ND_NFSV3 | ND_NFSV4)) { in nfsrv_sattr()
3069 * --> check the low order 2 bytes for 0xffff in nfsrv_sattr()
3071 if ((fxdr_unsigned(int, sp->sa_mode) & 0xffff) != 0xffff) in nfsrv_sattr()
3072 nvap->na_mode = nfstov_mode(sp->sa_mode); in nfsrv_sattr()
3073 if (sp->sa_uid != newnfs_xdrneg1) in nfsrv_sattr()
3074 nvap->na_uid = fxdr_unsigned(uid_t, sp->sa_uid); in nfsrv_sattr()
3075 if (sp->sa_gid != newnfs_xdrneg1) in nfsrv_sattr()
3076 nvap->na_gid = fxdr_unsigned(gid_t, sp->sa_gid); in nfsrv_sattr()
3077 if (sp->sa_size != newnfs_xdrneg1) in nfsrv_sattr()
3078 nvap->na_size = fxdr_unsigned(u_quad_t, sp->sa_size); in nfsrv_sattr()
3079 if (sp->sa_atime.nfsv2_sec != newnfs_xdrneg1) { in nfsrv_sattr()
3081 fxdr_nfsv2time(&sp->sa_atime, &nvap->na_atime); in nfsrv_sattr()
3083 nvap->na_atime.tv_sec = in nfsrv_sattr()
3084 fxdr_unsigned(u_int32_t,sp->sa_atime.nfsv2_sec); in nfsrv_sattr()
3085 nvap->na_atime.tv_nsec = 0; in nfsrv_sattr()
3088 if (sp->sa_mtime.nfsv2_sec != newnfs_xdrneg1) in nfsrv_sattr()
3089 fxdr_nfsv2time(&sp->sa_mtime, &nvap->na_mtime); in nfsrv_sattr()
3095 nvap->na_mode = nfstov_mode(*tl); in nfsrv_sattr()
3100 nvap->na_uid = fxdr_unsigned(uid_t, *tl); in nfsrv_sattr()
3105 nvap->na_gid = fxdr_unsigned(gid_t, *tl); in nfsrv_sattr()
3110 nvap->na_size = fxdr_hyper(tl); in nfsrv_sattr()
3116 fxdr_nfsv3time(tl, &nvap->na_atime); in nfsrv_sattr()
3120 vfs_timestamp(&nvap->na_atime); in nfsrv_sattr()
3121 nvap->na_vaflags |= VA_UTIMES_NULL; in nfsrv_sattr()
3128 fxdr_nfsv3time(tl, &nvap->na_mtime); in nfsrv_sattr()
3129 nvap->na_vaflags &= ~VA_UTIMES_NULL; in nfsrv_sattr()
3132 vfs_timestamp(&nvap->na_mtime); in nfsrv_sattr()
3134 nvap->na_vaflags |= VA_UTIMES_NULL; in nfsrv_sattr()
3139 error = nfsv4_sattr(nd, vp, nvap, attrbitp, aclp, p); in nfsrv_sattr()
3151 nfsv4_sattr(struct nfsrv_descript *nd, vnode_t vp, struct nfsvattr *nvap, in nfsv4_sattr() argument
3152 nfsattrbit_t *attrbitp, NFSACL_T *aclp, struct thread *p) in nfsv4_sattr() argument
3178 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3184 nvap->na_flags = 0; in nfsv4_sattr()
3196 if (!nd->nd_repstat) { in nfsv4_sattr()
3197 if (vp != NULL && vp->v_type != VREG) in nfsv4_sattr()
3198 nd->nd_repstat = (vp->v_type == VDIR) ? in nfsv4_sattr()
3201 nvap->na_size = fxdr_hyper(tl); in nfsv4_sattr()
3207 &aclsize, p); in nfsv4_sattr()
3210 if (aceerr && !nd->nd_repstat) in nfsv4_sattr()
3211 nd->nd_repstat = aceerr; in nfsv4_sattr()
3216 if (!nd->nd_repstat) in nfsv4_sattr()
3217 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3222 if (nd->nd_repstat == 0) { in nfsv4_sattr()
3224 nvap->na_flags |= UF_HIDDEN; in nfsv4_sattr()
3231 error = nfsm_advance(nd, NFSM_RNDUP(i), -1); in nfsv4_sattr()
3234 if (!nd->nd_repstat) in nfsv4_sattr()
3235 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3241 if (!nd->nd_repstat) in nfsv4_sattr()
3242 nvap->na_mode = nfstov_mode(*tl); in nfsv4_sattr()
3262 if (!nd->nd_repstat) { in nfsv4_sattr()
3263 nd->nd_repstat = nfsv4_strtouid(nd, cp, j, in nfsv4_sattr()
3265 if (!nd->nd_repstat) in nfsv4_sattr()
3266 nvap->na_uid = uid; in nfsv4_sattr()
3289 if (!nd->nd_repstat) { in nfsv4_sattr()
3290 nd->nd_repstat = nfsv4_strtogid(nd, cp, j, in nfsv4_sattr()
3292 if (!nd->nd_repstat) in nfsv4_sattr()
3293 nvap->na_gid = gid; in nfsv4_sattr()
3301 if (nd->nd_repstat == 0) { in nfsv4_sattr()
3303 nvap->na_flags |= UF_SYSTEM; in nfsv4_sattr()
3312 if (!nd->nd_repstat) in nfsv4_sattr()
3313 fxdr_nfsv4time(tl, &nvap->na_atime); in nfsv4_sattr()
3316 } else if (!nd->nd_repstat) { in nfsv4_sattr()
3317 vfs_timestamp(&nvap->na_atime); in nfsv4_sattr()
3318 nvap->na_vaflags |= VA_UTIMES_NULL; in nfsv4_sattr()
3323 if (!nd->nd_repstat) in nfsv4_sattr()
3324 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3329 if (!nd->nd_repstat) in nfsv4_sattr()
3330 fxdr_nfsv4time(tl, &nvap->na_btime); in nfsv4_sattr()
3338 if (!nd->nd_repstat) in nfsv4_sattr()
3339 fxdr_nfsv4time(tl, &nvap->na_mtime); in nfsv4_sattr()
3340 nvap->na_vaflags &= ~VA_UTIMES_NULL; in nfsv4_sattr()
3342 } else if (!nd->nd_repstat) { in nfsv4_sattr()
3343 vfs_timestamp(&nvap->na_mtime); in nfsv4_sattr()
3345 nvap->na_vaflags |= VA_UTIMES_NULL; in nfsv4_sattr()
3353 * vp == NULL implies an Open/Create operation. in nfsv4_sattr()
3360 if (!nd->nd_repstat) { in nfsv4_sattr()
3361 if ((nd->nd_flag & ND_NFSV41) == 0) in nfsv4_sattr()
3362 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3364 (mask & ~07777) != 0 || vp == NULL) in nfsv4_sattr()
3365 nd->nd_repstat = NFSERR_INVAL; in nfsv4_sattr()
3367 moderet = VOP_GETATTR(vp, &va, in nfsv4_sattr()
3368 nd->nd_cred); in nfsv4_sattr()
3370 nvap->na_mode = (mode & mask) | in nfsv4_sattr()
3373 nd->nd_repstat = moderet; in nfsv4_sattr()
3383 * If vp != NULL, this is not a file object creation. in nfsv4_sattr()
3385 if (!nd->nd_repstat) { in nfsv4_sattr()
3386 if ((nd->nd_flag & ND_NFSV42) == 0) in nfsv4_sattr()
3387 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3388 else if ((mask & ~0777) != 0 || vp != NULL || in nfsv4_sattr()
3390 nd->nd_repstat = NFSERR_INVAL; in nfsv4_sattr()
3392 nvap->na_mode = (mode & ~mask); in nfsv4_sattr()
3397 nd->nd_repstat = NFSERR_ATTRNOTSUPP; in nfsv4_sattr()
3408 * padding. This also skips over unparsed non-supported attributes. in nfsv4_sattr()
3415 error = nfsm_advance(nd, attrsize - attrsum, -1); in nfsv4_sattr()
3434 if (nd->nd_flag & ND_GSS) in nfsd_excred()
3435 exp->nes_exflag &= ~MNT_EXPORTANON; in nfsd_excred()
3450 if (NFSVNO_EXV4ONLY(exp) && !(nd->nd_flag & ND_NFSV4)) { in nfsd_excred()
3462 if (((nd->nd_flag & ND_GSS) == 0 && nd->nd_cred->cr_uid == 0) || in nfsd_excred()
3464 (nd->nd_flag & ND_AUTHNONE) != 0) { in nfsd_excred()
3465 nd->nd_cred->cr_uid = credanon->cr_uid; in nfsd_excred()
3466 nd->nd_cred->cr_gid = credanon->cr_gid; in nfsd_excred()
3472 crsetgroups(nd->nd_cred, credanon->cr_ngroups, in nfsd_excred()
3473 credanon->cr_groups); in nfsd_excred()
3474 } else if ((nd->nd_flag & ND_GSS) == 0) { in nfsd_excred()
3478 * list set up by "nfsuserd -manage-gids". in nfsd_excred()
3482 nd->nd_cred = nfsrv_getgrpscred(nd->nd_cred); in nfsd_excred()
3503 if (mp->mnt_exjail == NULL || in nfsvno_checkexp()
3504 mp->mnt_exjail->cr_prison != curthread->td_ucred->cr_prison) in nfsvno_checkexp()
3508 error = VFS_CHECKEXP(mp, nam, &exp->nes_exflag, credp, in nfsvno_checkexp()
3509 &exp->nes_numsecflavor, exp->nes_secflavors); in nfsvno_checkexp()
3512 exp->nes_exflag = 0; in nfsvno_checkexp()
3513 exp->nes_numsecflavor = 0; in nfsvno_checkexp()
3516 } else if (exp->nes_numsecflavor < 1 || exp->nes_numsecflavor > in nfsvno_checkexp()
3519 exp->nes_numsecflavor = 0; in nfsvno_checkexp()
3537 exp->nes_numsecflavor = 0; in nfsvno_fhtovp()
3538 error = VFS_FHTOVP(mp, &fhp->fh_fid, lktype, vpp); in nfsvno_fhtovp()
3544 if (mp->mnt_exjail == NULL || in nfsvno_fhtovp()
3545 mp->mnt_exjail->cr_prison != curthread->td_ucred->cr_prison) in nfsvno_fhtovp()
3549 error = VFS_CHECKEXP(mp, nam, &exp->nes_exflag, credp, in nfsvno_fhtovp()
3550 &exp->nes_numsecflavor, exp->nes_secflavors); in nfsvno_fhtovp()
3553 exp->nes_exflag = 0; in nfsvno_fhtovp()
3554 exp->nes_numsecflavor = 0; in nfsvno_fhtovp()
3559 } else if (exp->nes_numsecflavor < 1 || exp->nes_numsecflavor > in nfsvno_fhtovp()
3562 exp->nes_numsecflavor = 0; in nfsvno_fhtovp()
3572 * nfsd_fhtovp() - convert a fh to a vnode ptr
3573 * - look up fsid in mount list (if not found ret error)
3574 * - get vp and export rights by calling nfsvno_fhtovp()
3575 * - if cred->cr_uid == 0 or MNT_EXPORTANON set it to credanon
3577 * - if mpp != NULL, return the mount point so that it can
3593 fhp = (fhandle_t *)nfp->nfsrvfh_data; in nfsd_fhtovp()
3594 mp = vfs_busyfs(&fhp->fh_fsid); in nfsd_fhtovp()
3596 nd->nd_repstat = ESTALE; in nfsd_fhtovp()
3606 nd->nd_repstat = ESTALE; in nfsd_fhtovp()
3614 nd->nd_repstat = nfsvno_fhtovp(mp, fhp, nd->nd_nam, lktype, vpp, exp, in nfsd_fhtovp()
3618 if (nd->nd_repstat == 0 && in nfsd_fhtovp()
3619 nfp->nfsrvfh_len >= NFSX_MYFH + NFSX_V4NAMEDDIRFH && in nfsd_fhtovp()
3620 nfp->nfsrvfh_len <= NFSX_MYFH + NFSX_V4NAMEDATTRFH) { in nfsd_fhtovp()
3621 if (nfp->nfsrvfh_len == NFSX_MYFH + NFSX_V4NAMEDDIRFH) in nfsd_fhtovp()
3631 if (!nd->nd_repstat && exp->nes_exflag == 0 && in nfsd_fhtovp()
3632 !(nd->nd_flag & ND_NFSV4)) { in nfsd_fhtovp()
3635 nd->nd_repstat = EACCES; in nfsd_fhtovp()
3650 * that there be a way to turn that off--> ifdef'd. in nfsd_fhtovp()
3653 if (!nd->nd_repstat) { in nfsd_fhtovp()
3657 saddr = NFSSOCKADDR(nd->nd_nam, struct sockaddr_in *); in nfsd_fhtovp()
3658 saddr6 = NFSSOCKADDR(nd->nd_nam, struct sockaddr_in6 *); in nfsd_fhtovp()
3659 if (!(nd->nd_flag & ND_NFSV4) && in nfsd_fhtovp()
3660 ((saddr->sin_family == AF_INET && in nfsd_fhtovp()
3661 ntohs(saddr->sin_port) >= IPPORT_RESERVED) || in nfsd_fhtovp()
3662 (saddr6->sin6_family == AF_INET6 && in nfsd_fhtovp()
3663 ntohs(saddr6->sin6_port) >= IPPORT_RESERVED))) { in nfsd_fhtovp()
3665 nd->nd_repstat = (NFSERR_AUTHERR | AUTH_TOOWEAK); in nfsd_fhtovp()
3673 if (!nd->nd_repstat) { in nfsd_fhtovp()
3674 nd->nd_saveduid = nd->nd_cred->cr_uid; in nfsd_fhtovp()
3675 nd->nd_repstat = nfsd_excred(nd, exp, credanon, in nfsd_fhtovp()
3676 nfsrv_checkwrongsec(nd, nextop, (*vpp)->v_type)); in nfsd_fhtovp()
3677 if (nd->nd_repstat) in nfsd_fhtovp()
3682 if (nd->nd_repstat) { in nfsd_fhtovp()
3697 fp_getfvp(struct thread *p, int fd, struct file **fpp, struct vnode **vpp) in fp_getfvp() argument
3703 fdp = p->td_proc->p_fd; in fp_getfvp()
3704 if (fd < 0 || fd >= fdp->fd_nfiles || in fp_getfvp()
3705 (fp = fdp->fd_ofiles[fd].fde_file) == NULL) { in fp_getfvp()
3722 nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p) in nfsrv_v4rootexport() argument
3729 error = vfs_export(NFSD_VNET(nfsv4root_mnt), &nfsexargp->export, false); in nfsrv_v4rootexport()
3730 if ((nfsexargp->export.ex_flags & MNT_DELEXPORT) != 0) in nfsrv_v4rootexport()
3733 if (nfsexargp->fspec == NULL) { in nfsrv_v4rootexport()
3740 NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, nfsexargp->fspec); in nfsrv_v4rootexport()
3743 error = nfsvno_getfh(nd.ni_vp, &fh, p); in nfsrv_v4rootexport()
3798 NFSD_VNET(nfsv4root_mnt)->mnt_flag = (MNT_RDONLY | MNT_EXPORTED); in nfsd_mntinit()
3799 mtx_init(&NFSD_VNET(nfsv4root_mnt)->mnt_mtx, "nfs4mnt", NULL, MTX_DEF); in nfsd_mntinit()
3800 lockinit(&NFSD_VNET(nfsv4root_mnt)->mnt_explock, PVFS, "explock", 0, 0); in nfsd_mntinit()
3801 TAILQ_INIT(&NFSD_VNET(nfsv4root_mnt)->mnt_nvnodelist); in nfsd_mntinit()
3802 TAILQ_INIT(&NFSD_VNET(nfsv4root_mnt)->mnt_lazyvnodelist); in nfsd_mntinit()
3803 NFSD_VNET(nfsv4root_mnt)->mnt_export = NULL; in nfsd_mntinit()
3806 NFSD_VNET(nfsv4root_mnt)->mnt_opt = &NFSD_VNET(nfsv4root_opt); in nfsd_mntinit()
3807 NFSD_VNET(nfsv4root_mnt)->mnt_optnew = &NFSD_VNET(nfsv4root_newopt); in nfsd_mntinit()
3808 NFSD_VNET(nfsv4root_mnt)->mnt_nvnodelistsize = 0; in nfsd_mntinit()
3809 NFSD_VNET(nfsv4root_mnt)->mnt_lazyvnodelistsize = 0; in nfsd_mntinit()
3836 struct vnode *vp; in nfsvno_getvp() local
3839 mp = vfs_busyfs(&fhp->fh_fsid); in nfsvno_getvp()
3842 error = VFS_FHTOVP(mp, &fhp->fh_fid, LK_EXCLUSIVE, &vp); in nfsvno_getvp()
3846 return (vp); in nfsvno_getvp()
3853 nfsvno_advlock(struct vnode *vp, int ftype, u_int64_t first, in nfsvno_advlock() argument
3862 ASSERT_VOP_UNLOCKED(vp, "nfsvno_advlock: vp locked"); in nfsvno_advlock()
3870 tlen = end - first; in nfsvno_advlock()
3887 error = VOP_ADVLOCK(vp, (caddr_t)td->td_proc, F_UNLCK, &fl, in nfsvno_advlock()
3890 error = VOP_ADVLOCK(vp, (caddr_t)td->td_proc, F_SETLK, &fl, in nfsvno_advlock()
3908 error = vfs_stdcheckexp(NFSD_VNET(nfsv4root_mnt), nd->nd_nam, &exflags, in nfsvno_v4rootexport()
3918 nd->nd_flag |= ND_EXAUTHSYS; in nfsvno_v4rootexport()
3920 nd->nd_flag |= ND_EXGSS; in nfsvno_v4rootexport()
3922 nd->nd_flag |= ND_EXGSSINTEGRITY; in nfsvno_v4rootexport()
3924 nd->nd_flag |= ND_EXGSSPRIVACY; in nfsvno_v4rootexport()
3929 nd->nd_flag |= ND_EXTLS; in nfsvno_v4rootexport()
3931 nd->nd_flag |= ND_EXTLSCERT; in nfsvno_v4rootexport()
3933 nd->nd_flag |= ND_EXTLSCERTUSER; in nfsvno_v4rootexport()
3955 struct vnode *vp, *nvp, *curdvp; in nfssvc_nfsd() local
3964 if (uap->flag & NFSSVC_NFSDADDSOCK) { in nfssvc_nfsd()
3965 error = copyin(uap->argp, (caddr_t)&sockarg, sizeof (sockarg)); in nfssvc_nfsd()
3977 if (fp->f_type != DTYPE_SOCKET) { in nfssvc_nfsd()
3984 } else if (uap->flag & NFSSVC_NFSDNFSD) { in nfssvc_nfsd()
3985 if (uap->argp == NULL) { in nfssvc_nfsd()
3989 if ((uap->flag & NFSSVC_NEWSTRUCT) == 0) { in nfssvc_nfsd()
3990 error = copyin(uap->argp, &onfsdarg, sizeof(onfsdarg)); in nfssvc_nfsd()
4007 error = copyin(uap->argp, &nfsdarg, sizeof(nfsdarg)); in nfssvc_nfsd()
4078 } else if (uap->flag & NFSSVC_PNFSDS) { in nfssvc_nfsd()
4079 error = copyin(uap->argp, &pnfsdarg, sizeof(pnfsdarg)); in nfssvc_nfsd()
4115 &buflen, fname, td, &vp, &nvp, &pf, &ds, in nfssvc_nfsd()
4119 if (pf->dsf_dir >= nfsrv_dsdirsize) { in nfssvc_nfsd()
4121 pf->dsf_dir = 0; in nfssvc_nfsd()
4124 error = nfsrv_copymr(vp, nvp, in nfssvc_nfsd()
4125 ds->nfsdev_dsdir[pf->dsf_dir], ds, pf, in nfssvc_nfsd()
4127 buflen / sizeof(*pf), td->td_ucred, td); in nfssvc_nfsd()
4128 vput(vp); in nfssvc_nfsd()
4131 curdvp = fds->nfsdev_dsdir[pf->dsf_dir]; in nfssvc_nfsd()
4135 td->td_ucred, td); in nfssvc_nfsd()
4147 error = nfssvc_srvcall(td, uap, td->td_ucred); in nfssvc_nfsd()
4157 nfssvc_srvcall(struct thread *p, struct nfssvc_args *uap, struct ucred *cred) in nfssvc_srvcall() argument
4169 vnode_t vp; in nfssvc_srvcall() local
4174 if (uap->flag & NFSSVC_PUBLICFH) { in nfssvc_srvcall()
4177 error = copyin(uap->argp, in nfssvc_srvcall()
4181 } else if ((uap->flag & (NFSSVC_V4ROOTEXPORT | NFSSVC_NEWSTRUCT)) == in nfssvc_srvcall()
4183 error = copyin(uap->argp,(caddr_t)&export, in nfssvc_srvcall()
4199 error = nfsrv_v4rootexport(&export, cred, p); in nfssvc_srvcall()
4202 } else if ((uap->flag & (NFSSVC_V4ROOTEXPORT | NFSSVC_NEWSTRUCT)) == in nfssvc_srvcall()
4204 error = copyin(uap->argp,(caddr_t)&oexp, in nfssvc_srvcall()
4243 error = nfsrv_v4rootexport(&export, cred, p); in nfssvc_srvcall()
4246 } else if (uap->flag & NFSSVC_NOPUBLICFH) { in nfssvc_srvcall()
4249 } else if (uap->flag & NFSSVC_STABLERESTART) { in nfssvc_srvcall()
4250 error = copyin(uap->argp, (caddr_t)&stablefd, in nfssvc_srvcall()
4253 error = fp_getfvp(p, stablefd, &fp, &vp); in nfssvc_srvcall()
4260 nfsrv_setupstable(p); in nfssvc_srvcall()
4262 } else if (uap->flag & NFSSVC_ADMINREVOKE) { in nfssvc_srvcall()
4263 error = copyin(uap->argp, (caddr_t)&adminrevoke, in nfssvc_srvcall()
4266 error = nfsrv_adminrevoke(&adminrevoke, p); in nfssvc_srvcall()
4267 } else if (uap->flag & NFSSVC_DUMPCLIENTS) { in nfssvc_srvcall()
4268 error = copyin(uap->argp, (caddr_t)&dumplist, in nfssvc_srvcall()
4280 } else if (uap->flag & NFSSVC_DUMPLOCKS) { in nfssvc_srvcall()
4281 error = copyin(uap->argp, (caddr_t)&dumplocklist, in nfssvc_srvcall()
4288 dumplocklist.ndllck_fname, p); in nfssvc_srvcall()
4294 dumplocklist.ndllck_size, p); in nfssvc_srvcall()
4300 } else if (uap->flag & NFSSVC_BACKUPSTABLE) { in nfssvc_srvcall()
4301 procp = p->td_proc; in nfssvc_srvcall()
4303 nfsd_master_pid = procp->p_pid; in nfssvc_srvcall()
4304 bcopy(procp->p_comm, nfsd_master_comm, MAXCOMLEN + 1); in nfssvc_srvcall()
4305 nfsd_master_start = procp->p_stats->p_start; in nfssvc_srvcall()
4308 } else if ((uap->flag & NFSSVC_SUSPENDNFSD) != 0) { in nfssvc_srvcall()
4322 } else if ((uap->flag & NFSSVC_RESUMENFSD) != 0) { in nfssvc_srvcall()
4345 if ((NFSVNO_EXTLS(exp) && (nd->nd_flag & ND_TLS) == 0) || in nfsvno_testexp()
4347 (nd->nd_flag & ND_TLSCERT) == 0) || in nfsvno_testexp()
4349 (nd->nd_flag & ND_TLSCERTUSER) == 0)) { in nfsvno_testexp()
4350 if ((nd->nd_flag & ND_NFSV4) != 0) in nfsvno_testexp()
4354 else if ((nd->nd_flag & ND_TLS) == 0) in nfsvno_testexp()
4367 if ((nd->nd_flag & ND_NFSV3) != 0 && nd->nd_procnum == NFSPROC_FSINFO) in nfsvno_testexp()
4372 * list is empty. This happens when NFSv4 is traversing non-exported in nfsvno_testexp()
4373 * file systems. Exported file systems should always have a non-empty in nfsvno_testexp()
4376 if (exp->nes_numsecflavor == 0) in nfsvno_testexp()
4379 for (i = 0; i < exp->nes_numsecflavor; i++) { in nfsvno_testexp()
4384 if (exp->nes_secflavors[i] == RPCSEC_GSS_KRB5P && in nfsvno_testexp()
4385 (nd->nd_flag & ND_GSSPRIVACY)) in nfsvno_testexp()
4387 if (exp->nes_secflavors[i] == RPCSEC_GSS_KRB5I && in nfsvno_testexp()
4388 (nd->nd_flag & ND_GSSINTEGRITY)) in nfsvno_testexp()
4390 if (exp->nes_secflavors[i] == RPCSEC_GSS_KRB5 && in nfsvno_testexp()
4391 (nd->nd_flag & ND_GSS)) in nfsvno_testexp()
4393 if (exp->nes_secflavors[i] == AUTH_SYS && in nfsvno_testexp()
4394 (nd->nd_flag & ND_GSS) == 0) in nfsvno_testexp()
4397 if ((nd->nd_flag & ND_NFSV4) != 0) in nfsvno_testexp()
4410 hashval = hash32_buf(&fhp->fh_fid, sizeof(struct fid), 0); in nfsrv_hashfh()
4438 procp->p_stats->p_start.tv_sec == in nfsrv_backupstable()
4440 procp->p_stats->p_start.tv_usec == in nfsrv_backupstable()
4442 strcmp(procp->p_comm, nfsd_master_comm) == 0) in nfsrv_backupstable()
4463 NFSPROC_T *p; member
4474 char *fnamep, struct ucred *tcred, NFSPROC_T *p, struct vnode **nvpp) in nfsrv_dscreate() argument
4495 NFSD_DEBUG(4, "nfsrv_dscreate: dvp=%p fname=%s\n", dvp, bufp); in nfsrv_dscreate()
4507 " setattr-uid=%d\n", error); in nfsrv_dscreate()
4517 nmp = VFSTONFS(nvp->v_mount); in nfsrv_dscreate()
4518 if (strcmp(nvp->v_mount->mnt_vfc->vfc_name, "nfs") in nfsrv_dscreate()
4519 != 0 || nmp->nm_nam->sa_len > sizeof( in nfsrv_dscreate()
4521 np->n_fhp->nfh_len != NFSX_MYFH) { in nfsrv_dscreate()
4524 nvp->v_mount->mnt_vfc->vfc_name, in nfsrv_dscreate()
4525 nmp->nm_nam->sa_len, np->n_fhp->nfh_len); in nfsrv_dscreate()
4534 dsa->dsa_filerev = va.va_filerev; in nfsrv_dscreate()
4535 dsa->dsa_size = va.va_size; in nfsrv_dscreate()
4536 dsa->dsa_atime = va.va_atime; in nfsrv_dscreate()
4537 dsa->dsa_mtime = va.va_mtime; in nfsrv_dscreate()
4538 dsa->dsa_bytes = va.va_bytes; in nfsrv_dscreate()
4542 NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, in nfsrv_dscreate()
4544 NFSBCOPY(nmp->nm_nam, &pf->dsf_sin, in nfsrv_dscreate()
4545 nmp->nm_nam->sa_len); in nfsrv_dscreate()
4547 pf->dsf_filename, in nfsrv_dscreate()
4548 sizeof(pf->dsf_filename)); in nfsrv_dscreate()
4571 dsc->err = nfsrv_dscreate(dsc->dvp, &dsc->createva, &dsc->va, &dsc->fh, in start_dscreate()
4572 dsc->pf, NULL, NULL, dsc->tcred, dsc->p, NULL); in start_dscreate()
4573 dsc->done = 1; in start_dscreate()
4574 NFSD_DEBUG(4, "start_dscreate: err=%d\n", dsc->err); in start_dscreate()
4581 nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, struct ucred *cred, in nfsrv_pnfscreate() argument
4582 NFSPROC_T *p) in nfsrv_pnfscreate() argument
4600 /* Get a DS server directory in a round-robin order. */ in nfsrv_pnfscreate()
4602 mp = vp->v_mount; in nfsrv_pnfscreate()
4610 if (tds->nfsdev_nmp != NULL) { in nfsrv_pnfscreate()
4611 if (tds->nfsdev_mdsisset == 0 && ds == NULL) in nfsrv_pnfscreate()
4613 else if (tds->nfsdev_mdsisset != 0 && fsidcmp( in nfsrv_pnfscreate()
4614 &mp->mnt_stat.f_fsid, &tds->nfsdev_mdsfsid) == 0) { in nfsrv_pnfscreate()
4625 i = dsdir[0] = ds->nfsdev_nextdir; in nfsrv_pnfscreate()
4626 ds->nfsdev_nextdir = (ds->nfsdev_nextdir + 1) % nfsrv_dsdirsize; in nfsrv_pnfscreate()
4627 dvp[0] = ds->nfsdev_dsdir[i]; in nfsrv_pnfscreate()
4631 if (tds->nfsdev_nmp != NULL && in nfsrv_pnfscreate()
4632 ((tds->nfsdev_mdsisset == 0 && fds == NULL) || in nfsrv_pnfscreate()
4633 (tds->nfsdev_mdsisset != 0 && fds != NULL && in nfsrv_pnfscreate()
4634 fsidcmp(&mp->mnt_stat.f_fsid, in nfsrv_pnfscreate()
4635 &tds->nfsdev_mdsfsid) == 0))) { in nfsrv_pnfscreate()
4637 dvp[mirrorcnt] = tds->nfsdev_dsdir[i]; in nfsrv_pnfscreate()
4644 /* Put at end of list to implement round-robin usage. */ in nfsrv_pnfscreate()
4650 tdsc = dsc = malloc(sizeof(*dsc) * (mirrorcnt - 1), M_TEMP, in nfsrv_pnfscreate()
4655 error = nfsvno_getfh(vp, &fh, p); in nfsrv_pnfscreate()
4657 error = VOP_GETATTR(vp, &va, cred); in nfsrv_pnfscreate()
4659 /* Set the attributes for "vp" to Setattr the DS vp. */ in nfsrv_pnfscreate()
4671 NFSD_DEBUG(4, "nfsrv_pnfscreate: cruid=%d crgid=%d\n", cred->cr_uid, in nfsrv_pnfscreate()
4672 cred->cr_gid); in nfsrv_pnfscreate()
4680 failpos = -1; in nfsrv_pnfscreate()
4681 for (i = 0; i < mirrorcnt - 1 && error == 0; i++, tpf++, tdsc++) { in nfsrv_pnfscreate()
4682 tpf->dsf_dir = dsdir[i]; in nfsrv_pnfscreate()
4683 tdsc->tcred = tcred; in nfsrv_pnfscreate()
4684 tdsc->p = p; in nfsrv_pnfscreate()
4685 tdsc->pf = tpf; in nfsrv_pnfscreate()
4686 tdsc->createva = *vap; in nfsrv_pnfscreate()
4687 NFSBCOPY(&fh, &tdsc->fh, sizeof(fh)); in nfsrv_pnfscreate()
4688 tdsc->va = va; in nfsrv_pnfscreate()
4689 tdsc->dvp = dvp[i]; in nfsrv_pnfscreate()
4690 tdsc->done = 0; in nfsrv_pnfscreate()
4691 tdsc->inprog = 0; in nfsrv_pnfscreate()
4692 tdsc->err = 0; in nfsrv_pnfscreate()
4700 NULL, tcred, p, NULL); in nfsrv_pnfscreate()
4704 if (failpos == -1 && nfsds_failerr(ret)) in nfsrv_pnfscreate()
4712 tpf->dsf_dir = dsdir[mirrorcnt - 1]; in nfsrv_pnfscreate()
4713 error = nfsrv_dscreate(dvp[mirrorcnt - 1], vap, &va, &fh, tpf, in nfsrv_pnfscreate()
4714 &dsattr, NULL, tcred, p, NULL); in nfsrv_pnfscreate()
4715 if (failpos == -1 && mirrorcnt > 1 && nfsds_failerr(error)) { in nfsrv_pnfscreate()
4716 failpos = mirrorcnt - 1; in nfsrv_pnfscreate()
4724 for (tdsc = dsc, i = 0; i < mirrorcnt - 1; i++, tdsc++) { in nfsrv_pnfscreate()
4725 while (tdsc->inprog != 0 && tdsc->done == 0) in nfsrv_pnfscreate()
4726 tsleep(&tdsc->tsk, PVFS, "srvdcr", timo); in nfsrv_pnfscreate()
4727 if (tdsc->err != 0) { in nfsrv_pnfscreate()
4728 if (failpos == -1 && nfsds_failerr(tdsc->err)) in nfsrv_pnfscreate()
4731 error = tdsc->err; in nfsrv_pnfscreate()
4740 nmp = VFSTONFS(dvp[failpos]->v_mount); in nfsrv_pnfscreate()
4742 if ((nmp->nm_privflag & (NFSMNTP_FORCEDISM | in nfsrv_pnfscreate()
4744 nmp->nm_privflag |= NFSMNTP_CANCELRPCS; in nfsrv_pnfscreate()
4746 ds = nfsrv_deldsnmp(PNFSDOP_DELDSSERVER, nmp, p); in nfsrv_pnfscreate()
4747 NFSD_DEBUG(4, "dscreatfail fail=%d ds=%p\n", failpos, in nfsrv_pnfscreate()
4752 nmp->nm_privflag &= ~NFSMNTP_CANCELRPCS; in nfsrv_pnfscreate()
4760 ASSERT_VOP_ELOCKED(vp, "nfsrv_pnfscreate vp"); in nfsrv_pnfscreate()
4771 tpf->dsf_sin.sin_family = AF_INET; in nfsrv_pnfscreate()
4772 tpf->dsf_sin.sin_len = sizeof(struct sockaddr_in); in nfsrv_pnfscreate()
4773 tpf->dsf_sin.sin_addr.s_addr = 0; in nfsrv_pnfscreate()
4774 tpf->dsf_sin.sin_port = 0; in nfsrv_pnfscreate()
4777 error = vn_extattr_set(vp, IO_NODELOCKED, in nfsrv_pnfscreate()
4779 sizeof(*pf) * nfsrv_maxpnfsmirror, (char *)pf, p); in nfsrv_pnfscreate()
4781 error = vn_extattr_set(vp, IO_NODELOCKED, in nfsrv_pnfscreate()
4783 sizeof(dsattr), (char *)&dsattr, p); in nfsrv_pnfscreate()
4795 * Metadata file. Upon success, ddvp is set non-NULL to the locked
4799 nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, struct vnode **dvpp, in nfsrv_pnfsremovesetup() argument
4809 if (vp->v_type != VREG || (vp->v_mount->mnt_flag & MNT_EXPORTED) == 0 || in nfsrv_pnfsremovesetup()
4815 error = VOP_GETATTR(vp, &va, tcred); in nfsrv_pnfsremovesetup()
4824 error = nfsvno_getfh(vp, fhp, p); in nfsrv_pnfsremovesetup()
4833 error = nfsrv_dsgetsockmnt(vp, 0, buf, &buflen, mirrorcntp, p, dvpp, in nfsrv_pnfsremovesetup()
4851 NFSPROC_T *p; member
4858 NFSPROC_T *p) in nfsrv_dsremove() argument
4900 dsrm->err = nfsrv_dsremove(dsrm->dvp, dsrm->fname, dsrm->tcred, in start_dsremove()
4901 dsrm->p); in start_dsremove()
4902 dsrm->done = 1; in start_dsremove()
4903 NFSD_DEBUG(4, "start_dsremove: err=%d\n", dsrm->err); in start_dsremove()
4913 NFSPROC_T *p) in nfsrv_pnfsremove() argument
4924 dsrm = malloc(sizeof(*dsrm) * mirrorcnt - 1, M_TEMP, M_WAITOK); in nfsrv_pnfsremove()
4929 failpos = -1; in nfsrv_pnfsremove()
4930 for (tdsrm = dsrm, i = 0; i < mirrorcnt - 1; i++, tdsrm++) { in nfsrv_pnfsremove()
4931 tdsrm->tcred = tcred; in nfsrv_pnfsremove()
4932 tdsrm->p = p; in nfsrv_pnfsremove()
4933 tdsrm->dvp = dvp[i]; in nfsrv_pnfsremove()
4934 strlcpy(tdsrm->fname, fname, PNFS_FILENAME_LEN + 1); in nfsrv_pnfsremove()
4935 tdsrm->inprog = 0; in nfsrv_pnfsremove()
4936 tdsrm->done = 0; in nfsrv_pnfsremove()
4937 tdsrm->err = 0; in nfsrv_pnfsremove()
4944 ret = nfsrv_dsremove(dvp[i], fname, tcred, p); in nfsrv_pnfsremove()
4945 if (failpos == -1 && nfsds_failerr(ret)) in nfsrv_pnfsremove()
4949 ret = nfsrv_dsremove(dvp[mirrorcnt - 1], fname, tcred, p); in nfsrv_pnfsremove()
4950 if (failpos == -1 && mirrorcnt > 1 && nfsds_failerr(ret)) in nfsrv_pnfsremove()
4951 failpos = mirrorcnt - 1; in nfsrv_pnfsremove()
4956 for (tdsrm = dsrm, i = 0; i < mirrorcnt - 1; i++, tdsrm++) { in nfsrv_pnfsremove()
4957 while (tdsrm->inprog != 0 && tdsrm->done == 0) in nfsrv_pnfsremove()
4958 tsleep(&tdsrm->tsk, PVFS, "srvdsrm", timo); in nfsrv_pnfsremove()
4959 if (failpos == -1 && nfsds_failerr(tdsrm->err)) in nfsrv_pnfsremove()
4968 nmp = VFSTONFS(dvp[failpos]->v_mount); in nfsrv_pnfsremove()
4970 if ((nmp->nm_privflag & (NFSMNTP_FORCEDISM | in nfsrv_pnfsremove()
4972 nmp->nm_privflag |= NFSMNTP_CANCELRPCS; in nfsrv_pnfsremove()
4974 ds = nfsrv_deldsnmp(PNFSDOP_DELDSSERVER, nmp, p); in nfsrv_pnfsremove()
4975 NFSD_DEBUG(4, "dsremovefail fail=%d ds=%p\n", failpos, in nfsrv_pnfsremove()
4980 nmp->nm_privflag &= ~NFSMNTP_CANCELRPCS; in nfsrv_pnfsremove()
5020 nfsrv_updatemdsattr(struct vnode *vp, struct nfsvattr *nap, NFSPROC_T *p) in nfsrv_updatemdsattr() argument
5027 error = nfsrv_proxyds(vp, 0, 0, tcred, p, NFSPROC_LAYOUTRETURN, in nfsrv_updatemdsattr()
5037 nfsrv_dssetacl(struct vnode *vp, struct acl *aclp, struct ucred *cred, in nfsrv_dssetacl() argument
5038 NFSPROC_T *p) in nfsrv_dssetacl() argument
5042 error = nfsrv_proxyds(vp, 0, 0, cred, p, NFSPROC_SETACL, in nfsrv_dssetacl()
5048 nfsrv_proxyds(struct vnode *vp, off_t off, int cnt, struct ucred *cred, in nfsrv_proxyds() argument
5049 struct thread *p, int ioproc, struct mbuf **mpp, char *cp, in nfsrv_proxyds() argument
5067 if (vp->v_type != VREG || (vp->v_mount->mnt_flag & MNT_EXPORTED) == 0 || in nfsrv_proxyds()
5080 error = vn_extattr_get(vp, IO_NODELOCKED, in nfsrv_proxyds()
5082 p); in nfsrv_proxyds()
5086 nap->na_filerev = odsattr.dsa_filerev; in nfsrv_proxyds()
5087 nap->na_size = odsattr.dsa_size; in nfsrv_proxyds()
5088 nap->na_atime = odsattr.dsa_atime; in nfsrv_proxyds()
5089 nap->na_mtime = odsattr.dsa_mtime; in nfsrv_proxyds()
5095 nap->na_bytes = (odsattr.dsa_size + in nfsrv_proxyds()
5096 BLKDEV_IOSIZE - 1) & ~(BLKDEV_IOSIZE - 1); in nfsrv_proxyds()
5099 nap->na_filerev = dsattr.dsa_filerev; in nfsrv_proxyds()
5100 nap->na_size = dsattr.dsa_size; in nfsrv_proxyds()
5101 nap->na_atime = dsattr.dsa_atime; in nfsrv_proxyds()
5102 nap->na_mtime = dsattr.dsa_mtime; in nfsrv_proxyds()
5103 nap->na_bytes = dsattr.dsa_bytes; in nfsrv_proxyds()
5116 nfsrv_checkdsattr(vp, p) == 0) { in nfsrv_proxyds()
5131 origmircnt = -1; in nfsrv_proxyds()
5136 if (ioproc == NFSPROC_READDS && NFSVOPISLOCKED(vp) == in nfsrv_proxyds()
5138 printf("nfsrv_proxyds: Readds vp exclusively locked\n"); in nfsrv_proxyds()
5139 error = nfsrv_dsgetsockmnt(vp, LK_SHARED, buf, &buflen, in nfsrv_proxyds()
5140 &mirrorcnt, p, dvp, fh, NULL, NULL, NULL, NULL, NULL, in nfsrv_proxyds()
5144 nmp[i] = VFSTONFS(dvp[i]->v_mount); in nfsrv_proxyds()
5150 failpos = -1; in nfsrv_proxyds()
5151 if (origmircnt == -1) in nfsrv_proxyds()
5167 error = nfsrv_readdsrpc(fh, off, cnt, cred, p, nmp[0], in nfsrv_proxyds()
5180 error = nfsrv_writedsrpc(fh, off, cnt, cred, p, vp, in nfsrv_proxyds()
5183 error = nfsrv_setattrdsrpc(fh, cred, p, vp, &nmp[0], in nfsrv_proxyds()
5186 error = nfsrv_setacldsrpc(fh, cred, p, vp, &nmp[0], in nfsrv_proxyds()
5190 p, nmp[0]); in nfsrv_proxyds()
5202 error = nfsrv_allocatedsrpc(fh, off, *offp, cred, p, vp, in nfsrv_proxyds()
5205 error = nfsrv_deallocatedsrpc(fh, off, *offp, cred, p, in nfsrv_proxyds()
5206 vp, &nmp[0], mirrorcnt, &failpos); in nfsrv_proxyds()
5208 error = nfsrv_getattrdsrpc(&fh[mirrorcnt - 1], cred, p, in nfsrv_proxyds()
5209 vp, nmp[mirrorcnt - 1], nap); in nfsrv_proxyds()
5216 failpos = mirrorcnt - 1; in nfsrv_proxyds()
5225 if ((failnmp->nm_privflag & (NFSMNTP_FORCEDISM | in nfsrv_proxyds()
5227 failnmp->nm_privflag |= NFSMNTP_CANCELRPCS; in nfsrv_proxyds()
5230 failnmp, p); in nfsrv_proxyds()
5231 NFSD_DEBUG(4, "dsldsnmp fail=%d ds=%p\n", in nfsrv_proxyds()
5236 failnmp->nm_privflag &= ~NFSMNTP_CANCELRPCS; in nfsrv_proxyds()
5260 * newnmpp - If it points to a non-NULL nmp, that is the destination and needs
5263 * curnmp - If non-NULL, it is the source mount for the copy.
5266 nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char *buf, int *buflenp, in nfsrv_dsgetsockmnt() argument
5267 int *mirrorcntp, NFSPROC_T *p, struct vnode **dvpp, fhandle_t *fhp, in nfsrv_dsgetsockmnt() argument
5281 ASSERT_VOP_LOCKED(vp, "nfsrv_dsgetsockmnt vp"); in nfsrv_dsgetsockmnt()
5289 *ippos = -1; in nfsrv_dsgetsockmnt()
5294 mp = vp->v_mount; in nfsrv_dsgetsockmnt()
5295 error = vn_extattr_get(vp, IO_NODELOCKED, EXTATTR_NAMESPACE_SYSTEM, in nfsrv_dsgetsockmnt()
5296 "pnfsd.dsfile", buflenp, buf, p); in nfsrv_dsgetsockmnt()
5307 sad = (struct sockaddr *)&pf->dsf_sin; in nfsrv_dsgetsockmnt()
5308 if (nfsaddr2_match(sad, curnmp->nm_nam)) { in nfsrv_dsgetsockmnt()
5325 sad = (struct sockaddr *)&pf->dsf_sin; in nfsrv_dsgetsockmnt()
5326 sin = &pf->dsf_sin; in nfsrv_dsgetsockmnt()
5327 dsdir = pf->dsf_dir; in nfsrv_dsgetsockmnt()
5332 nfsaddr2_match(sad, newnmp->nm_nam)) in nfsrv_dsgetsockmnt()
5336 sad->sa_family == AF_INET && in nfsrv_dsgetsockmnt()
5337 sin->sin_addr.s_addr == 0) in nfsrv_dsgetsockmnt()
5339 if (NFSBCMP(&zerofh, &pf->dsf_fh, sizeof(zerofh)) == 0) in nfsrv_dsgetsockmnt()
5346 if (ds->nfsdev_nmp != NULL) { in nfsrv_dsgetsockmnt()
5347 dvp = ds->nfsdev_dvp; in nfsrv_dsgetsockmnt()
5348 nmp = VFSTONFS(dvp->v_mount); in nfsrv_dsgetsockmnt()
5349 if (nmp != ds->nfsdev_nmp) in nfsrv_dsgetsockmnt()
5350 printf("different2 nmp %p %p\n", in nfsrv_dsgetsockmnt()
5351 nmp, ds->nfsdev_nmp); in nfsrv_dsgetsockmnt()
5352 if (nfsaddr2_match(sad, nmp->nm_nam)) { in nfsrv_dsgetsockmnt()
5363 if (tds->nfsdev_nmp != NULL && in nfsrv_dsgetsockmnt()
5365 ((tds->nfsdev_mdsisset == 0 && in nfsrv_dsgetsockmnt()
5366 fndds->nfsdev_mdsisset == 0) || in nfsrv_dsgetsockmnt()
5367 (tds->nfsdev_mdsisset != 0 && in nfsrv_dsgetsockmnt()
5368 fndds->nfsdev_mdsisset != 0 && in nfsrv_dsgetsockmnt()
5369 fsidcmp(&tds->nfsdev_mdsfsid, in nfsrv_dsgetsockmnt()
5370 &mp->mnt_stat.f_fsid) == 0))) { in nfsrv_dsgetsockmnt()
5371 *newnmpp = tds->nfsdev_nmp; in nfsrv_dsgetsockmnt()
5389 dvp = fndds->nfsdev_dsdir[dsdir]; in nfsrv_dsgetsockmnt()
5408 error = nfsrv_pnfslookupds(vp, in nfsrv_dsgetsockmnt()
5409 dvp, pf, &nvp, p); in nfsrv_dsgetsockmnt()
5413 vp, pf, in nfsrv_dsgetsockmnt()
5416 nvp, p); in nfsrv_dsgetsockmnt()
5432 NFSBCOPY(fndds->nfsdev_deviceid, in nfsrv_dsgetsockmnt()
5439 NFSBCOPY(&pf->dsf_fh, fhp++, in nfsrv_dsgetsockmnt()
5443 pf->dsf_filename, in nfsrv_dsgetsockmnt()
5444 sizeof(pf->dsf_filename)); in nfsrv_dsgetsockmnt()
5486 nfsrv_setextattr(struct vnode *vp, struct nfsvattr *nap, NFSPROC_T *p) in nfsrv_setextattr() argument
5491 ASSERT_VOP_ELOCKED(vp, "nfsrv_setextattr vp"); in nfsrv_setextattr()
5492 dsattr.dsa_filerev = nap->na_filerev; in nfsrv_setextattr()
5493 dsattr.dsa_size = nap->na_size; in nfsrv_setextattr()
5494 dsattr.dsa_atime = nap->na_atime; in nfsrv_setextattr()
5495 dsattr.dsa_mtime = nap->na_mtime; in nfsrv_setextattr()
5496 dsattr.dsa_bytes = nap->na_bytes; in nfsrv_setextattr()
5497 error = vn_extattr_set(vp, IO_NODELOCKED, EXTATTR_NAMESPACE_SYSTEM, in nfsrv_setextattr()
5498 "pnfsd.dsattr", sizeof(dsattr), (char *)&dsattr, p); in nfsrv_setextattr()
5506 NFSPROC_T *p, struct nfsmount *nmp, struct mbuf **mpp, struct mbuf **mpendp) in nfsrv_readdsrpc() argument
5521 * MDS->DS proxy operation. in nfsrv_readdsrpc()
5533 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred, in nfsrv_readdsrpc()
5539 if (nd->nd_repstat == 0) { in nfsrv_readdsrpc()
5543 /* Trim off the pre-data XDR from the mbuf chain. */ in nfsrv_readdsrpc()
5544 m = nd->nd_mrep; in nfsrv_readdsrpc()
5545 while (m != NULL && m != nd->nd_md) { in nfsrv_readdsrpc()
5546 if (m->m_next == nd->nd_md) { in nfsrv_readdsrpc()
5547 m->m_next = NULL; in nfsrv_readdsrpc()
5548 m_freem(nd->nd_mrep); in nfsrv_readdsrpc()
5549 nd->nd_mrep = m = nd->nd_md; in nfsrv_readdsrpc()
5551 m = m->m_next; in nfsrv_readdsrpc()
5563 trimlen = nd->nd_dpos - mtod(m, char *); in nfsrv_readdsrpc()
5565 m->m_len -= trimlen; in nfsrv_readdsrpc()
5576 if (m->m_len >= tlen) { in nfsrv_readdsrpc()
5577 m->m_len = tlen; in nfsrv_readdsrpc()
5579 m2 = m->m_next; in nfsrv_readdsrpc()
5580 m->m_next = NULL; in nfsrv_readdsrpc()
5584 tlen -= m->m_len; in nfsrv_readdsrpc()
5585 m = m->m_next; in nfsrv_readdsrpc()
5592 *mpp = nd->nd_mrep; in nfsrv_readdsrpc()
5594 nd->nd_mrep = NULL; in nfsrv_readdsrpc()
5597 error = nd->nd_repstat; in nfsrv_readdsrpc()
5599 /* If nd->nd_mrep is already NULL, this is a no-op. */ in nfsrv_readdsrpc()
5600 m_freem(nd->nd_mrep); in nfsrv_readdsrpc()
5619 NFSPROC_T *p; member
5626 struct nfsvattr *nap, struct mbuf *m, struct ucred *cred, NFSPROC_T *p) in nfsrv_writedsdorpc() argument
5642 * MDS->DS proxy operation. in nfsrv_writedsdorpc()
5663 nd->nd_mb->m_next = m; in nfsrv_writedsdorpc()
5666 while (m->m_next != NULL) in nfsrv_writedsdorpc()
5667 m = m->m_next; in nfsrv_writedsdorpc()
5668 nd->nd_mb = m; in nfsrv_writedsdorpc()
5669 nfsm_set(nd, m->m_len); in nfsrv_writedsdorpc()
5670 NFSD_DEBUG(4, "nfsrv_writedsdorpc: lastmb len=%d\n", m->m_len); in nfsrv_writedsdorpc()
5682 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, in nfsrv_writedsdorpc()
5688 NFSD_DEBUG(4, "nfsrv_writedsdorpc: aft writerpc=%d\n", nd->nd_repstat); in nfsrv_writedsdorpc()
5690 if ((nd->nd_flag & (ND_NOMOREDATA | ND_NFSV4 | ND_V4WCCATTR)) == in nfsrv_writedsdorpc()
5702 nd->nd_flag |= ND_NOMOREDATA; in nfsrv_writedsdorpc()
5704 if (nd->nd_repstat == 0) { in nfsrv_writedsdorpc()
5713 error = nd->nd_repstat; in nfsrv_writedsdorpc()
5728 m_freem(nd->nd_mrep); in nfsrv_writedsdorpc()
5743 drpc->err = nfsrv_writedsdorpc(drpc->nmp, &drpc->fh, drpc->off, in start_writedsdorpc()
5744 drpc->len, NULL, drpc->m, drpc->cred, drpc->p); in start_writedsdorpc()
5745 drpc->done = 1; in start_writedsdorpc()
5746 NFSD_DEBUG(4, "start_writedsdorpc: err=%d\n", drpc->err); in start_writedsdorpc()
5751 NFSPROC_T *p, struct vnode *vp, struct nfsmount **nmpp, int mirrorcnt, in nfsrv_writedsrpc() argument
5763 tdrpc = drpc = malloc(sizeof(*drpc) * (mirrorcnt - 1), M_TEMP, in nfsrv_writedsrpc()
5767 offs = cp - mtod(*mpp, char *); in nfsrv_writedsrpc()
5775 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_writedsrpc()
5776 tdrpc->done = 0; in nfsrv_writedsrpc()
5777 NFSBCOPY(fhp, &tdrpc->fh, sizeof(*fhp)); in nfsrv_writedsrpc()
5778 tdrpc->off = off; in nfsrv_writedsrpc()
5779 tdrpc->len = len; in nfsrv_writedsrpc()
5780 tdrpc->nmp = *nmpp; in nfsrv_writedsrpc()
5781 tdrpc->cred = cred; in nfsrv_writedsrpc()
5782 tdrpc->p = p; in nfsrv_writedsrpc()
5783 tdrpc->inprog = 0; in nfsrv_writedsrpc()
5784 tdrpc->err = 0; in nfsrv_writedsrpc()
5785 tdrpc->m = m_copym(*mpp, offs, NFSM_RNDUP(len), M_WAITOK); in nfsrv_writedsrpc()
5794 tdrpc->m, cred, p); in nfsrv_writedsrpc()
5795 if (nfsds_failerr(ret) && *failposp == -1) in nfsrv_writedsrpc()
5804 ret = nfsrv_writedsdorpc(*nmpp, fhp, off, len, &na, m, cred, p); in nfsrv_writedsrpc()
5805 if (nfsds_failerr(ret) && *failposp == -1 && mirrorcnt > 1) in nfsrv_writedsrpc()
5806 *failposp = mirrorcnt - 1; in nfsrv_writedsrpc()
5810 error = nfsrv_setextattr(vp, &na, p); in nfsrv_writedsrpc()
5816 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_writedsrpc()
5818 while (tdrpc->inprog != 0 && tdrpc->done == 0) in nfsrv_writedsrpc()
5819 tsleep(&tdrpc->tsk, PVFS, "srvwrds", timo); in nfsrv_writedsrpc()
5820 if (nfsds_failerr(tdrpc->err) && *failposp == -1) in nfsrv_writedsrpc()
5822 else if (error == 0 && tdrpc->err != 0) in nfsrv_writedsrpc()
5823 error = tdrpc->err; in nfsrv_writedsrpc()
5842 NFSPROC_T *p; member
5848 off_t len, struct nfsvattr *nap, struct ucred *cred, NFSPROC_T *p) in nfsrv_allocatedsdorpc() argument
5864 * MDS->DS proxy operation. in nfsrv_allocatedsdorpc()
5879 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, in nfsrv_allocatedsdorpc()
5886 nd->nd_repstat); in nfsrv_allocatedsdorpc()
5887 if (nd->nd_repstat == 0) { in nfsrv_allocatedsdorpc()
5892 error = nd->nd_repstat; in nfsrv_allocatedsdorpc()
5895 m_freem(nd->nd_mrep); in nfsrv_allocatedsdorpc()
5910 drpc->err = nfsrv_allocatedsdorpc(drpc->nmp, &drpc->fh, drpc->off, in start_allocatedsdorpc()
5911 drpc->len, NULL, drpc->cred, drpc->p); in start_allocatedsdorpc()
5912 drpc->done = 1; in start_allocatedsdorpc()
5913 NFSD_DEBUG(4, "start_allocatedsdorpc: err=%d\n", drpc->err); in start_allocatedsdorpc()
5918 NFSPROC_T *p, struct vnode *vp, struct nfsmount **nmpp, int mirrorcnt, in nfsrv_allocatedsrpc() argument
5928 tdrpc = drpc = malloc(sizeof(*drpc) * (mirrorcnt - 1), M_TEMP, in nfsrv_allocatedsrpc()
5936 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_allocatedsrpc()
5937 tdrpc->done = 0; in nfsrv_allocatedsrpc()
5938 NFSBCOPY(fhp, &tdrpc->fh, sizeof(*fhp)); in nfsrv_allocatedsrpc()
5939 tdrpc->off = off; in nfsrv_allocatedsrpc()
5940 tdrpc->len = len; in nfsrv_allocatedsrpc()
5941 tdrpc->nmp = *nmpp; in nfsrv_allocatedsrpc()
5942 tdrpc->cred = cred; in nfsrv_allocatedsrpc()
5943 tdrpc->p = p; in nfsrv_allocatedsrpc()
5944 tdrpc->inprog = 0; in nfsrv_allocatedsrpc()
5945 tdrpc->err = 0; in nfsrv_allocatedsrpc()
5954 cred, p); in nfsrv_allocatedsrpc()
5955 if (nfsds_failerr(ret) && *failposp == -1) in nfsrv_allocatedsrpc()
5963 ret = nfsrv_allocatedsdorpc(*nmpp, fhp, off, len, &na, cred, p); in nfsrv_allocatedsrpc()
5964 if (nfsds_failerr(ret) && *failposp == -1 && mirrorcnt > 1) in nfsrv_allocatedsrpc()
5965 *failposp = mirrorcnt - 1; in nfsrv_allocatedsrpc()
5969 error = nfsrv_setextattr(vp, &na, p); in nfsrv_allocatedsrpc()
5975 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_allocatedsrpc()
5977 while (tdrpc->inprog != 0 && tdrpc->done == 0) in nfsrv_allocatedsrpc()
5978 tsleep(&tdrpc->tsk, PVFS, "srvalds", timo); in nfsrv_allocatedsrpc()
5979 if (nfsds_failerr(tdrpc->err) && *failposp == -1) in nfsrv_allocatedsrpc()
5981 else if (error == 0 && tdrpc->err != 0) in nfsrv_allocatedsrpc()
5982 error = tdrpc->err; in nfsrv_allocatedsrpc()
6002 NFSPROC_T *p; member
6008 off_t len, struct nfsvattr *nap, struct ucred *cred, NFSPROC_T *p) in nfsrv_deallocatedsdorpc() argument
6024 * MDS->DS proxy operation. in nfsrv_deallocatedsdorpc()
6045 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, in nfsrv_deallocatedsdorpc()
6052 nd->nd_repstat); in nfsrv_deallocatedsdorpc()
6054 if ((nd->nd_flag & (ND_NOMOREDATA | ND_NFSV4 | ND_V4WCCATTR)) == in nfsrv_deallocatedsdorpc()
6066 nd->nd_flag |= ND_NOMOREDATA; in nfsrv_deallocatedsdorpc()
6068 if (nd->nd_repstat == 0) { in nfsrv_deallocatedsdorpc()
6073 error = nd->nd_repstat; in nfsrv_deallocatedsdorpc()
6076 m_freem(nd->nd_mrep); in nfsrv_deallocatedsdorpc()
6091 drpc->err = nfsrv_deallocatedsdorpc(drpc->nmp, &drpc->fh, drpc->off, in start_deallocatedsdorpc()
6092 drpc->len, NULL, drpc->cred, drpc->p); in start_deallocatedsdorpc()
6093 drpc->done = 1; in start_deallocatedsdorpc()
6094 NFSD_DEBUG(4, "start_deallocatedsdorpc: err=%d\n", drpc->err); in start_deallocatedsdorpc()
6099 NFSPROC_T *p, struct vnode *vp, struct nfsmount **nmpp, int mirrorcnt, in nfsrv_deallocatedsrpc() argument
6109 tdrpc = drpc = malloc(sizeof(*drpc) * (mirrorcnt - 1), M_TEMP, in nfsrv_deallocatedsrpc()
6117 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_deallocatedsrpc()
6118 tdrpc->done = 0; in nfsrv_deallocatedsrpc()
6119 NFSBCOPY(fhp, &tdrpc->fh, sizeof(*fhp)); in nfsrv_deallocatedsrpc()
6120 tdrpc->off = off; in nfsrv_deallocatedsrpc()
6121 tdrpc->len = len; in nfsrv_deallocatedsrpc()
6122 tdrpc->nmp = *nmpp; in nfsrv_deallocatedsrpc()
6123 tdrpc->cred = cred; in nfsrv_deallocatedsrpc()
6124 tdrpc->p = p; in nfsrv_deallocatedsrpc()
6125 tdrpc->inprog = 0; in nfsrv_deallocatedsrpc()
6126 tdrpc->err = 0; in nfsrv_deallocatedsrpc()
6135 NULL, cred, p); in nfsrv_deallocatedsrpc()
6136 if (nfsds_failerr(ret) && *failposp == -1) in nfsrv_deallocatedsrpc()
6144 ret = nfsrv_deallocatedsdorpc(*nmpp, fhp, off, len, &na, cred, p); in nfsrv_deallocatedsrpc()
6145 if (nfsds_failerr(ret) && *failposp == -1 && mirrorcnt > 1) in nfsrv_deallocatedsrpc()
6146 *failposp = mirrorcnt - 1; in nfsrv_deallocatedsrpc()
6150 error = nfsrv_setextattr(vp, &na, p); in nfsrv_deallocatedsrpc()
6156 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_deallocatedsrpc()
6158 while (tdrpc->inprog != 0 && tdrpc->done == 0) in nfsrv_deallocatedsrpc()
6159 tsleep(&tdrpc->tsk, PVFS, "srvalds", timo); in nfsrv_deallocatedsrpc()
6160 if (nfsds_failerr(tdrpc->err) && *failposp == -1) in nfsrv_deallocatedsrpc()
6162 else if (error == 0 && tdrpc->err != 0) in nfsrv_deallocatedsrpc()
6163 error = tdrpc->err; in nfsrv_deallocatedsrpc()
6170 nfsrv_setattrdsdorpc(fhandle_t *fhp, struct ucred *cred, NFSPROC_T *p, in nfsrv_setattrdsdorpc() argument
6171 struct vnode *vp, struct nfsmount *nmp, struct nfsvattr *nap, in nfsrv_setattrdsdorpc() argument
6186 * MDS->DS proxy operation. in nfsrv_setattrdsdorpc()
6195 nfscl_fillsattr(nd, &nap->na_vattr, vp, NFSSATTR_FULL, 0); in nfsrv_setattrdsdorpc()
6207 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred, in nfsrv_setattrdsdorpc()
6214 nd->nd_repstat); in nfsrv_setattrdsdorpc()
6216 if ((nd->nd_flag & (ND_NOMOREDATA | ND_NFSV4 | ND_V4WCCATTR)) == in nfsrv_setattrdsdorpc()
6228 nd->nd_flag |= ND_NOMOREDATA; in nfsrv_setattrdsdorpc()
6233 if (nd->nd_repstat != 0) in nfsrv_setattrdsdorpc()
6234 error = nd->nd_repstat; in nfsrv_setattrdsdorpc()
6248 m_freem(nd->nd_mrep); in nfsrv_setattrdsdorpc()
6260 struct vnode *vp; member
6262 NFSPROC_T *p; member
6277 drpc->err = nfsrv_setattrdsdorpc(&drpc->fh, drpc->cred, drpc->p, in start_setattrdsdorpc()
6278 drpc->vp, drpc->nmp, &drpc->na, &drpc->dsna); in start_setattrdsdorpc()
6279 drpc->done = 1; in start_setattrdsdorpc()
6283 nfsrv_setattrdsrpc(fhandle_t *fhp, struct ucred *cred, NFSPROC_T *p, in nfsrv_setattrdsrpc() argument
6284 struct vnode *vp, struct nfsmount **nmpp, int mirrorcnt, in nfsrv_setattrdsrpc() argument
6294 tdrpc = drpc = malloc(sizeof(*drpc) * (mirrorcnt - 1), M_TEMP, in nfsrv_setattrdsrpc()
6302 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_setattrdsrpc()
6303 tdrpc->done = 0; in nfsrv_setattrdsrpc()
6304 tdrpc->inprog = 0; in nfsrv_setattrdsrpc()
6305 NFSBCOPY(fhp, &tdrpc->fh, sizeof(*fhp)); in nfsrv_setattrdsrpc()
6306 tdrpc->nmp = *nmpp; in nfsrv_setattrdsrpc()
6307 tdrpc->vp = vp; in nfsrv_setattrdsrpc()
6308 tdrpc->cred = cred; in nfsrv_setattrdsrpc()
6309 tdrpc->p = p; in nfsrv_setattrdsrpc()
6310 tdrpc->na = *nap; in nfsrv_setattrdsrpc()
6311 tdrpc->err = 0; in nfsrv_setattrdsrpc()
6319 ret = nfsrv_setattrdsdorpc(fhp, cred, p, vp, *nmpp, nap, in nfsrv_setattrdsrpc()
6321 if (nfsds_failerr(ret) && *failposp == -1) in nfsrv_setattrdsrpc()
6329 ret = nfsrv_setattrdsdorpc(fhp, cred, p, vp, *nmpp, nap, &na); in nfsrv_setattrdsrpc()
6330 if (nfsds_failerr(ret) && *failposp == -1 && mirrorcnt > 1) in nfsrv_setattrdsrpc()
6331 *failposp = mirrorcnt - 1; in nfsrv_setattrdsrpc()
6335 error = nfsrv_setextattr(vp, &na, p); in nfsrv_setattrdsrpc()
6341 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_setattrdsrpc()
6343 while (tdrpc->inprog != 0 && tdrpc->done == 0) in nfsrv_setattrdsrpc()
6344 tsleep(&tdrpc->tsk, PVFS, "srvsads", timo); in nfsrv_setattrdsrpc()
6345 if (nfsds_failerr(tdrpc->err) && *failposp == -1) in nfsrv_setattrdsrpc()
6347 else if (error == 0 && tdrpc->err != 0) in nfsrv_setattrdsrpc()
6348 error = tdrpc->err; in nfsrv_setattrdsrpc()
6358 nfsrv_setacldsdorpc(fhandle_t *fhp, struct ucred *cred, NFSPROC_T *p, in nfsrv_setacldsdorpc() argument
6359 struct vnode *vp, struct nfsmount *nmp, struct acl *aclp) in nfsrv_setacldsdorpc() argument
6372 * MDS->DS proxy operation. in nfsrv_setacldsdorpc()
6384 * The "vp" argument to nfsv4_fillattr() is only used for vnode_type(), in nfsrv_setacldsdorpc()
6385 * so passing in the metadata "vp" will be ok, since it is of in nfsrv_setacldsdorpc()
6388 nfsv4_fillattr(nd, NULL, vp, aclp, NULL, NULL, 0, &attrbits, NULL, in nfsrv_setacldsdorpc()
6390 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred, in nfsrv_setacldsdorpc()
6397 nd->nd_repstat); in nfsrv_setacldsdorpc()
6398 error = nd->nd_repstat; in nfsrv_setacldsdorpc()
6399 m_freem(nd->nd_mrep); in nfsrv_setacldsdorpc()
6410 struct vnode *vp; member
6412 NFSPROC_T *p; member
6426 drpc->err = nfsrv_setacldsdorpc(&drpc->fh, drpc->cred, drpc->p, in start_setacldsdorpc()
6427 drpc->vp, drpc->nmp, drpc->aclp); in start_setacldsdorpc()
6428 drpc->done = 1; in start_setacldsdorpc()
6432 nfsrv_setacldsrpc(fhandle_t *fhp, struct ucred *cred, NFSPROC_T *p, in nfsrv_setacldsrpc() argument
6433 struct vnode *vp, struct nfsmount **nmpp, int mirrorcnt, struct acl *aclp, in nfsrv_setacldsrpc() argument
6442 tdrpc = drpc = malloc(sizeof(*drpc) * (mirrorcnt - 1), M_TEMP, in nfsrv_setacldsrpc()
6450 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_setacldsrpc()
6451 tdrpc->done = 0; in nfsrv_setacldsrpc()
6452 tdrpc->inprog = 0; in nfsrv_setacldsrpc()
6453 NFSBCOPY(fhp, &tdrpc->fh, sizeof(*fhp)); in nfsrv_setacldsrpc()
6454 tdrpc->nmp = *nmpp; in nfsrv_setacldsrpc()
6455 tdrpc->vp = vp; in nfsrv_setacldsrpc()
6456 tdrpc->cred = cred; in nfsrv_setacldsrpc()
6457 tdrpc->p = p; in nfsrv_setacldsrpc()
6458 tdrpc->aclp = aclp; in nfsrv_setacldsrpc()
6459 tdrpc->err = 0; in nfsrv_setacldsrpc()
6467 ret = nfsrv_setacldsdorpc(fhp, cred, p, vp, *nmpp, in nfsrv_setacldsrpc()
6469 if (nfsds_failerr(ret) && *failposp == -1) in nfsrv_setacldsrpc()
6477 ret = nfsrv_setacldsdorpc(fhp, cred, p, vp, *nmpp, aclp); in nfsrv_setacldsrpc()
6478 if (nfsds_failerr(ret) && *failposp == -1 && mirrorcnt > 1) in nfsrv_setacldsrpc()
6479 *failposp = mirrorcnt - 1; in nfsrv_setacldsrpc()
6487 for (i = 0; i < mirrorcnt - 1; i++, tdrpc++) { in nfsrv_setacldsrpc()
6489 while (tdrpc->inprog != 0 && tdrpc->done == 0) in nfsrv_setacldsrpc()
6490 tsleep(&tdrpc->tsk, PVFS, "srvacds", timo); in nfsrv_setacldsrpc()
6491 if (nfsds_failerr(tdrpc->err) && *failposp == -1) in nfsrv_setacldsrpc()
6493 else if (error == 0 && tdrpc->err != 0) in nfsrv_setacldsrpc()
6494 error = tdrpc->err; in nfsrv_setacldsrpc()
6504 nfsrv_getattrdsrpc(fhandle_t *fhp, struct ucred *cred, NFSPROC_T *p, in nfsrv_getattrdsrpc() argument
6505 struct vnode *vp, struct nfsmount *nmp, struct nfsvattr *nap) in nfsrv_getattrdsrpc() argument
6522 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred, in nfsrv_getattrdsrpc()
6529 nd->nd_repstat); in nfsrv_getattrdsrpc()
6530 if (nd->nd_repstat == 0) { in nfsrv_getattrdsrpc()
6536 * attribute if the vp is exclusively locked. in nfsrv_getattrdsrpc()
6544 if (error == 0 && VOP_ISLOCKED(vp) == LK_EXCLUSIVE) { in nfsrv_getattrdsrpc()
6545 error = nfsrv_setextattr(vp, nap, p); in nfsrv_getattrdsrpc()
6550 error = nd->nd_repstat; in nfsrv_getattrdsrpc()
6551 m_freem(nd->nd_mrep); in nfsrv_getattrdsrpc()
6562 struct ucred *cred, NFSPROC_T *p, struct nfsmount *nmp) in nfsrv_seekdsrpc() argument
6574 * MDS->DS proxy operation. in nfsrv_seekdsrpc()
6587 error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred, in nfsrv_seekdsrpc()
6593 NFSD_DEBUG(4, "nfsrv_seekdsrpc: aft seekrpc=%d\n", nd->nd_repstat); in nfsrv_seekdsrpc()
6594 if (nd->nd_repstat == 0) { in nfsrv_seekdsrpc()
6602 error = nd->nd_repstat; in nfsrv_seekdsrpc()
6604 m_freem(nd->nd_mrep); in nfsrv_seekdsrpc()
6614 nfsrv_dsgetdevandfh(struct vnode *vp, NFSPROC_T *p, int *mirrorcntp, in nfsrv_dsgetdevandfh() argument
6622 error = nfsrv_dsgetsockmnt(vp, 0, buf, &buflen, mirrorcntp, p, NULL, in nfsrv_dsgetdevandfh()
6632 nfsrv_pnfslookupds(struct vnode *vp, struct vnode *dvp, struct pnfsdsfile *pf, in nfsrv_pnfslookupds() argument
6633 struct vnode **nvpp, NFSPROC_T *p) in nfsrv_pnfslookupds() argument
6649 named.ni_cnd.cn_namelen = strlen(pf->dsf_filename); in nfsrv_pnfslookupds()
6650 strlcpy(bufp, pf->dsf_filename, NAME_MAX); in nfsrv_pnfslookupds()
6666 nfsrv_pnfssetfh(struct vnode *vp, struct pnfsdsfile *pf, char *devid, in nfsrv_pnfssetfh() argument
6667 char *fnamep, struct vnode *nvp, NFSPROC_T *p) in nfsrv_pnfssetfh() argument
6673 NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH); in nfsrv_pnfssetfh()
6681 if (devid == NULL && fnamep == NULL && NFSVOPISLOCKED(vp) == in nfsrv_pnfssetfh()
6683 ret = vn_extattr_set(vp, IO_NODELOCKED, in nfsrv_pnfssetfh()
6685 (char *)pf, p); in nfsrv_pnfssetfh()
6703 * on the mounted-on vnode (such as "df" or in nfsrv_killrpcs()
6704 * a non-forced "umount") to fail. in nfsrv_killrpcs()
6705 * This will unlock the mounted-on vnode so in nfsrv_killrpcs()
6737 if (ds->nfsdev_nmp != NULL && ds->nfsdev_mdsisset != 0 && in nfsrv_pnfsstatfs()
6738 fsidcmp(&ds->nfsdev_mdsfsid, &mp->mnt_stat.f_fsid) == 0) { in nfsrv_pnfsstatfs()
6741 *tdvpp++ = ds->nfsdev_dvp; in nfsrv_pnfsstatfs()
6750 if (ds->nfsdev_nmp != NULL && in nfsrv_pnfsstatfs()
6751 ds->nfsdev_mdsisset == 0) { in nfsrv_pnfsstatfs()
6754 *tdvpp++ = ds->nfsdev_dvp; in nfsrv_pnfsstatfs()
6765 error = VFS_STATFS(dvp->v_mount, tsf); in nfsrv_pnfsstatfs()
6767 if (sf->f_bsize == 0) { in nfsrv_pnfsstatfs()
6768 if (tsf->f_bsize > 0) in nfsrv_pnfsstatfs()
6769 sf->f_bsize = tsf->f_bsize; in nfsrv_pnfsstatfs()
6771 sf->f_bsize = 8192; in nfsrv_pnfsstatfs()
6773 if (tsf->f_blocks > 0) { in nfsrv_pnfsstatfs()
6774 if (sf->f_bsize != tsf->f_bsize) { in nfsrv_pnfsstatfs()
6775 tot = tsf->f_blocks * tsf->f_bsize; in nfsrv_pnfsstatfs()
6776 sf->f_blocks += (tot / sf->f_bsize); in nfsrv_pnfsstatfs()
6778 sf->f_blocks += tsf->f_blocks; in nfsrv_pnfsstatfs()
6780 if (tsf->f_bfree > 0) { in nfsrv_pnfsstatfs()
6781 if (sf->f_bsize != tsf->f_bsize) { in nfsrv_pnfsstatfs()
6782 tot = tsf->f_bfree * tsf->f_bsize; in nfsrv_pnfsstatfs()
6783 sf->f_bfree += (tot / sf->f_bsize); in nfsrv_pnfsstatfs()
6785 sf->f_bfree += tsf->f_bfree; in nfsrv_pnfsstatfs()
6787 if (tsf->f_bavail > 0) { in nfsrv_pnfsstatfs()
6788 if (sf->f_bsize != tsf->f_bsize) { in nfsrv_pnfsstatfs()
6789 tot = tsf->f_bavail * tsf->f_bsize; in nfsrv_pnfsstatfs()
6790 sf->f_bavail += (tot / sf->f_bsize); in nfsrv_pnfsstatfs()
6792 sf->f_bavail += tsf->f_bavail; in nfsrv_pnfsstatfs()
6805 nfsrv_setacl(struct vnode *vp, NFSACL_T *aclp, struct ucred *cred, NFSPROC_T *p) in nfsrv_setacl() argument
6809 if (nfsrv_useacl == 0 || nfs_supportsnfsv4acls(vp) == 0) { in nfsrv_setacl()
6815 * Make sure it has enough room for that - splitting every entry in nfsrv_setacl()
6817 * Cribbed out of kern/vfs_acl.c - Rick M. in nfsrv_setacl()
6819 if (aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2) { in nfsrv_setacl()
6823 error = VOP_SETACL(vp, ACL_TYPE_NFS4, aclp, cred, p); in nfsrv_setacl()
6825 error = nfsrv_dssetacl(vp, aclp, cred, p); in nfsrv_setacl()
6838 * the vp before returning.
6841 nfsvno_seek(struct nfsrv_descript *nd, struct vnode *vp, u_long cmd, in nfsvno_seek() argument
6842 off_t *offp, int content, bool *eofp, struct ucred *cred, NFSPROC_T *p) in nfsvno_seek() argument
6847 ASSERT_VOP_LOCKED(vp, "nfsvno_seek vp"); in nfsvno_seek()
6852 error = nfsrv_proxyds(vp, 0, 0, cred, p, NFSPROC_SEEKDS, NULL, in nfsvno_seek()
6855 vput(vp); in nfsvno_seek()
6864 NFSVOPUNLOCK(vp); in nfsvno_seek()
6865 error = VOP_IOCTL(vp, cmd, offp, 0, cred, p); in nfsvno_seek()
6869 ret = nfsvno_getattr(vp, &at, nd, p, 0, NULL); in nfsvno_seek()
6877 vrele(vp); in nfsvno_seek()
6886 nfsvno_allocate(struct vnode *vp, off_t off, off_t len, struct ucred *cred, in nfsvno_allocate() argument
6887 NFSPROC_T *p) in nfsvno_allocate() argument
6892 ASSERT_VOP_ELOCKED(vp, "nfsvno_allocate vp"); in nfsvno_allocate()
6897 error = nfsrv_proxyds(vp, off, 0, cred, p, NFSPROC_ALLOCATE, NULL, in nfsvno_allocate()
6908 error = VOP_ALLOCATE(vp, &off, &len, IO_SYNC, cred); in nfsvno_allocate()
6922 nfsvno_deallocate(struct vnode *vp, off_t off, off_t len, struct ucred *cred, in nfsvno_deallocate() argument
6923 NFSPROC_T *p) in nfsvno_deallocate() argument
6928 ASSERT_VOP_ELOCKED(vp, "nfsvno_deallocate vp"); in nfsvno_deallocate()
6933 error = nfsrv_proxyds(vp, off, 0, cred, p, NFSPROC_DEALLOCATE, NULL, in nfsvno_deallocate()
6944 error = VOP_DEALLOCATE(vp, &off, &len, 0, IO_SYNC, cred); in nfsvno_deallocate()
6958 nfsvno_getxattr(struct vnode *vp, char *name, uint32_t maxresp, in nfsvno_getxattr() argument
6959 struct ucred *cred, uint64_t flag, int maxextsiz, struct thread *p, in nfsvno_getxattr() argument
6969 error = VOP_GETEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, NULL, in nfsvno_getxattr()
6970 &siz, cred, p); in nfsvno_getxattr()
6973 if (siz > maxresp - NFS_MAXXDR) in nfsvno_getxattr()
6988 uiop->uio_iovcnt = nfsrv_createiovec_extpgs(tlen, in nfsvno_getxattr()
6991 uiop->uio_iovcnt = nfsrv_createiovec(tlen, &m, &m2, in nfsvno_getxattr()
6993 uiop->uio_iov = iv; in nfsvno_getxattr()
6995 uiop->uio_iovcnt = 0; in nfsvno_getxattr()
6996 uiop->uio_iov = iv = NULL; in nfsvno_getxattr()
6999 uiop->uio_offset = 0; in nfsvno_getxattr()
7000 uiop->uio_resid = tlen; in nfsvno_getxattr()
7001 uiop->uio_rw = UIO_READ; in nfsvno_getxattr()
7002 uiop->uio_segflg = UIO_SYSSPACE; in nfsvno_getxattr()
7003 uiop->uio_td = p; in nfsvno_getxattr()
7005 error = mac_vnode_check_getextattr(cred, vp, EXTATTR_NAMESPACE_USER, in nfsvno_getxattr()
7012 error = VOP_GETEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, uiop, in nfsvno_getxattr()
7013 NULL, cred, p); in nfsvno_getxattr()
7016 if (uiop->uio_resid > 0) { in nfsvno_getxattr()
7018 len = tlen - uiop->uio_resid; in nfsvno_getxattr()
7026 m2 = nfsrv_adj(m, alen - tlen, tlen - len); in nfsvno_getxattr()
7047 nfsvno_setxattr(struct vnode *vp, char *name, int len, struct mbuf *m, in nfsvno_setxattr() argument
7048 char *cp, struct ucred *cred, struct thread *p) in nfsvno_setxattr() argument
7056 error = mac_vnode_check_setextattr(cred, vp, EXTATTR_NAMESPACE_USER, in nfsvno_setxattr()
7062 uiop->uio_rw = UIO_WRITE; in nfsvno_setxattr()
7063 uiop->uio_segflg = UIO_SYSSPACE; in nfsvno_setxattr()
7064 uiop->uio_td = p; in nfsvno_setxattr()
7065 uiop->uio_offset = 0; in nfsvno_setxattr()
7066 uiop->uio_resid = len; in nfsvno_setxattr()
7069 uiop->uio_iov = iv; in nfsvno_setxattr()
7070 uiop->uio_iovcnt = cnt; in nfsvno_setxattr()
7072 uiop->uio_iov = iv = NULL; in nfsvno_setxattr()
7073 uiop->uio_iovcnt = 0; in nfsvno_setxattr()
7076 error = VOP_SETEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, uiop, in nfsvno_setxattr()
7077 cred, p); in nfsvno_setxattr()
7079 if (vp->v_type == VREG && nfsrv_devidcnt != 0) in nfsvno_setxattr()
7080 nfsvno_updateds(vp, cred, p); in nfsvno_setxattr()
7081 error = VOP_FSYNC(vp, MNT_WAIT, p); in nfsvno_setxattr()
7097 * It does result in two MDS->DS RPCs, but creating
7104 nfsvno_updateds(struct vnode *vp, struct ucred *cred, NFSPROC_T *p) in nfsvno_updateds() argument
7110 ret = VOP_GETATTR(vp, &nva.na_vattr, cred); in nfsvno_updateds()
7116 ret = nfsrv_proxyds(vp, 0, 0, cred, p, in nfsvno_updateds()
7122 ret = nfsrv_proxyds(vp, 0, 0, cred, p, in nfsvno_updateds()
7133 nfsvno_rmxattr(struct nfsrv_descript *nd, struct vnode *vp, char *name, in nfsvno_rmxattr() argument
7134 struct ucred *cred, struct thread *p) in nfsvno_rmxattr() argument
7140 * but RFC-8276 says so. in nfsvno_rmxattr()
7142 error = nfsrv_checkremove(vp, 0, nd, nd->nd_clientid, p); in nfsvno_rmxattr()
7146 error = mac_vnode_check_deleteextattr(cred, vp, EXTATTR_NAMESPACE_USER, in nfsvno_rmxattr()
7152 error = VOP_DELETEEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, cred, p); in nfsvno_rmxattr()
7154 error = VOP_SETEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, NULL, in nfsvno_rmxattr()
7155 cred, p); in nfsvno_rmxattr()
7157 if (vp->v_type == VREG && nfsrv_devidcnt != 0) in nfsvno_rmxattr()
7158 nfsvno_updateds(vp, cred, p); in nfsvno_rmxattr()
7159 error = VOP_FSYNC(vp, MNT_WAIT, p); in nfsvno_rmxattr()
7170 nfsvno_listxattr(struct vnode *vp, uint64_t cookie, struct ucred *cred, in nfsvno_listxattr() argument
7171 struct thread *p, u_char **bufp, uint32_t *lenp, bool *eofp) in nfsvno_listxattr() argument
7180 error = VOP_LISTEXTATTR(vp, EXTATTR_NAMESPACE_USER, NULL, &siz, cred, in nfsvno_listxattr()
7181 p); in nfsvno_listxattr()
7208 io.uio_td = p; in nfsvno_listxattr()
7210 error = mac_vnode_check_listextattr(cred, vp, EXTATTR_NAMESPACE_USER); in nfsvno_listxattr()
7215 error = VOP_LISTEXTATTR(vp, EXTATTR_NAMESPACE_USER, &io, NULL, cred, in nfsvno_listxattr()
7216 p); in nfsvno_listxattr()
7220 siz -= io.uio_resid; in nfsvno_listxattr()
7242 if (mb->m_next != NULL) { in nfsm_trimtrailing()
7243 m_freem(mb->m_next); in nfsm_trimtrailing()
7244 mb->m_next = NULL; in nfsm_trimtrailing()
7246 if ((mb->m_flags & M_EXTPG) != 0) { in nfsm_trimtrailing()
7247 KASSERT(bextpg >= 0 && bextpg < mb->m_epg_npgs, in nfsm_trimtrailing()
7250 PHYS_TO_DMAP(mb->m_epg_pa[bextpg]) + PAGE_SIZE - bextpgsiz, in nfsm_trimtrailing()
7254 for (i = mb->m_epg_npgs - 1; i > bextpg; i--) { in nfsm_trimtrailing()
7255 pg = PHYS_TO_VM_PAGE(mb->m_epg_pa[i]); in nfsm_trimtrailing()
7259 mb->m_epg_npgs = bextpg + 1; in nfsm_trimtrailing()
7261 fullpgsiz = PAGE_SIZE - mb->m_epg_1st_off; in nfsm_trimtrailing()
7264 mb->m_epg_last_len = fullpgsiz - bextpgsiz; in nfsm_trimtrailing()
7265 mb->m_len = m_epg_pagelen(mb, 0, mb->m_epg_1st_off); in nfsm_trimtrailing()
7266 for (i = 1; i < mb->m_epg_npgs; i++) in nfsm_trimtrailing()
7267 mb->m_len += m_epg_pagelen(mb, i, 0); in nfsm_trimtrailing()
7268 nd->nd_bextpgsiz = bextpgsiz; in nfsm_trimtrailing()
7269 nd->nd_bextpg = bextpg; in nfsm_trimtrailing()
7271 mb->m_len = bpos - mtod(mb, char *); in nfsm_trimtrailing()
7272 nd->nd_mb = mb; in nfsm_trimtrailing()
7273 nd->nd_bpos = bpos; in nfsm_trimtrailing()
7288 if ((nd->nd_flag & ND_NFSV4) == 0) in nfsrv_checkwrongsec()
7291 if ((nd->nd_flag & ND_LASTOP) != 0) in nfsrv_checkwrongsec()
7329 if (ds->nfsdev_nmp != NULL && ds->nfsdev_nospc) { in nfsrv_checknospc()
7332 *tdvpp++ = ds->nfsdev_dvp; in nfsrv_checknospc()
7333 NFSBCOPY(ds->nfsdev_deviceid, tdevid, NFSX_V4DEVICEID); in nfsrv_checknospc()
7345 error = VFS_STATFS(dvp->v_mount, tsf); in nfsrv_checknospc()
7346 if (error == 0 && tsf->f_bavail > 0) { in nfsrv_checknospc()
7393 if (NFSD_VNET(nfsv4root_mnt)->mnt_export != NULL) { in nfsrv_cleanup()
7394 vfs_free_addrlist(NFSD_VNET(nfsv4root_mnt)->mnt_export); in nfsrv_cleanup()
7395 free(NFSD_VNET(nfsv4root_mnt)->mnt_export, M_MOUNT); in nfsrv_cleanup()
7396 NFSD_VNET(nfsv4root_mnt)->mnt_export = NULL; in nfsrv_cleanup()
7408 mtx_destroy(&NFSD_VNET(nfsv4root_mnt)->mnt_mtx); in nfsrv_cleanup()
7411 lockdestroy(&NFSD_VNET(nfsv4root_mnt)->mnt_explock); in nfsrv_cleanup()