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.70 2022/10/26 23:39:10 riastradh 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        6               /* first 6 descriptors are free */
   91 
   92 /*
   93  * Process-private descriptor reference, one for each descriptor slot
   94  * in use.  Locks:
   95  *
   96  * :    unlocked
   97  * a    atomic operations + filedesc_t::fd_lock in some cases
   98  * d    filedesc_t::fd_lock
   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         bool            ff_exclose;     /* :: close on exec flag */
  108         bool            ff_allocated;   /* d: descriptor slot is allocated */
  109         u_int           ff_refcnt;      /* a: reference count on structure */
  110         struct file     *ff_file;       /* d: pointer to file if open */
  111         SLIST_HEAD(,knote) ff_knlist;   /* d: knotes attached to this fd */
  112         kcondvar_t      ff_closing;     /* d: notifier for close */
  113 } fdfile_t;
  114 
  115 #define FDFILE_SIZE ((sizeof(fdfile_t)+CACHE_LINE_SIZE-1)/CACHE_LINE_SIZE*CACHE_LINE_SIZE)
  116 
  117 /* Reference count */
  118 #define FR_CLOSING      (0x80000000)    /* closing: must interlock */
  119 #define FR_MASK         (~FR_CLOSING)   /* reference count */
  120 
  121 /*
  122  * Open file table, potentially many 'active' tables per filedesc_t
  123  * in a multi-threaded process, or with a shared filedesc_t (clone()).
  124  * nfiles is first to avoid pointer arithmetic.
  125  */
  126 typedef struct fdtab {
  127         u_int           dt_nfiles;      /* number of open files allocated */
  128         struct fdtab    *dt_link;       /* for lists of dtab */
  129         fdfile_t        *dt_ff[NDFILE]; /* file structures for open fds */
  130 } fdtab_t;
  131 
  132 typedef struct filedesc {
  133         /*
  134          * Built-in fdfile_t records first, since they have strict
  135          * alignment requirements.
  136          */
  137         uint8_t         fd_dfdfile[NDFDFILE][FDFILE_SIZE];
  138         /*
  139          * All of the remaining fields are locked by fd_lock.
  140          */
  141         kmutex_t        fd_lock;        /* lock on structure */
  142         fdtab_t * volatile fd_dt;       /* active descriptor table */
  143         uint32_t        *fd_himap;      /* each bit points to 32 fds */
  144         uint32_t        *fd_lomap;      /* bitmap of free fds */
  145         struct klist    *fd_knhash;     /* hash of attached non-fd knotes */
  146         int             fd_lastkqfile;  /* max descriptor for kqueue */
  147         int             fd_lastfile;    /* high-water mark of fd_ofiles */
  148         int             fd_refcnt;      /* reference count */
  149         u_long          fd_knhashmask;  /* size of fd_knhash */
  150         int             fd_freefile;    /* approx. next free file */
  151         int             fd_unused;      /* unused */
  152         bool            fd_exclose;     /* non-zero if >0 fd with EXCLOSE */
  153         /*
  154          * This structure is used when the number of open files is
  155          * <= NDFILE, and are then pointed to by the pointers above.
  156          */
  157         fdtab_t         fd_dtbuiltin;
  158         /*
  159          * These arrays are used when the number of open files is
  160          * <= 1024, and are then pointed to by the pointers above.
  161          */
  162 #define fd_startzero    fd_dhimap       /* area to zero on return to cache */
  163         uint32_t        fd_dhimap[NDENTRIES >> NDENTRYSHIFT];
  164         uint32_t        fd_dlomap[NDENTRIES];
  165 } filedesc_t;
  166 
  167 /*
  168  * Working directory, root and umask information.  Serialization:
  169  *
  170  * a    atomic operations
  171  * l    cwdi_lock
  172  */
  173 typedef struct cwdinfo {
  174         struct vnode    *cwdi_cdir;     /* l: current directory */
  175         struct vnode    *cwdi_rdir;     /* l: root directory */
  176         struct vnode    *cwdi_edir;     /* l: emulation root (if known) */
  177         u_int           cwdi_cmask;     /* a: mask for file creation */
  178         u_int           cwdi_refcnt;    /* a: reference count */
  179 
  180         krwlock_t       cwdi_lock       /* :: lock on struct */
  181             __aligned(COHERENCY_UNIT);  /* -> gets own cache line */
  182 } cwdinfo_t;
  183 
  184 #ifdef _KERNEL
  185 
  186 struct fileops;
  187 struct socket;
  188 struct proc;
  189 
  190 extern struct cwdinfo cwdi0;
  191 
  192 /*
  193  * Kernel global variables and routines.
  194  */
  195 void    fd_sys_init(void);
  196 int     fd_open(const char*, int, int, int*);
  197 int     fd_dupopen(int, bool, int, int *);
  198 int     fd_alloc(struct proc *, int, int *);
  199 void    fd_tryexpand(struct proc *);
  200 int     fd_allocfile(file_t **, int *);
  201 void    fd_affix(struct proc *, file_t *, unsigned);
  202 void    fd_abort(struct proc *, file_t *, unsigned);
  203 filedesc_t *fd_copy(void);
  204 filedesc_t *fd_init(filedesc_t *);
  205 void    fd_share(proc_t *);
  206 void    fd_hold(lwp_t *);
  207 void    fd_free(void);
  208 void    fd_closeexec(void);
  209 void    fd_ktrexecfd(void);
  210 int     fd_checkstd(void);
  211 file_t  *fd_getfile(unsigned);
  212 file_t  *fd_getfile2(proc_t *, unsigned);
  213 void    fd_putfile(unsigned);
  214 int     fd_getvnode(unsigned, file_t **);
  215 int     fd_getsock(unsigned, struct socket **);
  216 int     fd_getsock1(unsigned, struct socket **, file_t **);
  217 void    fd_putvnode(unsigned);
  218 void    fd_putsock(unsigned);
  219 int     fd_close(unsigned);
  220 int     fd_dup(file_t *, int, int *, bool);
  221 int     fd_dup2(file_t *, unsigned, int);
  222 int     fd_clone(file_t *, unsigned, int, const struct fileops *, void *);
  223 void    fd_set_exclose(struct lwp *, int, bool);
  224 int     pipe1(struct lwp *, int *, int);
  225 int     dodup(struct lwp *, int, int, int, register_t *);
  226 
  227 void    cwd_sys_init(void);
  228 struct cwdinfo *cwdinit(void);
  229 void    cwdshare(proc_t *);
  230 void    cwdunshare(proc_t *);
  231 void    cwdfree(struct cwdinfo *);
  232 void    cwdexec(struct proc *);
  233 
  234 #define GETCWD_CHECK_ACCESS 0x0001
  235 int     getcwd_common(struct vnode *, struct vnode *, char **, char *, int,
  236     int, struct lwp *);
  237 int     vnode_to_path(char *, size_t, struct vnode *, struct lwp *,
  238     struct proc *);
  239 
  240 int     closef(file_t *);
  241 file_t *fgetdummy(void);
  242 void    fputdummy(file_t *);
  243 
  244 struct stat;
  245 int     do_sys_fstat(int, struct stat *);
  246 struct flock;
  247 int     do_fcntl_lock(int, int, struct flock *);
  248 int     do_posix_fadvise(int, off_t, off_t, int);
  249 
  250 extern kmutex_t filelist_lock;
  251 extern filedesc_t filedesc0;
  252 
  253 #endif /* _KERNEL */
  254 
  255 #endif /* !_SYS_FILEDESC_H_ */

Cache object: 5cb647b02cd2a165f0dbbe641f6f1035


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