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/sys/filedesc.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 /*      $NetBSD: filedesc.h,v 1.52 2008/07/02 17:06:12 ad Exp $ */
    2 
    3 /*-
    4  * Copyright (c) 2008 The NetBSD Foundation, Inc.
    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
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   26  * POSSIBILITY OF SUCH DAMAGE.
   27  */
   28 
   29 /*
   30  * Copyright (c) 1990, 1993
   31  *      The Regents of the University of California.  All rights reserved.
   32  *
   33  * Redistribution and use in source and binary forms, with or without
   34  * modification, are permitted provided that the following conditions
   35  * are met:
   36  * 1. Redistributions of source code must retain the above copyright
   37  *    notice, this list of conditions and the following disclaimer.
   38  * 2. Redistributions in binary form must reproduce the above copyright
   39  *    notice, this list of conditions and the following disclaimer in the
   40  *    documentation and/or other materials provided with the distribution.
   41  * 3. Neither the name of the University nor the names of its contributors
   42  *    may be used to endorse or promote products derived from this software
   43  *    without specific prior written permission.
   44  *
   45  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   55  * SUCH DAMAGE.
   56  *
   57  *      @(#)filedesc.h  8.1 (Berkeley) 6/2/93
   58  */
   59 
   60 #ifndef _SYS_FILEDESC_H_
   61 #define _SYS_FILEDESC_H_
   62 
   63 #include <sys/param.h>
   64 #include <sys/queue.h>
   65 #include <sys/mutex.h>
   66 #include <sys/rwlock.h>
   67 #include <sys/condvar.h>
   68 
   69 /*
   70  * This structure is used for the management of descriptors.  It may be
   71  * shared by multiple processes.
   72  *
   73  * A process is initially started out with NDFILE descriptors stored within
   74  * this structure, selected to be enough for typical applications based on
   75  * the historical limit of 20 open files (and the usage of descriptors by
   76  * shells).  If these descriptors are exhausted, a larger descriptor table
   77  * may be allocated, up to a process' resource limit; the internal arrays
   78  * are then unused.  The initial expansion is set to NDEXTENT; each time
   79  * it runs out, it is doubled until the resource limit is reached. NDEXTENT
   80  * should be selected to be the biggest multiple of OFILESIZE (see below)
   81  * that will fit in a power-of-two sized piece of memory.
   82  */
   83 #define NDFILE          20
   84 #define NDEXTENT        50              /* 250 bytes in 256-byte alloc */
   85 #define NDENTRIES       32              /* 32 fds per entry */
   86 #define NDENTRYMASK     (NDENTRIES - 1)
   87 #define NDENTRYSHIFT    5               /* bits per entry */
   88 #define NDLOSLOTS(x)    (((x) + NDENTRIES - 1) >> NDENTRYSHIFT)
   89 #define NDHISLOTS(x)    ((NDLOSLOTS(x) + NDENTRIES - 1) >> NDENTRYSHIFT)
   90 #define NDFDFILE        3               /* first 3 descriptors are free */
   91 
   92 /*
   93  * Process-private descriptor reference, one for each descriptor slot
   94  * in use.  Locks:
   95  *
   96  * :    unlocked
   97  * d    filedesc_t::fd_lock
   98  * f    fdfile_t::ff_lock, may be stable if reference held
   99  *
  100  * Note that ff_exclose and ff_allocated are likely to be byte sized
  101  * (bool).  In general adjacent sub-word sized fields must be locked
  102  * the same way, but in this case it's ok: ff_exclose can only be
  103  * modified while the descriptor slot is live, and ff_allocated when
  104  * it's invalid.
  105  */
  106 typedef struct fdfile {
  107         kmutex_t        ff_lock;        /* :: lock on structure */
  108         bool            ff_exclose;     /* :: close on exec flag */
  109         bool            ff_allocated;   /* d: descriptor slot is allocated */
  110         u_int           ff_refcnt;      /* f: reference count on structure */
  111         struct file     *ff_file;       /* f: pointer to file if open */
  112         SLIST_HEAD(,knote) ff_knlist;   /* f: knotes attached to this fd */
  113         kcondvar_t      ff_closing;     /* f: notifier for close */
  114 } fdfile_t;
  115 
  116 /* Reference count */
  117 #define FR_CLOSING      (0x80000000)    /* closing: must interlock */
  118 #define FR_MASK         (~FR_CLOSING)   /* reference count */
  119 
  120 typedef struct filedesc {
  121         /*
  122          * Built-in fdfile_t records first, since they have strict
  123          * alignment requirements.
  124          */
  125         uint8_t         fd_dfdfile[NDFDFILE][CACHE_LINE_SIZE];
  126         /*
  127          * All of the remaining fields are locked by fd_lock.
  128          */
  129         kmutex_t        fd_lock;        /* lock on structure */
  130         fdfile_t        **fd_ofiles;    /* file structures for open files */
  131         uint32_t        *fd_himap;      /* each bit points to 32 fds */
  132         uint32_t        *fd_lomap;      /* bitmap of free fds */
  133         void            *fd_discard;    /* old fd_ofiles tables to discard */
  134         struct klist    *fd_knhash;     /* hash of attached non-fd knotes */
  135         int             fd_lastkqfile;  /* max descriptor for kqueue */
  136         int             fd_lastfile;    /* high-water mark of fd_ofiles */
  137         int             fd_refcnt;      /* reference count */
  138         int             fd_nfiles;      /* number of open files allocated */
  139         u_long          fd_knhashmask;  /* size of fd_knhash */
  140 #define fd_startzero    fd_freefile     /* area to zero on return to cache */
  141         int             fd_freefile;    /* approx. next free file */
  142         int             fd_nused;       /* number of slots in use */
  143         bool            fd_exclose;     /* non-zero if >0 fd with EXCLOSE */
  144         /*
  145          * These arrays are used when the number of open files is
  146          * <= NDFILE, and are then pointed to by the pointers above.
  147          */
  148         fdfile_t        *fd_dfiles[NDFILE];
  149         /*
  150          * These arrays are used when the number of open files is
  151          * <= 1024, and are then pointed to by the pointers above.
  152          */
  153         uint32_t        fd_dhimap[NDENTRIES >> NDENTRYSHIFT];
  154         uint32_t        fd_dlomap[NDENTRIES];
  155 } filedesc_t;
  156 
  157 typedef struct cwdinfo {
  158         struct vnode    *cwdi_cdir;     /* current directory */
  159         struct vnode    *cwdi_rdir;     /* root directory */
  160         struct vnode    *cwdi_edir;     /* emulation root (if known) */
  161         krwlock_t       cwdi_lock;      /* lock on entire struct */
  162         u_short         cwdi_cmask;     /* mask for file creation */
  163         u_int           cwdi_refcnt;    /* reference count */
  164 } cwdinfo_t;
  165 
  166 #ifdef _KERNEL
  167 
  168 struct fileops;
  169 struct socket;
  170 struct proc;
  171 
  172 /*
  173  * Kernel global variables and routines.
  174  */
  175 void    fd_sys_init(void);
  176 int     fd_dupopen(int, int *, int, int);
  177 int     fd_alloc(struct proc *, int, int *);
  178 void    fd_tryexpand(struct proc *);
  179 int     fd_allocfile(file_t **, int *);
  180 void    fd_affix(struct proc *, file_t *, unsigned);
  181 void    fd_abort(struct proc *, file_t *, unsigned);
  182 filedesc_t *fd_copy(void);
  183 filedesc_t *fd_init(filedesc_t *);
  184 void    fd_share(proc_t *);
  185 void    fd_clear(void);
  186 void    fd_free(void);
  187 void    fd_remove(filedesc_t *, unsigned);
  188 void    fd_closeexec(void);
  189 int     fd_checkstd(void);
  190 file_t  *fd_getfile(unsigned);
  191 file_t  *fd_getfile2(proc_t *, unsigned);
  192 void    fd_putfile(unsigned);
  193 int     fd_getvnode(unsigned, file_t **);
  194 int     fd_getsock(unsigned, struct socket **);
  195 void    fd_putvnode(unsigned);
  196 void    fd_putsock(unsigned);
  197 int     fd_close(unsigned);
  198 void    fd_used(filedesc_t *, unsigned);
  199 void    fd_unused(filedesc_t *, unsigned);
  200 bool    fd_isused(filedesc_t *, unsigned);
  201 int     fd_dup(file_t *, int, int *, bool);
  202 int     fd_dup2(file_t *, unsigned);
  203 int     fd_clone(file_t *, unsigned, int, const struct fileops *, void *);
  204 
  205 struct cwdinfo *cwdinit(void);
  206 void    cwdshare(proc_t *);
  207 void    cwdfree(struct cwdinfo *);
  208 #define GETCWD_CHECK_ACCESS 0x0001
  209 int     getcwd_common(struct vnode *, struct vnode *, char **, char *, int,
  210     int, struct lwp *);
  211 int     vnode_to_path(char *, size_t, struct vnode *, struct lwp *,
  212     struct proc *);
  213 
  214 void    ffree(file_t *);
  215 int     closef(file_t *);
  216 file_t *fgetdummy(void);
  217 void    fputdummy(file_t *);
  218 
  219 struct stat;
  220 int     do_sys_fstat(int, struct stat *);
  221 struct flock;
  222 int     do_fcntl_lock(int, int, struct flock *);
  223 int     do_posix_fadvise(int, off_t, off_t, int);
  224 
  225 extern kmutex_t filelist_lock;
  226 
  227 #endif /* _KERNEL */
  228 
  229 #endif /* !_SYS_FILEDESC_H_ */

Cache object: 11c115fb2fc2c8de1b538f602632663d


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