The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/fs/fuse/fuse_internal.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-3-Clause
    3  *
    4  * Copyright (c) 2007-2009 Google Inc. and Amit Singh
    5  * All rights reserved.
    6  * 
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions are
    9  * met:
   10  * 
   11  * * Redistributions of source code must retain the above copyright
   12  *   notice, this list of conditions and the following disclaimer.
   13  * * Redistributions in binary form must reproduce the above
   14  *   copyright notice, this list of conditions and the following disclaimer
   15  *   in the documentation and/or other materials provided with the
   16  *   distribution.
   17  * * Neither the name of Google Inc. nor the names of its
   18  *   contributors may be used to endorse or promote products derived from
   19  *   this software without specific prior written permission.
   20  * 
   21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   32  * 
   33  * Copyright (C) 2005 Csaba Henk.
   34  * All rights reserved.
   35  *
   36  * Copyright (c) 2019 The FreeBSD Foundation
   37  *
   38  * Portions of this software were developed by BFF Storage Systems, LLC under
   39  * sponsorship from the FreeBSD Foundation.
   40  * 
   41  * Redistribution and use in source and binary forms, with or without
   42  * modification, are permitted provided that the following conditions
   43  * are met:
   44  * 1. Redistributions of source code must retain the above copyright
   45  *    notice, this list of conditions and the following disclaimer.
   46  * 2. Redistributions in binary form must reproduce the above copyright
   47  *    notice, this list of conditions and the following disclaimer in the
   48  *    documentation and/or other materials provided with the distribution.
   49  * 
   50  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   51  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   52  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   53  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
   54  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   55  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   56  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   57  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   58  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   59  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   60  * SUCH DAMAGE.
   61  *
   62  * $FreeBSD$
   63  */
   64 
   65 #ifndef _FUSE_INTERNAL_H_
   66 #define _FUSE_INTERNAL_H_
   67 
   68 #include <sys/types.h>
   69 #include <sys/counter.h>
   70 #include <sys/limits.h>
   71 #include <sys/uio.h>
   72 #include <sys/stat.h>
   73 #include <sys/vnode.h>
   74 
   75 #include "fuse_ipc.h"
   76 #include "fuse_node.h"
   77 
   78 extern counter_u64_t fuse_lookup_cache_hits;
   79 extern counter_u64_t fuse_lookup_cache_misses;
   80 
   81 static inline bool
   82 vfs_isrdonly(struct mount *mp)
   83 {
   84         return ((mp->mnt_flag & MNT_RDONLY) != 0);
   85 }
   86 
   87 static inline struct mount *
   88 vnode_mount(struct vnode *vp)
   89 {
   90         return (vp->v_mount);
   91 }
   92 
   93 static inline enum vtype
   94 vnode_vtype(struct vnode *vp)
   95 {
   96         return (vp->v_type);
   97 }
   98 
   99 static inline bool
  100 vnode_isvroot(struct vnode *vp)
  101 {
  102         return ((vp->v_vflag & VV_ROOT) != 0);
  103 }
  104 
  105 static inline bool
  106 vnode_isreg(struct vnode *vp)
  107 {
  108         return (vp->v_type == VREG);
  109 }
  110 
  111 static inline bool
  112 vnode_isdir(struct vnode *vp)
  113 {
  114         return (vp->v_type == VDIR);
  115 }
  116 
  117 static inline bool
  118 vnode_islnk(struct vnode *vp)
  119 {
  120         return (vp->v_type == VLNK);
  121 }
  122 
  123 static inline ssize_t
  124 uio_resid(struct uio *uio)
  125 {
  126         return (uio->uio_resid);
  127 }
  128 
  129 static inline off_t
  130 uio_offset(struct uio *uio)
  131 {
  132         return (uio->uio_offset);
  133 }
  134 
  135 static inline void
  136 uio_setoffset(struct uio *uio, off_t offset)
  137 {
  138         uio->uio_offset = offset;
  139 }
  140 
  141 /* miscellaneous */
  142 
  143 static inline bool
  144 fuse_isdeadfs(struct vnode *vp)
  145 {
  146         struct fuse_data *data = fuse_get_mpdata(vnode_mount(vp));
  147 
  148         return (data->dataflags & FSESS_DEAD);
  149 }
  150 
  151 static inline uint64_t
  152 fuse_iosize(struct vnode *vp)
  153 {
  154         return (vp->v_mount->mnt_stat.f_iosize);
  155 }
  156 
  157 /*
  158  * Make a cacheable timeout in bintime format value based on a fuse_attr_out
  159  * response
  160  */
  161 static inline void
  162 fuse_validity_2_bintime(uint64_t attr_valid, uint32_t attr_valid_nsec,
  163         struct bintime *timeout)
  164 {
  165         struct timespec now, duration, timeout_ts;
  166 
  167         getnanouptime(&now);
  168         /* "+ 2" is the bound of attr_valid_nsec + now.tv_nsec */
  169         /* Why oh why isn't there a TIME_MAX defined? */
  170         if (attr_valid >= INT_MAX || attr_valid + now.tv_sec + 2 >= INT_MAX) {
  171                 timeout->sec = INT_MAX;
  172         } else {
  173                 duration.tv_sec = attr_valid;
  174                 duration.tv_nsec = attr_valid_nsec;
  175                 timespecadd(&duration, &now, &timeout_ts);
  176                 timespec2bintime(&timeout_ts, timeout);
  177         }
  178 }
  179 
  180 /*
  181  * Make a cacheable timeout value in timespec format based on the fuse_entry_out
  182  * response
  183  */
  184 static inline void
  185 fuse_validity_2_timespec(const struct fuse_entry_out *feo,
  186         struct timespec *timeout)
  187 {
  188         struct timespec duration, now;
  189 
  190         getnanouptime(&now);
  191         /* "+ 2" is the bound of entry_valid_nsec + now.tv_nsec */
  192         if (feo->entry_valid >= INT_MAX ||
  193             feo->entry_valid + now.tv_sec + 2 >= INT_MAX) {
  194                 timeout->tv_sec = INT_MAX;
  195         } else {
  196                 duration.tv_sec = feo->entry_valid;
  197                 duration.tv_nsec = feo->entry_valid_nsec;
  198                 timespecadd(&duration, &now, timeout);
  199         }
  200 }
  201 
  202 /* VFS ops */
  203 int
  204 fuse_internal_get_cached_vnode(struct mount*, ino_t, int, struct vnode**);
  205 
  206 /* access */
  207 static inline int
  208 fuse_match_cred(struct ucred *basecred, struct ucred *usercred)
  209 {
  210         if (basecred->cr_uid == usercred->cr_uid             &&
  211             basecred->cr_uid == usercred->cr_ruid            &&
  212             basecred->cr_uid == usercred->cr_svuid           &&
  213             basecred->cr_groups[0] == usercred->cr_groups[0] &&
  214             basecred->cr_groups[0] == usercred->cr_rgid      &&
  215             basecred->cr_groups[0] == usercred->cr_svgid)
  216                 return (0);
  217 
  218         return (EPERM);
  219 }
  220 
  221 int fuse_internal_access(struct vnode *vp, accmode_t mode,
  222     struct thread *td, struct ucred *cred);
  223 
  224 /* attributes */
  225 void fuse_internal_cache_attrs(struct vnode *vp, struct fuse_attr *attr,
  226         uint64_t attr_valid, uint32_t attr_valid_nsec, struct vattr *vap,
  227         bool from_server);
  228 
  229 /* fsync */
  230 
  231 int fuse_internal_fsync(struct vnode *vp, struct thread *td, int waitfor,
  232         bool datasync);
  233 int fuse_internal_fsync_callback(struct fuse_ticket *tick, struct uio *uio);
  234 
  235 /* getattr */
  236 int fuse_internal_do_getattr(struct vnode *vp, struct vattr *vap,
  237         struct ucred *cred, struct thread *td);
  238 int fuse_internal_getattr(struct vnode *vp, struct vattr *vap,
  239         struct ucred *cred, struct thread *td);
  240 
  241 /* asynchronous invalidation */
  242 int fuse_internal_invalidate_entry(struct mount *mp, struct uio *uio);
  243 int fuse_internal_invalidate_inode(struct mount *mp, struct uio *uio);
  244 
  245 /* mknod */
  246 int fuse_internal_mknod(struct vnode *dvp, struct vnode **vpp,
  247         struct componentname *cnp, struct vattr *vap);
  248 
  249 /* readdir */
  250 struct pseudo_dirent {
  251         uint32_t d_namlen;
  252 };
  253 int fuse_internal_readdir(struct vnode *vp, struct uio *uio,
  254     struct fuse_filehandle *fufh, struct fuse_iov *cookediov, int *ncookies,
  255     uint64_t *cookies);
  256 int fuse_internal_readdir_processdata(struct uio *uio, size_t reqsize,
  257     void *buf, size_t bufsize, struct fuse_iov *cookediov, int *ncookies,
  258     uint64_t **cookiesp);
  259 
  260 /* remove */
  261 
  262 int fuse_internal_remove(struct vnode *dvp, struct vnode *vp,
  263     struct componentname *cnp, enum fuse_opcode op);
  264 
  265 /* rename */
  266 
  267 int fuse_internal_rename(struct vnode *fdvp, struct componentname *fcnp,
  268     struct vnode *tdvp, struct componentname *tcnp);
  269 
  270 /* revoke */
  271 
  272 void fuse_internal_vnode_disappear(struct vnode *vp);
  273 
  274 /* setattr */
  275 int fuse_internal_setattr(struct vnode *vp, struct vattr *va,
  276         struct thread *td, struct ucred *cred);
  277 
  278 /* write */
  279 void fuse_internal_clear_suid_on_write(struct vnode *vp, struct ucred *cred,
  280     struct thread *td);
  281 
  282 /* strategy */
  283 
  284 /* entity creation */
  285 
  286 static inline int
  287 fuse_internal_checkentry(struct fuse_entry_out *feo, enum vtype vtyp)
  288 {
  289         if (vtyp != IFTOVT(feo->attr.mode)) {
  290                 return (EINVAL);
  291         }
  292 
  293         if (feo->nodeid == FUSE_NULL_ID) {
  294                 return (EINVAL);
  295         }
  296 
  297         if (feo->nodeid == FUSE_ROOT_ID) {
  298                 return (EINVAL);
  299         }
  300 
  301         return (0);
  302 }
  303 
  304 int fuse_internal_newentry(struct vnode *dvp, struct vnode **vpp,
  305     struct componentname *cnp, enum fuse_opcode op, void *buf, size_t bufsize,
  306     enum vtype vtyp);
  307 
  308 void fuse_internal_newentry_makerequest(struct mount *mp, uint64_t dnid,
  309     struct componentname *cnp, enum fuse_opcode op, void *buf, size_t bufsize,
  310     struct fuse_dispatcher *fdip);
  311 
  312 int fuse_internal_newentry_core(struct vnode *dvp, struct vnode **vpp,
  313     struct componentname *cnp, enum vtype vtyp, struct fuse_dispatcher *fdip);
  314 
  315 /* entity destruction */
  316 
  317 int fuse_internal_forget_callback(struct fuse_ticket *tick, struct uio *uio);
  318 void fuse_internal_forget_send(struct mount *mp, struct thread *td,
  319     struct ucred *cred, uint64_t nodeid, uint64_t nlookup);
  320 
  321 /* fuse start/stop */
  322 
  323 int fuse_internal_init_callback(struct fuse_ticket *tick, struct uio *uio);
  324 void fuse_internal_send_init(struct fuse_data *data, struct thread *td);
  325 
  326 /* module load/unload */
  327 void fuse_internal_init(void);
  328 void fuse_internal_destroy(void);
  329 
  330 #endif /* _FUSE_INTERNAL_H_ */

Cache object: 54d985eef647bb0c542ebbbdd90a54db


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.