FreeBSD/Linux Kernel Cross Reference
sys/sys/filedesc.h
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
|