Lines Matching +full:vref +full:- +full:buffered

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 2007-2009 Google Inc. and Amit Singh
238 int default_permissions = data->dataflags & FSESS_DEFAULT_PERMISSIONS; in fuse_extattr_check_cred()
241 * Kernel-invoked always succeeds. in fuse_extattr_check_cred()
294 if (fufh->fuse_open_flags & FOPEN_NOFLUSH && in fuse_flush()
301 ffi->fh = fufh->fh_id; in fuse_flush()
307 ffi->lock_owner = td->td_proc->p_pid; in fuse_flush()
337 left_on = start & (iosize - 1); in fuse_inval_buf_range()
340 if ((bp->b_flags & B_CACHE) != 0 && bp->b_dirtyend >= left_on) { in fuse_inval_buf_range()
343 * byte-granular way to record which parts of the in fuse_inval_buf_range()
347 if (bp->b_error) in fuse_inval_buf_range()
348 return (bp->b_error); in fuse_inval_buf_range()
353 right_on = end & (iosize - 1); in fuse_inval_buf_range()
357 right_blksize = MIN(iosize, new_filesize - iosize * right_lbn); in fuse_inval_buf_range()
359 if ((bp->b_flags & B_CACHE) != 0 && bp->b_dirtyoff < right_on) { in fuse_inval_buf_range()
362 * byte-granular way to record which parts of the in fuse_inval_buf_range()
366 if (bp->b_error) in fuse_inval_buf_range()
367 return (bp->b_error); in fuse_inval_buf_range()
398 flsi->fh = fufh->fh_id; in fuse_vnop_do_lseek()
399 flsi->offset = *offp; in fuse_vnop_do_lseek()
400 flsi->whence = whence; in fuse_vnop_do_lseek()
410 *offp = flso->offset; in fuse_vnop_do_lseek()
432 struct vnode *vp = ap->a_vp; in fuse_vnop_access()
433 int accmode = ap->a_accmode; in fuse_vnop_access()
434 struct ucred *cred = ap->a_cred; in fuse_vnop_access()
447 if (!(data->dataflags & FSESS_INITED)) { in fuse_vnop_access()
450 (fuse_match_cred(data->daemoncred, cred) == 0)) { in fuse_vnop_access()
461 err = fuse_internal_access(vp, accmode, ap->a_td, ap->a_cred); in fuse_vnop_access()
478 struct vnode *vp = ap->a_vp; in fuse_vnop_advlock()
479 struct flock *fl = ap->a_fl; in fuse_vnop_advlock()
481 struct ucred *cred = td->td_ucred; in fuse_vnop_advlock()
482 pid_t pid = td->td_proc->p_pid; in fuse_vnop_advlock()
491 int flags = ap->a_flags; in fuse_vnop_advlock()
493 dataflags = fuse_get_mpdata(vnode_mount(vp))->dataflags; in fuse_vnop_advlock()
500 switch(ap->a_op) { in fuse_vnop_advlock()
525 switch (fl->l_whence) { in fuse_vnop_advlock()
532 start = fl->l_start; in fuse_vnop_advlock()
541 (fl->l_start > 0 && size > OFF_MAX - fl->l_start)) { in fuse_vnop_advlock()
545 start = size + fl->l_start; in fuse_vnop_advlock()
560 fli->fh = fufh->fh_id; in fuse_vnop_advlock()
561 fli->owner = td->td_proc->p_pid; in fuse_vnop_advlock()
562 fli->lk.start = start; in fuse_vnop_advlock()
563 if (fl->l_len != 0) in fuse_vnop_advlock()
564 fli->lk.end = start + fl->l_len - 1; in fuse_vnop_advlock()
566 fli->lk.end = INT64_MAX; in fuse_vnop_advlock()
567 fli->lk.type = fl->l_type; in fuse_vnop_advlock()
568 fli->lk.pid = td->td_proc->p_pid; in fuse_vnop_advlock()
575 fl->l_type = flo->lk.type; in fuse_vnop_advlock()
576 fl->l_whence = SEEK_SET; in fuse_vnop_advlock()
577 if (flo->lk.type != F_UNLCK) { in fuse_vnop_advlock()
578 fl->l_pid = flo->lk.pid; in fuse_vnop_advlock()
579 fl->l_start = flo->lk.start; in fuse_vnop_advlock()
580 if (flo->lk.end == INT64_MAX) in fuse_vnop_advlock()
581 fl->l_len = 0; in fuse_vnop_advlock()
583 fl->l_len = flo->lk.end - flo->lk.start + 1; in fuse_vnop_advlock()
584 fl->l_start = flo->lk.start; in fuse_vnop_advlock()
596 struct vnode *vp = ap->a_vp; in fuse_vnop_allocate()
597 off_t *len = ap->a_len; in fuse_vnop_allocate()
598 off_t *offset = ap->a_offset; in fuse_vnop_allocate()
599 struct ucred *cred = ap->a_cred; in fuse_vnop_allocate()
605 pid_t pid = curthread->td_proc->p_pid; in fuse_vnop_allocate()
614 switch (vp->v_type) { in fuse_vnop_allocate()
651 ffi->fh = fufh->fh_id; in fuse_vnop_allocate()
652 ffi->offset = *offset; in fuse_vnop_allocate()
653 ffi->length = *len; in fuse_vnop_allocate()
654 ffi->mode = 0; in fuse_vnop_allocate()
666 err = EXTERROR(EINVAL, "This file can't be pre-allocated"); in fuse_vnop_allocate()
672 if (*offset > fvdat->cached_attrs.va_size) { in fuse_vnop_allocate()
674 getnanouptime(&fvdat->last_local_modify); in fuse_vnop_allocate()
693 struct vnode *vp = ap->a_vp; in fuse_vnop_bmap()
694 struct bufobj **bo = ap->a_bop; in fuse_vnop_bmap()
704 daddr_t lbn = ap->a_bn; in fuse_vnop_bmap()
705 daddr_t *pbn = ap->a_bnp; in fuse_vnop_bmap()
706 int *runp = ap->a_runp; in fuse_vnop_bmap()
707 int *runb = ap->a_runb; in fuse_vnop_bmap()
719 maxrun = MIN(vp->v_mount->mnt_iosize_max / biosize - 1, in fuse_vnop_bmap()
720 data->max_readahead_blocks); in fuse_vnop_bmap()
723 *bo = &vp->v_bufobj; in fuse_vnop_bmap()
732 * * mounting with -onoclusterr in fuse_vnop_bmap()
746 if (fvdat->cached_attrs.va_size != VNOVAL) in fuse_vnop_bmap()
747 fsize = fvdat->cached_attrs.va_size; in fuse_vnop_bmap()
749 error = fuse_vnode_size(vp, &fsize, td->td_ucred, td); in fuse_vnop_bmap()
751 *runp = MIN(MAX(0, fsize / (off_t)biosize - lbn - 1), in fuse_vnop_bmap()
759 fdisp_make_vp(&fdi, FUSE_BMAP, vp, td, td->td_ucred); in fuse_vnop_bmap()
761 fbi->block = lbn; in fuse_vnop_bmap()
762 fbi->blocksize = biosize; in fuse_vnop_bmap()
771 *pbn = fbo->block; in fuse_vnop_bmap()
794 struct vnode *vp = ap->a_vp; in fuse_vnop_close()
796 struct ucred *cred = ap->a_cred; in fuse_vnop_close()
797 int fflag = ap->a_fflag; in fuse_vnop_close()
798 struct thread *td = ap->a_td; in fuse_vnop_close()
799 pid_t pid = td->td_proc->p_pid; in fuse_vnop_close()
811 cred = td->td_ucred; in fuse_vnop_close()
814 if (err == 0 && (fvdat->flag & FN_ATIMECHANGE) && !vfs_isrdonly(mp)) { in fuse_vnop_close()
821 dataflags = data->dataflags; in fuse_vnop_close()
826 access_e = vaccess(vp->v_type, va.va_mode, va.va_uid, in fuse_vnop_close()
831 vap.va_atime = fvdat->cached_attrs.va_atime; in fuse_vnop_close()
840 if ((fvdat->flag & FN_SIZECHANGE) != 0) { in fuse_vnop_close()
841 fuse_vnode_savesize(vp, cred, td->td_proc->p_pid); in fuse_vnop_close()
863 struct vnode *invp = ap->a_invp; in fuse_vnop_copy_file_range()
864 struct vnode *outvp = ap->a_outvp; in fuse_vnop_copy_file_range()
870 struct ucred *incred = ap->a_incred; in fuse_vnop_copy_file_range()
871 struct ucred *outcred = ap->a_outcred; in fuse_vnop_copy_file_range()
883 if (incred->cr_uid != outcred->cr_uid) in fuse_vnop_copy_file_range()
887 if (incred->cr_gid != outcred->cr_gid) in fuse_vnop_copy_file_range()
896 if (ap->a_fsizetd == NULL) in fuse_vnop_copy_file_range()
899 td = ap->a_fsizetd; in fuse_vnop_copy_file_range()
900 pid = td->td_proc->p_pid; in fuse_vnop_copy_file_range()
903 if (invp->v_data == NULL || outvp->v_data == NULL) { in fuse_vnop_copy_file_range()
916 io.uio_resid = *ap->a_lenp; in fuse_vnop_copy_file_range()
917 if (ap->a_fsizetd) { in fuse_vnop_copy_file_range()
918 io.uio_offset = *ap->a_outoffp; in fuse_vnop_copy_file_range()
919 err = vn_rlimit_fsizex(outvp, &io, 0, &r, ap->a_fsizetd); in fuse_vnop_copy_file_range()
929 err = fuse_inval_buf_range(outvp, outfilesize, *ap->a_outoffp, in fuse_vnop_copy_file_range()
930 *ap->a_outoffp + io.uio_resid); in fuse_vnop_copy_file_range()
937 fcfri->fh_in = infufh->fh_id; in fuse_vnop_copy_file_range()
938 fcfri->off_in = *ap->a_inoffp; in fuse_vnop_copy_file_range()
939 fcfri->nodeid_out = VTOI(outvp); in fuse_vnop_copy_file_range()
940 fcfri->fh_out = outfufh->fh_id; in fuse_vnop_copy_file_range()
941 fcfri->off_out = *ap->a_outoffp; in fuse_vnop_copy_file_range()
942 fcfri->len = io.uio_resid; in fuse_vnop_copy_file_range()
943 fcfri->flags = 0; in fuse_vnop_copy_file_range()
948 *ap->a_lenp = fwo->size; in fuse_vnop_copy_file_range()
949 *ap->a_inoffp += fwo->size; in fuse_vnop_copy_file_range()
950 *ap->a_outoffp += fwo->size; in fuse_vnop_copy_file_range()
952 if (*ap->a_outoffp > outfvdat->cached_attrs.va_size) { in fuse_vnop_copy_file_range()
953 fuse_vnode_setsize(outvp, *ap->a_outoffp, false); in fuse_vnop_copy_file_range()
954 getnanouptime(&outfvdat->last_local_modify); in fuse_vnop_copy_file_range()
989 fdisp_init(fdip, sizeof(*fmni) + cnp->cn_namelen + 1); in fdisp_make_mknod_for_fallback()
992 fmni = fdip->indata; in fdisp_make_mknod_for_fallback()
993 fmni->mode = mode; in fdisp_make_mknod_for_fallback()
994 fmni->rdev = 0; in fdisp_make_mknod_for_fallback()
995 memcpy((char *)fdip->indata + sizeof(*fmni), cnp->cn_nameptr, in fdisp_make_mknod_for_fallback()
996 cnp->cn_namelen); in fdisp_make_mknod_for_fallback()
997 ((char *)fdip->indata)[sizeof(*fmni) + cnp->cn_namelen] = '\0'; in fdisp_make_mknod_for_fallback()
1010 struct vnode *dvp = ap->a_dvp; in fuse_vnop_create()
1011 struct vnode **vpp = ap->a_vpp; in fuse_vnop_create()
1012 struct componentname *cnp = ap->a_cnp; in fuse_vnop_create()
1013 struct vattr *vap = ap->a_vap; in fuse_vnop_create()
1015 struct ucred *cred = cnp->cn_cred; in fuse_vnop_create()
1029 uint64_t parentnid = VTOFUD(dvp)->nid; in fuse_vnop_create()
1030 mode_t mode = MAKEIMODE(vap->va_type, vap->va_mode); in fuse_vnop_create()
1039 if (vap->va_type == VSOCK) in fuse_vnop_create()
1051 if (vap->va_type != VREG) in fuse_vnop_create()
1054 if (fsess_not_impl(mp, FUSE_CREATE) || vap->va_type == VSOCK) { in fuse_vnop_create()
1063 fdisp_init(fdip, sizeof(*fci) + cnp->cn_namelen + 1); in fuse_vnop_create()
1065 fci = fdip->indata; in fuse_vnop_create()
1066 fci->mode = mode; in fuse_vnop_create()
1067 fci->flags = O_CREAT | flags; in fuse_vnop_create()
1070 fci->umask = td->td_proc->p_pd->pd_cmask; in fuse_vnop_create()
1075 memcpy((char *)fdip->indata + insize, cnp->cn_nameptr, in fuse_vnop_create()
1076 cnp->cn_namelen); in fuse_vnop_create()
1077 ((char *)fdip->indata)[insize + cnp->cn_namelen] = '\0'; in fuse_vnop_create()
1094 feo = fdip->answ; in fuse_vnop_create()
1096 if ((err = fuse_internal_checkentry(feo, vap->va_type))) { in fuse_vnop_create()
1112 fdisp_make(fdip2, FUSE_OPEN, vnode_mount(dvp), feo->nodeid, td, in fuse_vnop_create()
1114 foi = fdip2->indata; in fuse_vnop_create()
1115 foi->flags = flags; in fuse_vnop_create()
1119 foo = fdip2->answ; in fuse_vnop_create()
1121 err = fuse_vnode_get(mp, feo, feo->nodeid, dvp, vpp, cnp, vap->va_type); in fuse_vnop_create()
1124 uint64_t nodeid = feo->nodeid; in fuse_vnop_create()
1125 uint64_t fh_id = foo->fh; in fuse_vnop_create()
1130 fri = fdip->indata; in fuse_vnop_create()
1131 fri->fh = fh_id; in fuse_vnop_create()
1132 fri->flags = flags; in fuse_vnop_create()
1133 fuse_insert_callback(fdip->tick, fuse_internal_forget_callback); in fuse_vnop_create()
1134 fuse_insert_message(fdip->tick, false); in fuse_vnop_create()
1138 fuse_internal_cache_attrs(*vpp, &feo->attr, feo->attr_valid, in fuse_vnop_create()
1139 feo->attr_valid_nsec, NULL, true); in fuse_vnop_create()
1142 fuse_vnode_open(*vpp, foo->open_flags, td); in fuse_vnop_create()
1167 struct vnode *vp = ap->a_vp; in fuse_vnop_fdatasync()
1168 struct thread *td = ap->a_td; in fuse_vnop_fdatasync()
1193 struct vnode *vp = ap->a_vp; in fuse_vnop_fsync()
1194 struct thread *td = ap->a_td; in fuse_vnop_fsync()
1195 int waitfor = ap->a_waitfor; in fuse_vnop_fsync()
1218 struct vnode *vp = ap->a_vp; in fuse_vnop_getattr()
1219 struct vattr *vap = ap->a_vap; in fuse_vnop_getattr()
1220 struct ucred *cred = ap->a_cred; in fuse_vnop_getattr()
1226 dataflags = fuse_get_mpdata(vnode_mount(vp))->dataflags; in fuse_vnop_getattr()
1249 vap->va_type = vnode_vtype(vp); in fuse_vnop_getattr()
1262 struct vnode *vp = ap->a_vp; in fuse_vnop_inactive()
1270 LIST_FOREACH_SAFE(fufh, &fvdat->handles, next, fufh_tmp) { in fuse_vnop_inactive()
1271 if (need_flush && vp->v_type == VREG) { in fuse_vnop_inactive()
1272 if ((VTOFUD(vp)->flag & FN_SIZECHANGE) != 0) { in fuse_vnop_inactive()
1275 if ((fvdat->flag & FN_REVOKED) != 0) in fuse_vnop_inactive()
1284 if ((fvdat->flag & FN_REVOKED) != 0) in fuse_vnop_inactive()
1303 struct vnode *vp = ap->a_vp; in fuse_vnop_ioctl()
1305 struct ucred *cred = ap->a_cred; in fuse_vnop_ioctl()
1307 pid_t pid = ap->a_td->td_proc->p_pid; in fuse_vnop_ioctl()
1310 switch (ap->a_command) { in fuse_vnop_ioctl()
1317 offp = ap->a_data; in fuse_vnop_ioctl()
1318 if (ap->a_command == FIOSEEKDATA) in fuse_vnop_ioctl()
1324 err = fuse_vnop_do_lseek(vp, ap->a_td, cred, pid, offp, in fuse_vnop_ioctl()
1350 struct vnode *vp = ap->a_vp; in fuse_vnop_link()
1351 struct vnode *tdvp = ap->a_tdvp; in fuse_vnop_link()
1352 struct componentname *cnp = ap->a_cnp; in fuse_vnop_link()
1376 if (vap != NULL && vap->va_nlink >= FUSE_LINK_MAX) in fuse_vnop_link()
1388 if (fli.oldnodeid != feo->nodeid) { in fuse_vnop_link()
1406 fuse_internal_cache_attrs(vp, &feo->attr, feo->attr_valid, in fuse_vnop_link()
1407 feo->attr_valid_nsec, NULL, true); in fuse_vnop_link()
1427 return fuse_vnode_get(mp, flaa->feo, flaa->nid, NULL, vpp, flaa->cnp, in fuse_lookup_alloc()
1428 flaa->vtyp); in fuse_lookup_alloc()
1444 struct vnode *dvp = ap->a_dvp; in fuse_vnop_lookup()
1445 struct vnode **vpp = ap->a_vpp; in fuse_vnop_lookup()
1446 struct componentname *cnp = ap->a_cnp; in fuse_vnop_lookup()
1448 struct ucred *cred = cnp->cn_cred; in fuse_vnop_lookup()
1451 int nameiop = cnp->cn_nameiop; in fuse_vnop_lookup()
1452 bool isdotdot = cnp->cn_flags & ISDOTDOT; in fuse_vnop_lookup()
1453 bool islastcn = cnp->cn_flags & ISLASTCN; in fuse_vnop_lookup()
1456 int default_permissions = data->dataflags & FSESS_DEFAULT_PERMISSIONS; in fuse_vnop_lookup()
1481 if ((cnp->cn_flags & NOEXECCHECK) != 0) in fuse_vnop_lookup()
1482 cnp->cn_flags &= ~NOEXECCHECK; in fuse_vnop_lookup()
1486 is_dot = cnp->cn_namelen == 1 && *(cnp->cn_nameptr) == '.'; in fuse_vnop_lookup()
1487 if (isdotdot && !(data->dataflags & FSESS_EXPORT_SUPPORT)) { in fuse_vnop_lookup()
1488 if (!(VTOFUD(dvp)->flag & FN_PARENT_NID)) { in fuse_vnop_lookup()
1496 nid = VTOFUD(dvp)->parent_nid; in fuse_vnop_lookup()
1513 case -1: /* positive match */ in fuse_vnop_lookup()
1520 &VTOFUD(*vpp)->entry_cache_timeout); in fuse_vnop_lookup()
1546 fdisp_init(&fdi, cnp->cn_namelen + 1); in fuse_vnop_lookup()
1549 memcpy(fdi.indata, cnp->cn_nameptr, cnp->cn_namelen); in fuse_vnop_lookup()
1550 ((char *)fdi.indata)[cnp->cn_namelen] = '\0'; in fuse_vnop_lookup()
1557 nid = feo->nodeid; in fuse_vnop_lookup()
1564 if (cnp->cn_flags & MAKEENTRY) { in fuse_vnop_lookup()
1577 vtyp = IFTOVT(feo->attr.mode); in fuse_vnop_lookup()
1584 /* lookup_err, if non-zero, must be ENOENT at this point */ in fuse_vnop_lookup()
1614 vref(dvp); in fuse_vnop_lookup()
1635 if (timespeccmp(&now, &fvdat->last_local_modify, >)) { in fuse_vnop_lookup()
1641 fuse_internal_cache_attrs(*vpp, &feo->attr, in fuse_vnop_lookup()
1642 feo->attr_valid, feo->attr_valid_nsec, in fuse_vnop_lookup()
1645 fuse_validity_2_bintime(feo->entry_valid, in fuse_vnop_lookup()
1646 feo->entry_valid_nsec, in fuse_vnop_lookup()
1647 &fvdat->entry_cache_timeout); in fuse_vnop_lookup()
1701 struct vnode *dvp = ap->a_dvp; in fuse_vnop_mkdir()
1702 struct vnode **vpp = ap->a_vpp; in fuse_vnop_mkdir()
1703 struct componentname *cnp = ap->a_cnp; in fuse_vnop_mkdir()
1704 struct vattr *vap = ap->a_vap; in fuse_vnop_mkdir()
1712 fmdi.mode = MAKEIMODE(vap->va_type, vap->va_mode); in fuse_vnop_mkdir()
1713 fmdi.umask = curthread->td_proc->p_pd->pd_cmask; in fuse_vnop_mkdir()
1731 struct vnode *dvp = ap->a_dvp; in fuse_vnop_mknod()
1732 struct vnode **vpp = ap->a_vpp; in fuse_vnop_mknod()
1733 struct componentname *cnp = ap->a_cnp; in fuse_vnop_mknod()
1734 struct vattr *vap = ap->a_vap; in fuse_vnop_mknod()
1755 struct vnode *vp = ap->a_vp; in fuse_vnop_open()
1756 int a_mode = ap->a_mode; in fuse_vnop_open()
1757 struct thread *td = ap->a_td; in fuse_vnop_open()
1758 struct ucred *cred = ap->a_cred; in fuse_vnop_open()
1759 pid_t pid = td->td_proc->p_pid; in fuse_vnop_open()
1764 if (vp->v_type == VCHR || vp->v_type == VBLK || vp->v_type == VFIFO) in fuse_vnop_open()
1766 vp->v_type)); in fuse_vnop_open()
1781 struct vnode *vp = ap->a_vp; in fuse_vnop_pathconf()
1787 switch (ap->a_name) { in fuse_vnop_pathconf()
1789 *ap->a_retval = 64; in fuse_vnop_pathconf()
1792 *ap->a_retval = NAME_MAX; in fuse_vnop_pathconf()
1795 *ap->a_retval = MIN(LONG_MAX, FUSE_LINK_MAX); in fuse_vnop_pathconf()
1798 *ap->a_retval = MAXPATHLEN; in fuse_vnop_pathconf()
1801 *ap->a_retval = 1; in fuse_vnop_pathconf()
1822 curthread->td_ucred, curthread->td_proc->p_pid, in fuse_vnop_pathconf()
1830 curthread, curthread->td_ucred); in fuse_vnop_pathconf()
1834 curthread->td_ucred, in fuse_vnop_pathconf()
1835 curthread->td_proc->p_pid, &offset, in fuse_vnop_pathconf()
1840 curthread, curthread->td_ucred); in fuse_vnop_pathconf()
1846 *ap->a_retval = 1; in fuse_vnop_pathconf()
1873 struct vnode *vp = ap->a_vp; in fuse_vnop_read()
1874 struct uio *uio = ap->a_uio; in fuse_vnop_read()
1875 int ioflag = ap->a_ioflag; in fuse_vnop_read()
1876 struct ucred *cred = ap->a_cred; in fuse_vnop_read()
1877 pid_t pid = curthread->td_proc->p_pid; in fuse_vnop_read()
1882 MPASS(vp->v_type == VREG || vp->v_type == VDIR); in fuse_vnop_read()
1889 if (VTOFUD(vp)->flag & FN_DIRECTIO) { in fuse_vnop_read()
1894 if (err == EBADF && vnode_mount(vp)->mnt_flag & MNT_EXPORTED) { in fuse_vnop_read()
1924 SDT_PROBE2(fusefs, , vnops, trace, 1, "buffered read of vnode"); in fuse_vnop_read()
1947 struct vnode *vp = ap->a_vp; in fuse_vnop_readdir()
1948 struct uio *uio = ap->a_uio; in fuse_vnop_readdir()
1949 struct ucred *cred = ap->a_cred; in fuse_vnop_readdir()
1958 pid_t pid = curthread->td_proc->p_pid; in fuse_vnop_readdir()
1960 if (ap->a_eofflag) in fuse_vnop_readdir()
1961 *ap->a_eofflag = 0; in fuse_vnop_readdir()
1969 tresid = uio->uio_resid; in fuse_vnop_readdir()
1971 if (err == EBADF && mp->mnt_flag & MNT_EXPORTED) { in fuse_vnop_readdir()
1984 if (ap->a_ncookies != NULL) { in fuse_vnop_readdir()
1985 ncookies = uio->uio_resid / in fuse_vnop_readdir()
1988 *ap->a_ncookies = ncookies; in fuse_vnop_readdir()
1989 *ap->a_cookies = cookies; in fuse_vnop_readdir()
2004 if (ap->a_ncookies != NULL) { in fuse_vnop_readdir()
2006 *ap->a_ncookies -= ncookies; in fuse_vnop_readdir()
2008 free(*ap->a_cookies, M_TEMP); in fuse_vnop_readdir()
2009 *ap->a_ncookies = 0; in fuse_vnop_readdir()
2010 *ap->a_cookies = NULL; in fuse_vnop_readdir()
2013 if (err == 0 && tresid == uio->uio_resid) in fuse_vnop_readdir()
2014 *ap->a_eofflag = 1; in fuse_vnop_readdir()
2029 struct vnode *vp = ap->a_vp; in fuse_vnop_readlink()
2030 struct uio *uio = ap->a_uio; in fuse_vnop_readlink()
2031 struct ucred *cred = ap->a_cred; in fuse_vnop_readlink()
2057 fuse_get_mpdata(vnode_mount(vp))->dataflags & FSESS_PUSH_SYMLINKS_IN) { in fuse_vnop_readlink()
2058 char *mpth = vnode_mount(vp)->mnt_stat.f_mntonname; in fuse_vnop_readlink()
2078 struct vnode *vp = ap->a_vp; in fuse_vnop_reclaim()
2086 LIST_FOREACH_SAFE(fufh, &fvdat->handles, next, fufh_tmp) { in fuse_vnop_reclaim()
2088 "(type=%#x)", fufh->fufh_type); in fuse_vnop_reclaim()
2104 vroot = data->vroot; in fuse_vnop_reclaim()
2105 data->vroot = NULL; in fuse_vnop_reclaim()
2109 } else if (!fuse_isdeadfs(vp) && fvdat->nlookup > 0) { in fuse_vnop_reclaim()
2111 fvdat->nlookup); in fuse_vnop_reclaim()
2130 struct vnode *dvp = ap->a_dvp; in fuse_vnop_remove()
2131 struct vnode *vp = ap->a_vp; in fuse_vnop_remove()
2132 struct componentname *cnp = ap->a_cnp; in fuse_vnop_remove()
2162 struct vnode *fdvp = ap->a_fdvp; in fuse_vnop_rename()
2163 struct vnode *fvp = ap->a_fvp; in fuse_vnop_rename()
2164 struct componentname *fcnp = ap->a_fcnp; in fuse_vnop_rename()
2165 struct vnode *tdvp = ap->a_tdvp; in fuse_vnop_rename()
2166 struct vnode *tvp = ap->a_tvp; in fuse_vnop_rename()
2167 struct componentname *tcnp = ap->a_tcnp; in fuse_vnop_rename()
2170 bool isdir = fvp->v_type == VDIR; in fuse_vnop_rename()
2177 if (fvp->v_mount != tdvp->v_mount || in fuse_vnop_rename()
2178 (tvp && fvp->v_mount != tvp->v_mount)) { in fuse_vnop_rename()
2179 SDT_PROBE2(fusefs, , vnops, trace, 1, "cross-device rename"); in fuse_vnop_rename()
2180 err = EXTERROR(EXDEV, "Cross-device rename"); in fuse_vnop_rename()
2195 if (data->dataflags & FSESS_DEFAULT_PERMISSIONS && isdir && newparent) { in fuse_vnop_rename()
2197 curthread, tcnp->cn_cred); in fuse_vnop_rename()
2201 sx_xlock(&data->rename_lock); in fuse_vnop_rename()
2209 sx_unlock(&data->rename_lock); in fuse_vnop_rename()
2245 struct vnode *dvp = ap->a_dvp; in fuse_vnop_rmdir()
2246 struct vnode *vp = ap->a_vp; in fuse_vnop_rmdir()
2258 err = fuse_internal_remove(dvp, vp, ap->a_cnp, FUSE_RMDIR); in fuse_vnop_rmdir()
2274 struct vnode *vp = ap->a_vp; in fuse_vnop_setattr()
2275 struct vattr *vap = ap->a_vap; in fuse_vnop_setattr()
2276 struct ucred *cred = ap->a_cred; in fuse_vnop_setattr()
2289 dataflags = data->dataflags; in fuse_vnop_setattr()
2297 if (vap->va_uid != (uid_t)VNOVAL) { in fuse_vnop_setattr()
2307 if (vap->va_uid != old_va.va_uid) in fuse_vnop_setattr()
2314 if (vap->va_gid != (gid_t)VNOVAL) { in fuse_vnop_setattr()
2317 if (checkperm && !groupmember(vap->va_gid, cred)) { in fuse_vnop_setattr()
2319 * Non-root users may only chgrp to one of their own in fuse_vnop_setattr()
2329 if (vap->va_gid != old_va.va_gid) in fuse_vnop_setattr()
2335 if (vap->va_size != VNOVAL) { in fuse_vnop_setattr()
2336 switch (vp->v_type) { in fuse_vnop_setattr()
2343 err = vn_rlimit_trunc(vap->va_size, td); in fuse_vnop_setattr()
2360 if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) { in fuse_vnop_setattr()
2361 if (vap->va_vaflags & VA_UTIMES_NULL) in fuse_vnop_setattr()
2367 if (vap->va_mode != (mode_t)VNOVAL) in fuse_vnop_setattr()
2368 vap->va_mode &= ~(S_ISUID | S_ISGID); in fuse_vnop_setattr()
2373 vap->va_mode = old_va.va_mode & ~(S_ISUID | S_ISGID); in fuse_vnop_setattr()
2376 if (vap->va_mode != (mode_t)VNOVAL) { in fuse_vnop_setattr()
2377 /* Only root may set the sticky bit on non-directories */ in fuse_vnop_setattr()
2378 if (checkperm && vp->v_type != VDIR && (vap->va_mode & S_ISTXT) in fuse_vnop_setattr()
2381 if (checkperm && (vap->va_mode & S_ISGID)) { in fuse_vnop_setattr()
2417 struct vnode *vp = ap->a_vp; in fuse_vnop_strategy()
2418 struct buf *bp = ap->a_bp; in fuse_vnop_strategy()
2421 bp->b_ioflags |= BIO_ERROR; in fuse_vnop_strategy()
2422 bp->b_error = ENXIO; in fuse_vnop_strategy()
2428 * VOP_STRATEGY always returns zero and signals error via bp->b_ioflags. in fuse_vnop_strategy()
2448 struct vnode *dvp = ap->a_dvp; in fuse_vnop_symlink()
2449 struct vnode **vpp = ap->a_vpp; in fuse_vnop_symlink()
2450 struct componentname *cnp = ap->a_cnp; in fuse_vnop_symlink()
2451 const char *target = ap->a_target; in fuse_vnop_symlink()
2471 fdisp_init(&fdi, len + cnp->cn_namelen + 1); in fuse_vnop_symlink()
2474 memcpy(fdi.indata, cnp->cn_nameptr, cnp->cn_namelen); in fuse_vnop_symlink()
2475 ((char *)fdi.indata)[cnp->cn_namelen] = '\0'; in fuse_vnop_symlink()
2476 memcpy((char *)fdi.indata + cnp->cn_namelen + 1, target, len); in fuse_vnop_symlink()
2494 struct vnode *vp = ap->a_vp; in fuse_vnop_write()
2495 struct uio *uio = ap->a_uio; in fuse_vnop_write()
2496 int ioflag = ap->a_ioflag; in fuse_vnop_write()
2497 struct ucred *cred = ap->a_cred; in fuse_vnop_write()
2498 pid_t pid = curthread->td_proc->p_pid; in fuse_vnop_write()
2503 MPASS(vp->v_type == VREG || vp->v_type == VDIR); in fuse_vnop_write()
2510 if (VTOFUD(vp)->flag & FN_DIRECTIO) { in fuse_vnop_write()
2515 if (err == EBADF && vnode_mount(vp)->mnt_flag & MNT_EXPORTED) { in fuse_vnop_write()
2551 start = uio->uio_offset; in fuse_vnop_write()
2552 end = start + uio->uio_resid; in fuse_vnop_write()
2563 "buffered write of vnode"); in fuse_vnop_write()
2568 fuse_internal_clear_suid_on_write(vp, cred, uio->uio_td); in fuse_vnop_write()
2599 *blksz = filesize - (off_t)lbn *biosize; in fuse_gbp_getblksz()
2617 struct vnode *vp = ap->a_vp; in fuse_vnop_getpages()
2621 "called on non-cacheable vnode??\n"); in fuse_vnop_getpages()
2625 return (vfs_bio_getpages(vp, ap->a_m, ap->a_count, ap->a_rbehind, in fuse_vnop_getpages()
2626 ap->a_rahead, fuse_gbp_getblkno, fuse_gbp_getblksz)); in fuse_vnop_getpages()
2646 struct vnode *vp = ap->a_vp; in fuse_vnop_getextattr()
2647 struct uio *uio = ap->a_uio; in fuse_vnop_getextattr()
2652 struct thread *td = ap->a_td; in fuse_vnop_getextattr()
2653 struct ucred *cred = ap->a_cred; in fuse_vnop_getextattr()
2667 err = fuse_extattr_check_cred(vp, ap->a_attrnamespace, cred, td, VREAD); in fuse_vnop_getextattr()
2672 if (ap->a_attrnamespace == EXTATTR_NAMESPACE_SYSTEM) in fuse_vnop_getextattr()
2678 strlen(ap->a_name) + 1; in fuse_vnop_getextattr()
2687 * fuse_getxattr_out. If we pass in a non-zero size, we get back in fuse_vnop_getextattr()
2691 get_xattr_in->size = 0; in fuse_vnop_getextattr()
2693 get_xattr_in->size = uio->uio_resid; in fuse_vnop_getextattr()
2697 ap->a_name); in fuse_vnop_getextattr()
2711 if (ap->a_size != NULL) in fuse_vnop_getextattr()
2712 *ap->a_size = get_xattr_out->size; in fuse_vnop_getextattr()
2736 struct vnode *vp = ap->a_vp; in fuse_vnop_setextattr()
2737 struct uio *uio = ap->a_uio; in fuse_vnop_setextattr()
2741 struct thread *td = ap->a_td; in fuse_vnop_setextattr()
2742 struct ucred *cred = ap->a_cred; in fuse_vnop_setextattr()
2761 if (ap->a_uio == NULL) { in fuse_vnop_setextattr()
2774 err = fuse_extattr_check_cred(vp, ap->a_attrnamespace, cred, td, in fuse_vnop_setextattr()
2780 if (ap->a_attrnamespace == EXTATTR_NAMESPACE_SYSTEM) in fuse_vnop_setextattr()
2786 strlen(ap->a_name) + 1; in fuse_vnop_setextattr()
2792 fdisp_init(&fdi, len + struct_size + uio->uio_resid); in fuse_vnop_setextattr()
2796 set_xattr_in->size = uio->uio_resid; in fuse_vnop_setextattr()
2799 set_xattr_in->setxattr_flags = 0; in fuse_vnop_setextattr()
2800 set_xattr_in->padding = 0; in fuse_vnop_setextattr()
2805 ap->a_name); in fuse_vnop_setextattr()
2808 uio->uio_resid, uio); in fuse_vnop_setextattr()
2832 * NUL-terminated strings. The FreeBSD extended attribute list is a single
2833 * byte length followed by a non-NUL terminated string. So, this allows
2848 * prefix - exattr namespace prefix string
2849 * list, list_len - input list with namespace prefixes
2850 * bsd_list, bsd_list_len - output list compatible with bsd vfs
2866 len = dist_to_next - in fuse_xattrlist_convert()
2867 (prefix_len + sizeof(extattr_namespace_separator)) - 1; in fuse_xattrlist_convert()
2892 * - FUSE_LISTXATTR returns all extended attributes across all namespaces,
2894 * - FUSE_LISTXATTR prepends each attribute name with "namespace."
2895 * - If the provided buffer is not large enough to hold the result,
2913 struct vnode *vp = ap->a_vp; in fuse_vnop_listextattr()
2914 struct uio *uio = ap->a_uio; in fuse_vnop_listextattr()
2919 struct thread *td = ap->a_td; in fuse_vnop_listextattr()
2920 struct ucred *cred = ap->a_cred; in fuse_vnop_listextattr()
2936 err = fuse_extattr_check_cred(vp, ap->a_attrnamespace, cred, td, VREAD); in fuse_vnop_listextattr()
2944 if (ap->a_attrnamespace == EXTATTR_NAMESPACE_SYSTEM) in fuse_vnop_listextattr()
2956 list_xattr_in->size = 0; in fuse_vnop_listextattr()
2969 linux_list_len = list_xattr_out->size; in fuse_vnop_listextattr()
2971 if (ap->a_size != NULL) in fuse_vnop_listextattr()
2972 *ap->a_size = linux_list_len; in fuse_vnop_listextattr()
2981 list_xattr_in->size = linux_list_len; in fuse_vnop_listextattr()
3022 if (ap->a_size != NULL) in fuse_vnop_listextattr()
3023 *ap->a_size = bsd_list_len; in fuse_vnop_listextattr()
3048 struct vnode *vp = ap->a_vp; in fuse_vnop_deallocate()
3053 struct ucred *cred = ap->a_cred; in fuse_vnop_deallocate()
3054 pid_t pid = curthread->td_proc->p_pid; in fuse_vnop_deallocate()
3055 off_t *len = ap->a_len; in fuse_vnop_deallocate()
3056 off_t *offset = ap->a_offset; in fuse_vnop_deallocate()
3057 int ioflag = ap->a_ioflag; in fuse_vnop_deallocate()
3073 if (err == EBADF && vnode_mount(vp)->mnt_flag & MNT_EXPORTED) { in fuse_vnop_deallocate()
3094 ffi->fh = fufh->fh_id; in fuse_vnop_deallocate()
3095 ffi->offset = *offset; in fuse_vnop_deallocate()
3096 ffi->length = *len; in fuse_vnop_deallocate()
3101 ffi->mode = FUSE_FALLOC_FL_PUNCH_HOLE | FUSE_FALLOC_FL_KEEP_SIZE; in fuse_vnop_deallocate()
3159 struct vnode *vp = ap->a_vp; in fuse_vnop_deleteextattr()
3162 struct thread *td = ap->a_td; in fuse_vnop_deleteextattr()
3163 struct ucred *cred = ap->a_cred; in fuse_vnop_deleteextattr()
3180 err = fuse_extattr_check_cred(vp, ap->a_attrnamespace, cred, td, in fuse_vnop_deleteextattr()
3186 if (ap->a_attrnamespace == EXTATTR_NAMESPACE_SYSTEM) in fuse_vnop_deleteextattr()
3192 strlen(ap->a_name) + 1; in fuse_vnop_deleteextattr()
3199 ap->a_name); in fuse_vnop_deleteextattr()
3220 struct fuse_vnode_data *fvdat = VTOFUD(ap->a_vp); in fuse_vnop_print()
3223 (uintmax_t)VTOILLU(ap->a_vp), (uintmax_t)fvdat->parent_nid, in fuse_vnop_print()
3224 (uintmax_t)fvdat->nlookup, in fuse_vnop_print()
3225 fvdat->flag); in fuse_vnop_print()
3245 struct vnode *vp = ap->a_vp; in fuse_vnop_vptofh()
3247 struct fuse_fid *fhp = (struct fuse_fid *)(ap->a_fhp); in fuse_vnop_vptofh()
3255 if (!(data->dataflags & FSESS_EXPORT_SUPPORT)) { in fuse_vnop_vptofh()
3262 if ((mp->mnt_flag & MNT_EXPORTED) && in fuse_vnop_vptofh()
3282 err = fuse_internal_getattr(vp, &va, curthread->td_ucred, curthread); in fuse_vnop_vptofh()
3286 /*ip = VTOI(ap->a_vp);*/ in fuse_vnop_vptofh()
3287 /*ufhp = (struct ufid *)ap->a_fhp;*/ in fuse_vnop_vptofh()
3288 fhp->len = sizeof(struct fuse_fid); in fuse_vnop_vptofh()
3289 fhp->nid = fvdat->nid; in fuse_vnop_vptofh()
3290 if (fvdat->generation <= UINT32_MAX) in fuse_vnop_vptofh()
3291 fhp->gen = fvdat->generation; in fuse_vnop_vptofh()