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/pseudofs/pseudofs_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  * Copyright (c) 2001 Dag-Erling Coïdan Smørgrav
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer
   10  *    in this position and unchanged.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  * 3. The name of the author may not be used to endorse or promote products
   15  *    derived from this software without specific prior written permission.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   27  *
   28  *      $FreeBSD$
   29  */
   30 
   31 #ifndef _PSEUDOFS_INTERNAL_H_INCLUDED
   32 #define _PSEUDOFS_INTERNAL_H_INCLUDED
   33 
   34 /*
   35  * Sysctl subtree
   36  */
   37 SYSCTL_DECL(_vfs_pfs);
   38 
   39 /*
   40  * Vnode data
   41  */
   42 struct pfs_vdata {
   43         struct pfs_node *pvd_pn;
   44         pid_t            pvd_pid;
   45         struct vnode    *pvd_vnode;
   46         struct pfs_vdata*pvd_prev, *pvd_next;
   47         int              pvd_dead:1;
   48 };
   49 
   50 /*
   51  * Vnode cache
   52  */
   53 void     pfs_vncache_load       (void);
   54 void     pfs_vncache_unload     (void);
   55 int      pfs_vncache_alloc      (struct mount *, struct vnode **,
   56                                  struct pfs_node *, pid_t pid);
   57 int      pfs_vncache_free       (struct vnode *);
   58 
   59 /*
   60  * File number bitmap
   61  */
   62 void     pfs_fileno_init        (struct pfs_info *);
   63 void     pfs_fileno_uninit      (struct pfs_info *);
   64 void     pfs_fileno_alloc       (struct pfs_node *);
   65 void     pfs_fileno_free        (struct pfs_node *);
   66 
   67 /*
   68  * Debugging
   69  */
   70 #ifdef PSEUDOFS_TRACE
   71 extern int pfs_trace;
   72 
   73 #define PFS_TRACE(foo) \
   74         do { \
   75                 if (pfs_trace) { \
   76                         printf("%s(): line %d: ", __func__, __LINE__); \
   77                         printf foo ; \
   78                         printf("\n"); \
   79                 } \
   80         } while (0)
   81 #define PFS_RETURN(err) \
   82         do { \
   83                 if (pfs_trace) { \
   84                         printf("%s(): line %d: returning %d\n", \
   85                             __func__, __LINE__, err); \
   86                 } \
   87                 return (err); \
   88         } while (0)
   89 #else
   90 #define PFS_TRACE(foo) \
   91         do { /* nothing */ } while (0)
   92 #define PFS_RETURN(err) \
   93         return (err)
   94 #endif
   95 
   96 /*
   97  * Inline helpers for locking
   98  */
   99 static inline void
  100 pfs_lock(struct pfs_node *pn)
  101 {
  102 
  103         mtx_lock(&pn->pn_mutex);
  104 }
  105 
  106 static inline void
  107 pfs_unlock(struct pfs_node *pn)
  108 {
  109 
  110         mtx_unlock(&pn->pn_mutex);
  111 }
  112 
  113 static inline void
  114 pfs_assert_owned(struct pfs_node *pn)
  115 {
  116 
  117         mtx_assert(&pn->pn_mutex, MA_OWNED);
  118 }
  119 
  120 static inline void
  121 pfs_assert_not_owned(struct pfs_node *pn)
  122 {
  123 
  124         mtx_assert(&pn->pn_mutex, MA_NOTOWNED);
  125 }
  126 
  127 static inline int
  128 pn_fill(PFS_FILL_ARGS)
  129 {
  130 
  131         PFS_TRACE(("%s", pn->pn_name));
  132         KASSERT(pn->pn_fill != NULL, ("%s(): no callback", __func__));
  133         if (p != NULL) {
  134                 PROC_LOCK_ASSERT(p, MA_NOTOWNED);
  135                 PROC_ASSERT_HELD(p);
  136         }
  137         pfs_assert_not_owned(pn);
  138         return ((pn->pn_fill)(PFS_FILL_ARGNAMES));
  139 }
  140 
  141 static inline int
  142 pn_attr(PFS_ATTR_ARGS)
  143 {
  144 
  145         PFS_TRACE(("%s", pn->pn_name));
  146         KASSERT(pn->pn_attr != NULL, ("%s(): no callback", __func__));
  147         if (p != NULL)
  148                 PROC_LOCK_ASSERT(p, MA_OWNED);
  149         pfs_assert_not_owned(pn);
  150         return ((pn->pn_attr)(PFS_ATTR_ARGNAMES));
  151 }
  152 
  153 static inline int
  154 pn_vis(PFS_VIS_ARGS)
  155 {
  156 
  157         PFS_TRACE(("%s", pn->pn_name));
  158         KASSERT(pn->pn_vis != NULL, ("%s(): no callback", __func__));
  159         KASSERT(p != NULL, ("%s(): no process", __func__));
  160         PROC_LOCK_ASSERT(p, MA_OWNED);
  161         pfs_assert_not_owned(pn);
  162         return ((pn->pn_vis)(PFS_VIS_ARGNAMES));
  163 }
  164 
  165 static inline int
  166 pn_ioctl(PFS_IOCTL_ARGS)
  167 {
  168 
  169         PFS_TRACE(("%s", pn->pn_name));
  170         KASSERT(pn->pn_ioctl != NULL, ("%s(): no callback", __func__));
  171         if (p != NULL)
  172                 PROC_LOCK_ASSERT(p, MA_OWNED);
  173         pfs_assert_not_owned(pn);
  174         return ((pn->pn_ioctl)(PFS_IOCTL_ARGNAMES));
  175 }
  176 
  177 static inline int
  178 pn_getextattr(PFS_GETEXTATTR_ARGS)
  179 {
  180 
  181         PFS_TRACE(("%s", pn->pn_name));
  182         KASSERT(pn->pn_getextattr != NULL, ("%s(): no callback", __func__));
  183         if (p != NULL)
  184                 PROC_LOCK_ASSERT(p, MA_OWNED);
  185         pfs_assert_not_owned(pn);
  186         return ((pn->pn_getextattr)(PFS_GETEXTATTR_ARGNAMES));
  187 }
  188 
  189 static inline int
  190 pn_close(PFS_CLOSE_ARGS)
  191 {
  192 
  193         PFS_TRACE(("%s", pn->pn_name));
  194         KASSERT(pn->pn_close != NULL, ("%s(): no callback", __func__));
  195         if (p != NULL)
  196                 PROC_LOCK_ASSERT(p, MA_OWNED);
  197         pfs_assert_not_owned(pn);
  198         return ((pn->pn_close)(PFS_CLOSE_ARGNAMES));
  199 }
  200 
  201 static inline int
  202 pn_destroy(PFS_DESTROY_ARGS)
  203 {
  204 
  205         PFS_TRACE(("%s", pn->pn_name));
  206         KASSERT(pn->pn_destroy != NULL, ("%s(): no callback", __func__));
  207         pfs_assert_not_owned(pn);
  208         return ((pn->pn_destroy)(PFS_DESTROY_ARGNAMES));
  209 }
  210 
  211 #endif

Cache object: 42a8f0e96ae648f621f082f2d440712d


[ 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.