19906654067350ed20271541e59bc6790f96e7fa
[dragonfly.git] / sys / kern / kern_descrip.c
1 /*
2  * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Jeffrey Hsu.
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  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from 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
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *
35  * Copyright (c) 1982, 1986, 1989, 1991, 1993
36  *      The Regents of the University of California.  All rights reserved.
37  * (c) UNIX System Laboratories, Inc.
38  * All or some portions of this file are derived from material licensed
39  * to the University of California by American Telephone and Telegraph
40  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
41  * the permission of UNIX System Laboratories, Inc.
42  *
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions
45  * are met:
46  * 1. Redistributions of source code must retain the above copyright
47  *    notice, this list of conditions and the following disclaimer.
48  * 2. Redistributions in binary form must reproduce the above copyright
49  *    notice, this list of conditions and the following disclaimer in the
50  *    documentation and/or other materials provided with the distribution.
51  * 3. Neither the name of the University nor the names of its contributors
52  *    may be used to endorse or promote products derived from this software
53  *    without specific prior written permission.
54  *
55  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
56  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
57  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
58  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
59  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
60  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
61  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
62  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
63  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
64  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
65  * SUCH DAMAGE.
66  *
67  *      @(#)kern_descrip.c      8.6 (Berkeley) 4/19/94
68  * $FreeBSD: src/sys/kern/kern_descrip.c,v 1.81.2.19 2004/02/28 00:43:31 tegge Exp $
69  */
70
71 #include "opt_compat.h"
72 #include <sys/param.h>
73 #include <sys/systm.h>
74 #include <sys/malloc.h>
75 #include <sys/sysproto.h>
76 #include <sys/conf.h>
77 #include <sys/device.h>
78 #include <sys/file.h>
79 #include <sys/filedesc.h>
80 #include <sys/kernel.h>
81 #include <sys/sysctl.h>
82 #include <sys/vnode.h>
83 #include <sys/proc.h>
84 #include <sys/nlookup.h>
85 #include <sys/stat.h>
86 #include <sys/filio.h>
87 #include <sys/fcntl.h>
88 #include <sys/unistd.h>
89 #include <sys/resourcevar.h>
90 #include <sys/event.h>
91 #include <sys/kern_syscall.h>
92 #include <sys/kcore.h>
93 #include <sys/kinfo.h>
94 #include <sys/un.h>
95
96 #include <vm/vm.h>
97 #include <vm/vm_extern.h>
98
99 #include <sys/thread2.h>
100 #include <sys/file2.h>
101 #include <sys/spinlock2.h>
102
103 static void fsetfd_locked(struct filedesc *fdp, struct file *fp, int fd);
104 static void fdreserve_locked (struct filedesc *fdp, int fd0, int incr);
105 static struct file *funsetfd_locked (struct filedesc *fdp, int fd);
106 static void ffree(struct file *fp);
107
108 static MALLOC_DEFINE(M_FILEDESC, "file desc", "Open file descriptor table");
109 static MALLOC_DEFINE(M_FILEDESC_TO_LEADER, "file desc to leader",
110                      "file desc to leader structures");
111 MALLOC_DEFINE(M_FILE, "file", "Open file structure");
112 static MALLOC_DEFINE(M_SIGIO, "sigio", "sigio structures");
113
114 static struct krate krate_uidinfo = { .freq = 1 };
115
116 static   d_open_t  fdopen;
117 #define NUMFDESC 64
118
119 #define CDEV_MAJOR 22
120 static struct dev_ops fildesc_ops = {
121         { "FD", 0, 0 },
122         .d_open =       fdopen,
123 };
124
125 /*
126  * Descriptor management.
127  */
128 static struct filelist filehead = LIST_HEAD_INITIALIZER(&filehead);
129 static struct spinlock filehead_spin = SPINLOCK_INITIALIZER(&filehead_spin);
130 static int nfiles;              /* actual number of open files */
131 extern int cmask;       
132
133 /*
134  * Fixup fd_freefile and fd_lastfile after a descriptor has been cleared.
135  *
136  * MPSAFE - must be called with fdp->fd_spin exclusively held
137  */
138 static __inline
139 void
140 fdfixup_locked(struct filedesc *fdp, int fd)
141 {
142         if (fd < fdp->fd_freefile) {
143                fdp->fd_freefile = fd;
144         }
145         while (fdp->fd_lastfile >= 0 &&
146                fdp->fd_files[fdp->fd_lastfile].fp == NULL &&
147                fdp->fd_files[fdp->fd_lastfile].reserved == 0
148         ) {
149                 --fdp->fd_lastfile;
150         }
151 }
152
153 /*
154  * System calls on descriptors.
155  *
156  * MPSAFE
157  */
158 int
159 sys_getdtablesize(struct getdtablesize_args *uap) 
160 {
161         struct proc *p = curproc;
162         struct plimit *limit = p->p_limit;
163         int dtsize;
164
165         spin_lock(&limit->p_spin);
166         if (limit->pl_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
167                 dtsize = INT_MAX;
168         else
169                 dtsize = (int)limit->pl_rlimit[RLIMIT_NOFILE].rlim_cur;
170         spin_unlock(&limit->p_spin);
171
172         if (dtsize > maxfilesperproc)
173                 dtsize = maxfilesperproc;
174         if (dtsize < minfilesperproc)
175                 dtsize = minfilesperproc;
176         if (p->p_ucred->cr_uid && dtsize > maxfilesperuser)
177                 dtsize = maxfilesperuser;
178         uap->sysmsg_result = dtsize;
179         return (0);
180 }
181
182 /*
183  * Duplicate a file descriptor to a particular value.
184  *
185  * note: keep in mind that a potential race condition exists when closing
186  * descriptors from a shared descriptor table (via rfork).
187  *
188  * MPSAFE
189  */
190 int
191 sys_dup2(struct dup2_args *uap)
192 {
193         int error;
194         int fd = 0;
195
196         error = kern_dup(DUP_FIXED, uap->from, uap->to, &fd);
197         uap->sysmsg_fds[0] = fd;
198
199         return (error);
200 }
201
202 /*
203  * Duplicate a file descriptor.
204  *
205  * MPSAFE
206  */
207 int
208 sys_dup(struct dup_args *uap)
209 {
210         int error;
211         int fd = 0;
212
213         error = kern_dup(DUP_VARIABLE, uap->fd, 0, &fd);
214         uap->sysmsg_fds[0] = fd;
215
216         return (error);
217 }
218
219 /*
220  * MPALMOSTSAFE - acquires mplock for fp operations
221  */
222 int
223 kern_fcntl(int fd, int cmd, union fcntl_dat *dat, struct ucred *cred)
224 {
225         struct thread *td = curthread;
226         struct proc *p = td->td_proc;
227         struct file *fp;
228         struct vnode *vp;
229         u_int newmin;
230         u_int oflags;
231         u_int nflags;
232         int tmp, error, flg = F_POSIX;
233
234         KKASSERT(p);
235
236         /*
237          * Operations on file descriptors that do not require a file pointer.
238          */
239         switch (cmd) {
240         case F_GETFD:
241                 error = fgetfdflags(p->p_fd, fd, &tmp);
242                 if (error == 0)
243                         dat->fc_cloexec = (tmp & UF_EXCLOSE) ? FD_CLOEXEC : 0;
244                 return (error);
245
246         case F_SETFD:
247                 if (dat->fc_cloexec & FD_CLOEXEC)
248                         error = fsetfdflags(p->p_fd, fd, UF_EXCLOSE);
249                 else
250                         error = fclrfdflags(p->p_fd, fd, UF_EXCLOSE);
251                 return (error);
252         case F_DUPFD:
253                 newmin = dat->fc_fd;
254                 error = kern_dup(DUP_VARIABLE | DUP_FCNTL, fd, newmin,
255                     &dat->fc_fd);
256                 return (error);
257         case F_DUPFD_CLOEXEC:
258                 newmin = dat->fc_fd;
259                 error = kern_dup(DUP_VARIABLE | DUP_CLOEXEC | DUP_FCNTL,
260                     fd, newmin, &dat->fc_fd);
261                 return (error);
262         case F_DUP2FD:
263                 newmin = dat->fc_fd;
264                 error = kern_dup(DUP_FIXED, fd, newmin, &dat->fc_fd);
265                 return (error);
266         case F_DUP2FD_CLOEXEC:
267                 newmin = dat->fc_fd;
268                 error = kern_dup(DUP_FIXED | DUP_CLOEXEC, fd, newmin,
269                                  &dat->fc_fd);
270                 return (error);
271         default:
272                 break;
273         }
274
275         /*
276          * Operations on file pointers
277          */
278         if ((fp = holdfp(p->p_fd, fd, -1)) == NULL)
279                 return (EBADF);
280
281         switch (cmd) {
282         case F_GETFL:
283                 dat->fc_flags = OFLAGS(fp->f_flag);
284                 error = 0;
285                 break;
286
287         case F_SETFL:
288                 oflags = fp->f_flag;
289                 nflags = FFLAGS(dat->fc_flags & ~O_ACCMODE) & FCNTLFLAGS;
290                 nflags |= oflags & ~FCNTLFLAGS;
291
292                 error = 0;
293                 if (((nflags ^ oflags) & O_APPEND) && (oflags & FAPPENDONLY))
294                         error = EINVAL;
295                 if (error == 0 && ((nflags ^ oflags) & FASYNC)) {
296                         tmp = nflags & FASYNC;
297                         error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp,
298                                          cred, NULL);
299                 }
300                 if (error == 0)
301                         fp->f_flag = nflags;
302                 break;
303
304         case F_GETOWN:
305                 error = fo_ioctl(fp, FIOGETOWN, (caddr_t)&dat->fc_owner,
306                                  cred, NULL);
307                 break;
308
309         case F_SETOWN:
310                 error = fo_ioctl(fp, FIOSETOWN, (caddr_t)&dat->fc_owner,
311                                  cred, NULL);
312                 break;
313
314         case F_SETLKW:
315                 flg |= F_WAIT;
316                 /* Fall into F_SETLK */
317
318         case F_SETLK:
319                 if (fp->f_type != DTYPE_VNODE) {
320                         error = EBADF;
321                         break;
322                 }
323                 vp = (struct vnode *)fp->f_data;
324
325                 /*
326                  * copyin/lockop may block
327                  */
328                 if (dat->fc_flock.l_whence == SEEK_CUR)
329                         dat->fc_flock.l_start += fp->f_offset;
330
331                 switch (dat->fc_flock.l_type) {
332                 case F_RDLCK:
333                         if ((fp->f_flag & FREAD) == 0) {
334                                 error = EBADF;
335                                 break;
336                         }
337                         if ((p->p_leader->p_flags & P_ADVLOCK) == 0) {
338                                 lwkt_gettoken(&p->p_leader->p_token);
339                                 p->p_leader->p_flags |= P_ADVLOCK;
340                                 lwkt_reltoken(&p->p_leader->p_token);
341                         }
342                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
343                             &dat->fc_flock, flg);
344                         break;
345                 case F_WRLCK:
346                         if ((fp->f_flag & FWRITE) == 0) {
347                                 error = EBADF;
348                                 break;
349                         }
350                         if ((p->p_leader->p_flags & P_ADVLOCK) == 0) {
351                                 lwkt_gettoken(&p->p_leader->p_token);
352                                 p->p_leader->p_flags |= P_ADVLOCK;
353                                 lwkt_reltoken(&p->p_leader->p_token);
354                         }
355                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
356                             &dat->fc_flock, flg);
357                         break;
358                 case F_UNLCK:
359                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK,
360                                 &dat->fc_flock, F_POSIX);
361                         break;
362                 default:
363                         error = EINVAL;
364                         break;
365                 }
366
367                 /*
368                  * It is possible to race a close() on the descriptor while
369                  * we were blocked getting the lock.  If this occurs the
370                  * close might not have caught the lock.
371                  */
372                 if (checkfdclosed(p->p_fd, fd, fp)) {
373                         dat->fc_flock.l_whence = SEEK_SET;
374                         dat->fc_flock.l_start = 0;
375                         dat->fc_flock.l_len = 0;
376                         dat->fc_flock.l_type = F_UNLCK;
377                         (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader,
378                                            F_UNLCK, &dat->fc_flock, F_POSIX);
379                 }
380                 break;
381
382         case F_GETLK:
383                 if (fp->f_type != DTYPE_VNODE) {
384                         error = EBADF;
385                         break;
386                 }
387                 vp = (struct vnode *)fp->f_data;
388                 /*
389                  * copyin/lockop may block
390                  */
391                 if (dat->fc_flock.l_type != F_RDLCK &&
392                     dat->fc_flock.l_type != F_WRLCK &&
393                     dat->fc_flock.l_type != F_UNLCK) {
394                         error = EINVAL;
395                         break;
396                 }
397                 if (dat->fc_flock.l_whence == SEEK_CUR)
398                         dat->fc_flock.l_start += fp->f_offset;
399                 error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_GETLK,
400                             &dat->fc_flock, F_POSIX);
401                 break;
402         default:
403                 error = EINVAL;
404                 break;
405         }
406
407         fdrop(fp);
408         return (error);
409 }
410
411 /*
412  * The file control system call.
413  *
414  * MPSAFE
415  */
416 int
417 sys_fcntl(struct fcntl_args *uap)
418 {
419         union fcntl_dat dat;
420         int error;
421
422         switch (uap->cmd) {
423         case F_DUPFD:
424         case F_DUP2FD:
425         case F_DUPFD_CLOEXEC:
426         case F_DUP2FD_CLOEXEC:
427                 dat.fc_fd = uap->arg;
428                 break;
429         case F_SETFD:
430                 dat.fc_cloexec = uap->arg;
431                 break;
432         case F_SETFL:
433                 dat.fc_flags = uap->arg;
434                 break;
435         case F_SETOWN:
436                 dat.fc_owner = uap->arg;
437                 break;
438         case F_SETLKW:
439         case F_SETLK:
440         case F_GETLK:
441                 error = copyin((caddr_t)uap->arg, &dat.fc_flock,
442                                sizeof(struct flock));
443                 if (error)
444                         return (error);
445                 break;
446         }
447
448         error = kern_fcntl(uap->fd, uap->cmd, &dat, curthread->td_ucred);
449
450         if (error == 0) {
451                 switch (uap->cmd) {
452                 case F_DUPFD:
453                 case F_DUP2FD:
454                 case F_DUPFD_CLOEXEC:
455                 case F_DUP2FD_CLOEXEC:
456                         uap->sysmsg_result = dat.fc_fd;
457                         break;
458                 case F_GETFD:
459                         uap->sysmsg_result = dat.fc_cloexec;
460                         break;
461                 case F_GETFL:
462                         uap->sysmsg_result = dat.fc_flags;
463                         break;
464                 case F_GETOWN:
465                         uap->sysmsg_result = dat.fc_owner;
466                         break;
467                 case F_GETLK:
468                         error = copyout(&dat.fc_flock, (caddr_t)uap->arg,
469                             sizeof(struct flock));
470                         break;
471                 }
472         }
473
474         return (error);
475 }
476
477 /*
478  * Common code for dup, dup2, and fcntl(F_DUPFD).
479  *
480  * There are four type flags: DUP_FCNTL, DUP_FIXED, DUP_VARIABLE, and
481  * DUP_CLOEXEC.
482  *
483  * DUP_FCNTL is for handling EINVAL vs. EBADF differences between
484  * fcntl()'s F_DUPFD and F_DUPFD_CLOEXEC and dup2() (per POSIX).
485  * The next two flags are mutually exclusive, and the fourth is optional.
486  * DUP_FIXED tells kern_dup() to destructively dup over an existing file
487  * descriptor if "new" is already open.  DUP_VARIABLE tells kern_dup()
488  * to find the lowest unused file descriptor that is greater than or
489  * equal to "new".  DUP_CLOEXEC, which works with either of the first
490  * two flags, sets the close-on-exec flag on the "new" file descriptor.
491  *
492  * MPSAFE
493  */
494 int
495 kern_dup(int flags, int old, int new, int *res)
496 {
497         struct thread *td = curthread;
498         struct proc *p = td->td_proc;
499         struct filedesc *fdp = p->p_fd;
500         struct file *fp;
501         struct file *delfp;
502         int oldflags;
503         int holdleaders;
504         int dtsize;
505         int error, newfd;
506
507         /*
508          * Verify that we have a valid descriptor to dup from and
509          * possibly to dup to. When the new descriptor is out of
510          * bounds, fcntl()'s F_DUPFD and F_DUPFD_CLOEXEC must
511          * return EINVAL, while dup2() returns EBADF in
512          * this case.
513          *
514          * NOTE: maxfilesperuser is not applicable to dup()
515          */
516 retry:
517         if (p->p_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
518                 dtsize = INT_MAX;
519         else
520                 dtsize = (int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
521         if (dtsize > maxfilesperproc)
522                 dtsize = maxfilesperproc;
523         if (dtsize < minfilesperproc)
524                 dtsize = minfilesperproc;
525
526         if (new < 0 || new > dtsize)
527                 return (flags & DUP_FCNTL ? EINVAL : EBADF);
528
529         spin_lock(&fdp->fd_spin);
530         if ((unsigned)old >= fdp->fd_nfiles || fdp->fd_files[old].fp == NULL) {
531                 spin_unlock(&fdp->fd_spin);
532                 return (EBADF);
533         }
534         if ((flags & DUP_FIXED) && old == new) {
535                 *res = new;
536                 if (flags & DUP_CLOEXEC)
537                         fdp->fd_files[new].fileflags |= UF_EXCLOSE;
538                 spin_unlock(&fdp->fd_spin);
539                 return (0);
540         }
541         fp = fdp->fd_files[old].fp;
542         oldflags = fdp->fd_files[old].fileflags;
543         fhold(fp);      /* MPSAFE - can be called with a spinlock held */
544
545         /*
546          * Allocate a new descriptor if DUP_VARIABLE, or expand the table
547          * if the requested descriptor is beyond the current table size.
548          *
549          * This can block.  Retry if the source descriptor no longer matches
550          * or if our expectation in the expansion case races.
551          *
552          * If we are not expanding or allocating a new decriptor, then reset
553          * the target descriptor to a reserved state so we have a uniform
554          * setup for the next code block.
555          */
556         if ((flags & DUP_VARIABLE) || new >= fdp->fd_nfiles) {
557                 spin_unlock(&fdp->fd_spin);
558                 error = fdalloc(p, new, &newfd);
559                 spin_lock(&fdp->fd_spin);
560                 if (error) {
561                         spin_unlock(&fdp->fd_spin);
562                         fdrop(fp);
563                         return (error);
564                 }
565                 /*
566                  * Check for ripout
567                  */
568                 if (old >= fdp->fd_nfiles || fdp->fd_files[old].fp != fp) {
569                         fsetfd_locked(fdp, NULL, newfd);
570                         spin_unlock(&fdp->fd_spin);
571                         fdrop(fp);
572                         goto retry;
573                 }
574                 /*
575                  * Check for expansion race
576                  */
577                 if ((flags & DUP_VARIABLE) == 0 && new != newfd) {
578                         fsetfd_locked(fdp, NULL, newfd);
579                         spin_unlock(&fdp->fd_spin);
580                         fdrop(fp);
581                         goto retry;
582                 }
583                 /*
584                  * Check for ripout, newfd reused old (this case probably
585                  * can't occur).
586                  */
587                 if (old == newfd) {
588                         fsetfd_locked(fdp, NULL, newfd);
589                         spin_unlock(&fdp->fd_spin);
590                         fdrop(fp);
591                         goto retry;
592                 }
593                 new = newfd;
594                 delfp = NULL;
595         } else {
596                 if (fdp->fd_files[new].reserved) {
597                         spin_unlock(&fdp->fd_spin);
598                         fdrop(fp);
599                         kprintf("Warning: dup(): target descriptor %d is reserved, waiting for it to be resolved\n", new);
600                         tsleep(fdp, 0, "fdres", hz);
601                         goto retry;
602                 }
603
604                 /*
605                  * If the target descriptor was never allocated we have
606                  * to allocate it.  If it was we have to clean out the
607                  * old descriptor.  delfp inherits the ref from the 
608                  * descriptor table.
609                  */
610                 delfp = fdp->fd_files[new].fp;
611                 fdp->fd_files[new].fp = NULL;
612                 fdp->fd_files[new].reserved = 1;
613                 if (delfp == NULL) {
614                         fdreserve_locked(fdp, new, 1);
615                         if (new > fdp->fd_lastfile)
616                                 fdp->fd_lastfile = new;
617                 }
618
619         }
620
621         /*
622          * NOTE: still holding an exclusive spinlock
623          */
624
625         /*
626          * If a descriptor is being overwritten we may hve to tell 
627          * fdfree() to sleep to ensure that all relevant process
628          * leaders can be traversed in closef().
629          */
630         if (delfp != NULL && p->p_fdtol != NULL) {
631                 fdp->fd_holdleaderscount++;
632                 holdleaders = 1;
633         } else {
634                 holdleaders = 0;
635         }
636         KASSERT(delfp == NULL || (flags & DUP_FIXED),
637                 ("dup() picked an open file"));
638
639         /*
640          * Duplicate the source descriptor, update lastfile.  If the new
641          * descriptor was not allocated and we aren't replacing an existing
642          * descriptor we have to mark the descriptor as being in use.
643          *
644          * The fd_files[] array inherits fp's hold reference.
645          */
646         fsetfd_locked(fdp, fp, new);
647         if ((flags & DUP_CLOEXEC) != 0)
648                 fdp->fd_files[new].fileflags = oldflags | UF_EXCLOSE;
649         else
650                 fdp->fd_files[new].fileflags = oldflags & ~UF_EXCLOSE;
651         spin_unlock(&fdp->fd_spin);
652         fdrop(fp);
653         *res = new;
654
655         /*
656          * If we dup'd over a valid file, we now own the reference to it
657          * and must dispose of it using closef() semantics (as if a
658          * close() were performed on it).
659          */
660         if (delfp) {
661                 if (SLIST_FIRST(&delfp->f_klist))
662                         knote_fdclose(delfp, fdp, new);
663                 closef(delfp, p);
664                 if (holdleaders) {
665                         spin_lock(&fdp->fd_spin);
666                         fdp->fd_holdleaderscount--;
667                         if (fdp->fd_holdleaderscount == 0 &&
668                             fdp->fd_holdleaderswakeup != 0) {
669                                 fdp->fd_holdleaderswakeup = 0;
670                                 spin_unlock(&fdp->fd_spin);
671                                 wakeup(&fdp->fd_holdleaderscount);
672                         } else {
673                                 spin_unlock(&fdp->fd_spin);
674                         }
675                 }
676         }
677         return (0);
678 }
679
680 /*
681  * If sigio is on the list associated with a process or process group,
682  * disable signalling from the device, remove sigio from the list and
683  * free sigio.
684  *
685  * MPSAFE
686  */
687 void
688 funsetown(struct sigio **sigiop)
689 {
690         struct pgrp *pgrp;
691         struct proc *p;
692         struct sigio *sigio;
693
694         if ((sigio = *sigiop) != NULL) {
695                 lwkt_gettoken(&sigio_token);    /* protect sigio */
696                 KKASSERT(sigiop == sigio->sio_myref);
697                 sigio = *sigiop;
698                 *sigiop = NULL;
699                 lwkt_reltoken(&sigio_token);
700         }
701         if (sigio == NULL)
702                 return;
703
704         if (sigio->sio_pgid < 0) {
705                 pgrp = sigio->sio_pgrp;
706                 sigio->sio_pgrp = NULL;
707                 lwkt_gettoken(&pgrp->pg_token);
708                 SLIST_REMOVE(&pgrp->pg_sigiolst, sigio, sigio, sio_pgsigio);
709                 lwkt_reltoken(&pgrp->pg_token);
710                 pgrel(pgrp);
711         } else /* if ((*sigiop)->sio_pgid > 0) */ {
712                 p = sigio->sio_proc;
713                 sigio->sio_proc = NULL;
714                 PHOLD(p);
715                 lwkt_gettoken(&p->p_token);
716                 SLIST_REMOVE(&p->p_sigiolst, sigio, sigio, sio_pgsigio);
717                 lwkt_reltoken(&p->p_token);
718                 PRELE(p);
719         }
720         crfree(sigio->sio_ucred);
721         sigio->sio_ucred = NULL;
722         kfree(sigio, M_SIGIO);
723 }
724
725 /*
726  * Free a list of sigio structures.  Caller is responsible for ensuring
727  * that the list is MPSAFE.
728  *
729  * MPSAFE
730  */
731 void
732 funsetownlst(struct sigiolst *sigiolst)
733 {
734         struct sigio *sigio;
735
736         while ((sigio = SLIST_FIRST(sigiolst)) != NULL)
737                 funsetown(sigio->sio_myref);
738 }
739
740 /*
741  * This is common code for FIOSETOWN ioctl called by fcntl(fd, F_SETOWN, arg).
742  *
743  * After permission checking, add a sigio structure to the sigio list for
744  * the process or process group.
745  *
746  * MPSAFE
747  */
748 int
749 fsetown(pid_t pgid, struct sigio **sigiop)
750 {
751         struct proc *proc = NULL;
752         struct pgrp *pgrp = NULL;
753         struct sigio *sigio;
754         int error;
755
756         if (pgid == 0) {
757                 funsetown(sigiop);
758                 return (0);
759         }
760
761         if (pgid > 0) {
762                 proc = pfind(pgid);
763                 if (proc == NULL) {
764                         error = ESRCH;
765                         goto done;
766                 }
767
768                 /*
769                  * Policy - Don't allow a process to FSETOWN a process
770                  * in another session.
771                  *
772                  * Remove this test to allow maximum flexibility or
773                  * restrict FSETOWN to the current process or process
774                  * group for maximum safety.
775                  */
776                 if (proc->p_session != curproc->p_session) {
777                         error = EPERM;
778                         goto done;
779                 }
780         } else /* if (pgid < 0) */ {
781                 pgrp = pgfind(-pgid);
782                 if (pgrp == NULL) {
783                         error = ESRCH;
784                         goto done;
785                 }
786
787                 /*
788                  * Policy - Don't allow a process to FSETOWN a process
789                  * in another session.
790                  *
791                  * Remove this test to allow maximum flexibility or
792                  * restrict FSETOWN to the current process or process
793                  * group for maximum safety.
794                  */
795                 if (pgrp->pg_session != curproc->p_session) {
796                         error = EPERM;
797                         goto done;
798                 }
799         }
800         sigio = kmalloc(sizeof(struct sigio), M_SIGIO, M_WAITOK | M_ZERO);
801         if (pgid > 0) {
802                 KKASSERT(pgrp == NULL);
803                 lwkt_gettoken(&proc->p_token);
804                 SLIST_INSERT_HEAD(&proc->p_sigiolst, sigio, sio_pgsigio);
805                 sigio->sio_proc = proc;
806                 lwkt_reltoken(&proc->p_token);
807         } else {
808                 KKASSERT(proc == NULL);
809                 lwkt_gettoken(&pgrp->pg_token);
810                 SLIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
811                 sigio->sio_pgrp = pgrp;
812                 lwkt_reltoken(&pgrp->pg_token);
813                 pgrp = NULL;
814         }
815         sigio->sio_pgid = pgid;
816         sigio->sio_ucred = crhold(curthread->td_ucred);
817         /* It would be convenient if p_ruid was in ucred. */
818         sigio->sio_ruid = sigio->sio_ucred->cr_ruid;
819         sigio->sio_myref = sigiop;
820
821         lwkt_gettoken(&sigio_token);
822         while (*sigiop)
823                 funsetown(sigiop);
824         *sigiop = sigio;
825         lwkt_reltoken(&sigio_token);
826         error = 0;
827 done:
828         if (pgrp)
829                 pgrel(pgrp);
830         if (proc)
831                 PRELE(proc);
832         return (error);
833 }
834
835 /*
836  * This is common code for FIOGETOWN ioctl called by fcntl(fd, F_GETOWN, arg).
837  *
838  * MPSAFE
839  */
840 pid_t
841 fgetown(struct sigio **sigiop)
842 {
843         struct sigio *sigio;
844         pid_t own;
845
846         lwkt_gettoken_shared(&sigio_token);
847         sigio = *sigiop;
848         own = (sigio != NULL ? sigio->sio_pgid : 0);
849         lwkt_reltoken(&sigio_token);
850
851         return (own);
852 }
853
854 /*
855  * Close many file descriptors.
856  *
857  * MPSAFE
858  */
859 int
860 sys_closefrom(struct closefrom_args *uap)
861 {
862         return(kern_closefrom(uap->fd));
863 }
864
865 /*
866  * Close all file descriptors greater then or equal to fd
867  *
868  * MPSAFE
869  */
870 int
871 kern_closefrom(int fd)
872 {
873         struct thread *td = curthread;
874         struct proc *p = td->td_proc;
875         struct filedesc *fdp;
876
877         KKASSERT(p);
878         fdp = p->p_fd;
879
880         if (fd < 0)
881                 return (EINVAL);
882
883         /*
884          * NOTE: This function will skip unassociated descriptors and
885          * reserved descriptors that have not yet been assigned.  
886          * fd_lastfile can change as a side effect of kern_close().
887          */
888         spin_lock(&fdp->fd_spin);
889         while (fd <= fdp->fd_lastfile) {
890                 if (fdp->fd_files[fd].fp != NULL) {
891                         spin_unlock(&fdp->fd_spin);
892                         /* ok if this races another close */
893                         if (kern_close(fd) == EINTR)
894                                 return (EINTR);
895                         spin_lock(&fdp->fd_spin);
896                 }
897                 ++fd;
898         }
899         spin_unlock(&fdp->fd_spin);
900         return (0);
901 }
902
903 /*
904  * Close a file descriptor.
905  *
906  * MPSAFE
907  */
908 int
909 sys_close(struct close_args *uap)
910 {
911         return(kern_close(uap->fd));
912 }
913
914 /*
915  * MPSAFE
916  */
917 int
918 kern_close(int fd)
919 {
920         struct thread *td = curthread;
921         struct proc *p = td->td_proc;
922         struct filedesc *fdp;
923         struct file *fp;
924         int error;
925         int holdleaders;
926
927         KKASSERT(p);
928         fdp = p->p_fd;
929
930         spin_lock(&fdp->fd_spin);
931         if ((fp = funsetfd_locked(fdp, fd)) == NULL) {
932                 spin_unlock(&fdp->fd_spin);
933                 return (EBADF);
934         }
935         holdleaders = 0;
936         if (p->p_fdtol != NULL) {
937                 /*
938                  * Ask fdfree() to sleep to ensure that all relevant
939                  * process leaders can be traversed in closef().
940                  */
941                 fdp->fd_holdleaderscount++;
942                 holdleaders = 1;
943         }
944
945         /*
946          * we now hold the fp reference that used to be owned by the descriptor
947          * array.
948          */
949         spin_unlock(&fdp->fd_spin);
950         if (SLIST_FIRST(&fp->f_klist))
951                 knote_fdclose(fp, fdp, fd);
952         error = closef(fp, p);
953         if (holdleaders) {
954                 spin_lock(&fdp->fd_spin);
955                 fdp->fd_holdleaderscount--;
956                 if (fdp->fd_holdleaderscount == 0 &&
957                     fdp->fd_holdleaderswakeup != 0) {
958                         fdp->fd_holdleaderswakeup = 0;
959                         spin_unlock(&fdp->fd_spin);
960                         wakeup(&fdp->fd_holdleaderscount);
961                 } else {
962                         spin_unlock(&fdp->fd_spin);
963                 }
964         }
965         return (error);
966 }
967
968 /*
969  * shutdown_args(int fd, int how)
970  */
971 int
972 kern_shutdown(int fd, int how)
973 {
974         struct thread *td = curthread;
975         struct proc *p = td->td_proc;
976         struct file *fp;
977         int error;
978
979         KKASSERT(p);
980
981         if ((fp = holdfp(p->p_fd, fd, -1)) == NULL)
982                 return (EBADF);
983         error = fo_shutdown(fp, how);
984         fdrop(fp);
985
986         return (error);
987 }
988
989 /*
990  * MPALMOSTSAFE
991  */
992 int
993 sys_shutdown(struct shutdown_args *uap)
994 {
995         int error;
996
997         error = kern_shutdown(uap->s, uap->how);
998
999         return (error);
1000 }
1001
1002 /*
1003  * MPSAFE
1004  */
1005 int
1006 kern_fstat(int fd, struct stat *ub)
1007 {
1008         struct thread *td = curthread;
1009         struct proc *p = td->td_proc;
1010         struct file *fp;
1011         int error;
1012
1013         KKASSERT(p);
1014
1015         if ((fp = holdfp(p->p_fd, fd, -1)) == NULL)
1016                 return (EBADF);
1017         error = fo_stat(fp, ub, td->td_ucred);
1018         fdrop(fp);
1019
1020         return (error);
1021 }
1022
1023 /*
1024  * Return status information about a file descriptor.
1025  *
1026  * MPSAFE
1027  */
1028 int
1029 sys_fstat(struct fstat_args *uap)
1030 {
1031         struct stat st;
1032         int error;
1033
1034         error = kern_fstat(uap->fd, &st);
1035
1036         if (error == 0)
1037                 error = copyout(&st, uap->sb, sizeof(st));
1038         return (error);
1039 }
1040
1041 /*
1042  * Return pathconf information about a file descriptor.
1043  *
1044  * MPALMOSTSAFE
1045  */
1046 int
1047 sys_fpathconf(struct fpathconf_args *uap)
1048 {
1049         struct thread *td = curthread;
1050         struct proc *p = td->td_proc;
1051         struct file *fp;
1052         struct vnode *vp;
1053         int error = 0;
1054
1055         if ((fp = holdfp(p->p_fd, uap->fd, -1)) == NULL)
1056                 return (EBADF);
1057
1058         switch (fp->f_type) {
1059         case DTYPE_PIPE:
1060         case DTYPE_SOCKET:
1061                 if (uap->name != _PC_PIPE_BUF) {
1062                         error = EINVAL;
1063                 } else {
1064                         uap->sysmsg_result = PIPE_BUF;
1065                         error = 0;
1066                 }
1067                 break;
1068         case DTYPE_FIFO:
1069         case DTYPE_VNODE:
1070                 vp = (struct vnode *)fp->f_data;
1071                 error = VOP_PATHCONF(vp, uap->name, &uap->sysmsg_reg);
1072                 break;
1073         default:
1074                 error = EOPNOTSUPP;
1075                 break;
1076         }
1077         fdrop(fp);
1078         return(error);
1079 }
1080
1081 static int fdexpand;
1082 SYSCTL_INT(_debug, OID_AUTO, fdexpand, CTLFLAG_RD, &fdexpand, 0,
1083     "Number of times a file table has been expanded");
1084
1085 /*
1086  * Grow the file table so it can hold through descriptor (want).
1087  *
1088  * The fdp's spinlock must be held exclusively on entry and may be held
1089  * exclusively on return.  The spinlock may be cycled by the routine.
1090  *
1091  * MPSAFE
1092  */
1093 static void
1094 fdgrow_locked(struct filedesc *fdp, int want)
1095 {
1096         struct fdnode *newfiles;
1097         struct fdnode *oldfiles;
1098         int nf, extra;
1099
1100         nf = fdp->fd_nfiles;
1101         do {
1102                 /* nf has to be of the form 2^n - 1 */
1103                 nf = 2 * nf + 1;
1104         } while (nf <= want);
1105
1106         spin_unlock(&fdp->fd_spin);
1107         newfiles = kmalloc(nf * sizeof(struct fdnode), M_FILEDESC, M_WAITOK);
1108         spin_lock(&fdp->fd_spin);
1109
1110         /*
1111          * We could have raced another extend while we were not holding
1112          * the spinlock.
1113          */
1114         if (fdp->fd_nfiles >= nf) {
1115                 spin_unlock(&fdp->fd_spin);
1116                 kfree(newfiles, M_FILEDESC);
1117                 spin_lock(&fdp->fd_spin);
1118                 return;
1119         }
1120         /*
1121          * Copy the existing ofile and ofileflags arrays
1122          * and zero the new portion of each array.
1123          */
1124         extra = nf - fdp->fd_nfiles;
1125         bcopy(fdp->fd_files, newfiles, fdp->fd_nfiles * sizeof(struct fdnode));
1126         bzero(&newfiles[fdp->fd_nfiles], extra * sizeof(struct fdnode));
1127
1128         oldfiles = fdp->fd_files;
1129         fdp->fd_files = newfiles;
1130         fdp->fd_nfiles = nf;
1131
1132         if (oldfiles != fdp->fd_builtin_files) {
1133                 spin_unlock(&fdp->fd_spin);
1134                 kfree(oldfiles, M_FILEDESC);
1135                 spin_lock(&fdp->fd_spin);
1136         }
1137         fdexpand++;
1138 }
1139
1140 /*
1141  * Number of nodes in right subtree, including the root.
1142  */
1143 static __inline int
1144 right_subtree_size(int n)
1145 {
1146         return (n ^ (n | (n + 1)));
1147 }
1148
1149 /*
1150  * Bigger ancestor.
1151  */
1152 static __inline int
1153 right_ancestor(int n)
1154 {
1155         return (n | (n + 1));
1156 }
1157
1158 /*
1159  * Smaller ancestor.
1160  */
1161 static __inline int
1162 left_ancestor(int n)
1163 {
1164         return ((n & (n + 1)) - 1);
1165 }
1166
1167 /*
1168  * Traverse the in-place binary tree buttom-up adjusting the allocation
1169  * count so scans can determine where free descriptors are located.
1170  *
1171  * MPSAFE - caller must be holding an exclusive spinlock on fdp
1172  */
1173 static
1174 void
1175 fdreserve_locked(struct filedesc *fdp, int fd, int incr)
1176 {
1177         while (fd >= 0) {
1178                 fdp->fd_files[fd].allocated += incr;
1179                 KKASSERT(fdp->fd_files[fd].allocated >= 0);
1180                 fd = left_ancestor(fd);
1181         }
1182 }
1183
1184 /*
1185  * Reserve a file descriptor for the process.  If no error occurs, the
1186  * caller MUST at some point call fsetfd() or assign a file pointer
1187  * or dispose of the reservation.
1188  *
1189  * MPSAFE
1190  */
1191 int
1192 fdalloc(struct proc *p, int want, int *result)
1193 {
1194         struct filedesc *fdp = p->p_fd;
1195         struct uidinfo *uip;
1196         int fd, rsize, rsum, node, lim;
1197
1198         /*
1199          * Check dtable size limit
1200          */
1201         spin_lock(&p->p_limit->p_spin);
1202         if (p->p_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
1203                 lim = INT_MAX;
1204         else
1205                 lim = (int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
1206         spin_unlock(&p->p_limit->p_spin);
1207
1208         if (lim > maxfilesperproc)
1209                 lim = maxfilesperproc;
1210         if (lim < minfilesperproc)
1211                 lim = minfilesperproc;
1212         if (want >= lim)
1213                 return (EMFILE);
1214
1215         /*
1216          * Check that the user has not run out of descriptors (non-root only).
1217          * As a safety measure the dtable is allowed to have at least
1218          * minfilesperproc open fds regardless of the maxfilesperuser limit.
1219          */
1220         if (p->p_ucred->cr_uid && fdp->fd_nfiles >= minfilesperproc) {
1221                 uip = p->p_ucred->cr_uidinfo;
1222                 if (uip->ui_openfiles > maxfilesperuser) {
1223                         krateprintf(&krate_uidinfo,
1224                                     "Warning: user %d pid %d (%s) ran out of "
1225                                     "file descriptors (%d/%d)\n",
1226                                     p->p_ucred->cr_uid, (int)p->p_pid,
1227                                     p->p_comm,
1228                                     uip->ui_openfiles, maxfilesperuser);
1229                         return(ENFILE);
1230                 }
1231         }
1232
1233         /*
1234          * Grow the dtable if necessary
1235          */
1236         spin_lock(&fdp->fd_spin);
1237         if (want >= fdp->fd_nfiles)
1238                 fdgrow_locked(fdp, want);
1239
1240         /*
1241          * Search for a free descriptor starting at the higher
1242          * of want or fd_freefile.  If that fails, consider
1243          * expanding the ofile array.
1244          *
1245          * NOTE! the 'allocated' field is a cumulative recursive allocation
1246          * count.  If we happen to see a value of 0 then we can shortcut
1247          * our search.  Otherwise we run through through the tree going
1248          * down branches we know have free descriptor(s) until we hit a
1249          * leaf node.  The leaf node will be free but will not necessarily
1250          * have an allocated field of 0.
1251          */
1252 retry:
1253         /* move up the tree looking for a subtree with a free node */
1254         for (fd = max(want, fdp->fd_freefile); fd < min(fdp->fd_nfiles, lim);
1255              fd = right_ancestor(fd)) {
1256                 if (fdp->fd_files[fd].allocated == 0)
1257                         goto found;
1258
1259                 rsize = right_subtree_size(fd);
1260                 if (fdp->fd_files[fd].allocated == rsize)
1261                         continue;       /* right subtree full */
1262
1263                 /*
1264                  * Free fd is in the right subtree of the tree rooted at fd.
1265                  * Call that subtree R.  Look for the smallest (leftmost)
1266                  * subtree of R with an unallocated fd: continue moving
1267                  * down the left branch until encountering a full left
1268                  * subtree, then move to the right.
1269                  */
1270                 for (rsum = 0, rsize /= 2; rsize > 0; rsize /= 2) {
1271                         node = fd + rsize;
1272                         rsum += fdp->fd_files[node].allocated;
1273                         if (fdp->fd_files[fd].allocated == rsum + rsize) {
1274                                 fd = node;      /* move to the right */
1275                                 if (fdp->fd_files[node].allocated == 0)
1276                                         goto found;
1277                                 rsum = 0;
1278                         }
1279                 }
1280                 goto found;
1281         }
1282
1283         /*
1284          * No space in current array.  Expand?
1285          */
1286         if (fdp->fd_nfiles >= lim) {
1287                 spin_unlock(&fdp->fd_spin);
1288                 return (EMFILE);
1289         }
1290         fdgrow_locked(fdp, want);
1291         goto retry;
1292
1293 found:
1294         KKASSERT(fd < fdp->fd_nfiles);
1295         if (fd > fdp->fd_lastfile)
1296                 fdp->fd_lastfile = fd;
1297         if (want <= fdp->fd_freefile)
1298                 fdp->fd_freefile = fd;
1299         *result = fd;
1300         KKASSERT(fdp->fd_files[fd].fp == NULL);
1301         KKASSERT(fdp->fd_files[fd].reserved == 0);
1302         fdp->fd_files[fd].fileflags = 0;
1303         fdp->fd_files[fd].reserved = 1;
1304         fdreserve_locked(fdp, fd, 1);
1305         spin_unlock(&fdp->fd_spin);
1306         return (0);
1307 }
1308
1309 /*
1310  * Check to see whether n user file descriptors
1311  * are available to the process p.
1312  *
1313  * MPSAFE
1314  */
1315 int
1316 fdavail(struct proc *p, int n)
1317 {
1318         struct filedesc *fdp = p->p_fd;
1319         struct fdnode *fdnode;
1320         int i, lim, last;
1321
1322         spin_lock(&p->p_limit->p_spin);
1323         if (p->p_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
1324                 lim = INT_MAX;
1325         else
1326                 lim = (int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
1327         spin_unlock(&p->p_limit->p_spin);
1328
1329         if (lim > maxfilesperproc)
1330                 lim = maxfilesperproc;
1331         if (lim < minfilesperproc)
1332                 lim = minfilesperproc;
1333
1334         spin_lock(&fdp->fd_spin);
1335         if ((i = lim - fdp->fd_nfiles) > 0 && (n -= i) <= 0) {
1336                 spin_unlock(&fdp->fd_spin);
1337                 return (1);
1338         }
1339         last = min(fdp->fd_nfiles, lim);
1340         fdnode = &fdp->fd_files[fdp->fd_freefile];
1341         for (i = last - fdp->fd_freefile; --i >= 0; ++fdnode) {
1342                 if (fdnode->fp == NULL && --n <= 0) {
1343                         spin_unlock(&fdp->fd_spin);
1344                         return (1);
1345                 }
1346         }
1347         spin_unlock(&fdp->fd_spin);
1348         return (0);
1349 }
1350
1351 /*
1352  * Revoke open descriptors referencing (f_data, f_type)
1353  *
1354  * Any revoke executed within a prison is only able to
1355  * revoke descriptors for processes within that prison.
1356  *
1357  * Returns 0 on success or an error code.
1358  */
1359 struct fdrevoke_info {
1360         void *data;
1361         short type;
1362         short unused;
1363         int count;
1364         int intransit;
1365         struct ucred *cred;
1366         struct file *nfp;
1367 };
1368
1369 static int fdrevoke_check_callback(struct file *fp, void *vinfo);
1370 static int fdrevoke_proc_callback(struct proc *p, void *vinfo);
1371
1372 int
1373 fdrevoke(void *f_data, short f_type, struct ucred *cred)
1374 {
1375         struct fdrevoke_info info;
1376         int error;
1377
1378         bzero(&info, sizeof(info));
1379         info.data = f_data;
1380         info.type = f_type;
1381         info.cred = cred;
1382         error = falloc(NULL, &info.nfp, NULL);
1383         if (error)
1384                 return (error);
1385
1386         /*
1387          * Scan the file pointer table once.  dups do not dup file pointers,
1388          * only descriptors, so there is no leak.  Set FREVOKED on the fps
1389          * being revoked.
1390          */
1391         allfiles_scan_exclusive(fdrevoke_check_callback, &info);
1392
1393         /*
1394          * If any fps were marked track down the related descriptors
1395          * and close them.  Any dup()s at this point will notice
1396          * the FREVOKED already set in the fp and do the right thing.
1397          *
1398          * Any fps with non-zero msgcounts (aka sent over a unix-domain
1399          * socket) bumped the intransit counter and will require a
1400          * scan.  Races against fps leaving the socket are closed by
1401          * the socket code checking for FREVOKED.
1402          */
1403         if (info.count)
1404                 allproc_scan(fdrevoke_proc_callback, &info);
1405         if (info.intransit)
1406                 unp_revoke_gc(info.nfp);
1407         fdrop(info.nfp);
1408         return(0);
1409 }
1410
1411 /*
1412  * Locate matching file pointers directly.
1413  *
1414  * WARNING: allfiles_scan_exclusive() holds a spinlock through these calls!
1415  */
1416 static int
1417 fdrevoke_check_callback(struct file *fp, void *vinfo)
1418 {
1419         struct fdrevoke_info *info = vinfo;
1420
1421         /*
1422          * File pointers already flagged for revokation are skipped.
1423          */
1424         if (fp->f_flag & FREVOKED)
1425                 return(0);
1426
1427         /*
1428          * If revoking from a prison file pointers created outside of
1429          * that prison, or file pointers without creds, cannot be revoked.
1430          */
1431         if (info->cred->cr_prison &&
1432             (fp->f_cred == NULL ||
1433              info->cred->cr_prison != fp->f_cred->cr_prison)) {
1434                 return(0);
1435         }
1436
1437         /*
1438          * If the file pointer matches then mark it for revocation.  The
1439          * flag is currently only used by unp_revoke_gc().
1440          *
1441          * info->count is a heuristic and can race in a SMP environment.
1442          */
1443         if (info->data == fp->f_data && info->type == fp->f_type) {
1444                 atomic_set_int(&fp->f_flag, FREVOKED);
1445                 info->count += fp->f_count;
1446                 if (fp->f_msgcount)
1447                         ++info->intransit;
1448         }
1449         return(0);
1450 }
1451
1452 /*
1453  * Locate matching file pointers via process descriptor tables.
1454  */
1455 static int
1456 fdrevoke_proc_callback(struct proc *p, void *vinfo)
1457 {
1458         struct fdrevoke_info *info = vinfo;
1459         struct filedesc *fdp;
1460         struct file *fp;
1461         int n;
1462
1463         if (p->p_stat == SIDL || p->p_stat == SZOMB)
1464                 return(0);
1465         if (info->cred->cr_prison &&
1466             info->cred->cr_prison != p->p_ucred->cr_prison) {
1467                 return(0);
1468         }
1469
1470         /*
1471          * If the controlling terminal of the process matches the
1472          * vnode being revoked we clear the controlling terminal.
1473          *
1474          * The normal spec_close() may not catch this because it
1475          * uses curproc instead of p.
1476          */
1477         if (p->p_session && info->type == DTYPE_VNODE &&
1478             info->data == p->p_session->s_ttyvp) {
1479                 p->p_session->s_ttyvp = NULL;
1480                 vrele(info->data);
1481         }
1482
1483         /*
1484          * Softref the fdp to prevent it from being destroyed
1485          */
1486         spin_lock(&p->p_spin);
1487         if ((fdp = p->p_fd) == NULL) {
1488                 spin_unlock(&p->p_spin);
1489                 return(0);
1490         }
1491         atomic_add_int(&fdp->fd_softrefs, 1);
1492         spin_unlock(&p->p_spin);
1493
1494         /*
1495          * Locate and close any matching file descriptors.
1496          */
1497         spin_lock(&fdp->fd_spin);
1498         for (n = 0; n < fdp->fd_nfiles; ++n) {
1499                 if ((fp = fdp->fd_files[n].fp) == NULL)
1500                         continue;
1501                 if (fp->f_flag & FREVOKED) {
1502                         fhold(info->nfp);
1503                         fdp->fd_files[n].fp = info->nfp;
1504                         spin_unlock(&fdp->fd_spin);
1505                         knote_fdclose(fp, fdp, n);      /* XXX */
1506                         closef(fp, p);
1507                         spin_lock(&fdp->fd_spin);
1508                         --info->count;
1509                 }
1510         }
1511         spin_unlock(&fdp->fd_spin);
1512         atomic_subtract_int(&fdp->fd_softrefs, 1);
1513         return(0);
1514 }
1515
1516 /*
1517  * falloc:
1518  *      Create a new open file structure and reserve a file decriptor
1519  *      for the process that refers to it.
1520  *
1521  *      Root creds are checked using lp, or assumed if lp is NULL.  If
1522  *      resultfd is non-NULL then lp must also be non-NULL.  No file
1523  *      descriptor is reserved (and no process context is needed) if
1524  *      resultfd is NULL.
1525  *
1526  *      A file pointer with a refcount of 1 is returned.  Note that the
1527  *      file pointer is NOT associated with the descriptor.  If falloc
1528  *      returns success, fsetfd() MUST be called to either associate the
1529  *      file pointer or clear the reservation.
1530  *
1531  * MPSAFE
1532  */
1533 int
1534 falloc(struct lwp *lp, struct file **resultfp, int *resultfd)
1535 {
1536         static struct timeval lastfail;
1537         static int curfail;
1538         struct file *fp;
1539         struct ucred *cred = lp ? lp->lwp_thread->td_ucred : proc0.p_ucred;
1540         int error;
1541
1542         fp = NULL;
1543
1544         /*
1545          * Handle filetable full issues and root overfill.
1546          */
1547         if (nfiles >= maxfiles - maxfilesrootres &&
1548             (cred->cr_ruid != 0 || nfiles >= maxfiles)) {
1549                 if (ppsratecheck(&lastfail, &curfail, 1)) {
1550                         kprintf("kern.maxfiles limit exceeded by uid %d, "
1551                                 "please see tuning(7).\n",
1552                                 cred->cr_ruid);
1553                 }
1554                 error = ENFILE;
1555                 goto done;
1556         }
1557
1558         /*
1559          * Allocate a new file descriptor.
1560          */
1561         fp = kmalloc(sizeof(struct file), M_FILE, M_WAITOK | M_ZERO);
1562         spin_init(&fp->f_spin);
1563         SLIST_INIT(&fp->f_klist);
1564         fp->f_count = 1;
1565         fp->f_ops = &badfileops;
1566         fp->f_seqcount = 1;
1567         fsetcred(fp, cred);
1568         spin_lock(&filehead_spin);
1569         nfiles++;
1570         LIST_INSERT_HEAD(&filehead, fp, f_list);
1571         spin_unlock(&filehead_spin);
1572         if (resultfd) {
1573                 if ((error = fdalloc(lp->lwp_proc, 0, resultfd)) != 0) {
1574                         fdrop(fp);
1575                         fp = NULL;
1576                 }
1577         } else {
1578                 error = 0;
1579         }
1580 done:
1581         *resultfp = fp;
1582         return (error);
1583 }
1584
1585 /*
1586  * Check for races against a file descriptor by determining that the
1587  * file pointer is still associated with the specified file descriptor,
1588  * and a close is not currently in progress.
1589  *
1590  * MPSAFE
1591  */
1592 int
1593 checkfdclosed(struct filedesc *fdp, int fd, struct file *fp)
1594 {
1595         int error;
1596
1597         spin_lock_shared(&fdp->fd_spin);
1598         if ((unsigned)fd >= fdp->fd_nfiles || fp != fdp->fd_files[fd].fp)
1599                 error = EBADF;
1600         else
1601                 error = 0;
1602         spin_unlock_shared(&fdp->fd_spin);
1603         return (error);
1604 }
1605
1606 /*
1607  * Associate a file pointer with a previously reserved file descriptor.
1608  * This function always succeeds.
1609  *
1610  * If fp is NULL, the file descriptor is returned to the pool.
1611  */
1612
1613 /*
1614  * MPSAFE (exclusive spinlock must be held on call)
1615  */
1616 static void
1617 fsetfd_locked(struct filedesc *fdp, struct file *fp, int fd)
1618 {
1619         KKASSERT((unsigned)fd < fdp->fd_nfiles);
1620         KKASSERT(fdp->fd_files[fd].reserved != 0);
1621         if (fp) {
1622                 fhold(fp);
1623                 fdp->fd_files[fd].fp = fp;
1624                 fdp->fd_files[fd].reserved = 0;
1625         } else {
1626                 fdp->fd_files[fd].reserved = 0;
1627                 fdreserve_locked(fdp, fd, -1);
1628                 fdfixup_locked(fdp, fd);
1629         }
1630 }
1631
1632 /*
1633  * MPSAFE
1634  */
1635 void
1636 fsetfd(struct filedesc *fdp, struct file *fp, int fd)
1637 {
1638         spin_lock(&fdp->fd_spin);
1639         fsetfd_locked(fdp, fp, fd);
1640         spin_unlock(&fdp->fd_spin);
1641 }
1642
1643 /*
1644  * MPSAFE (exclusive spinlock must be held on call)
1645  */
1646 static 
1647 struct file *
1648 funsetfd_locked(struct filedesc *fdp, int fd)
1649 {
1650         struct file *fp;
1651
1652         if ((unsigned)fd >= fdp->fd_nfiles)
1653                 return (NULL);
1654         if ((fp = fdp->fd_files[fd].fp) == NULL)
1655                 return (NULL);
1656         fdp->fd_files[fd].fp = NULL;
1657         fdp->fd_files[fd].fileflags = 0;
1658
1659         fdreserve_locked(fdp, fd, -1);
1660         fdfixup_locked(fdp, fd);
1661         return(fp);
1662 }
1663
1664 /*
1665  * MPSAFE
1666  */
1667 int
1668 fgetfdflags(struct filedesc *fdp, int fd, int *flagsp)
1669 {
1670         int error;
1671
1672         spin_lock(&fdp->fd_spin);
1673         if (((u_int)fd) >= fdp->fd_nfiles) {
1674                 error = EBADF;
1675         } else if (fdp->fd_files[fd].fp == NULL) {
1676                 error = EBADF;
1677         } else {
1678                 *flagsp = fdp->fd_files[fd].fileflags;
1679                 error = 0;
1680         }
1681         spin_unlock(&fdp->fd_spin);
1682         return (error);
1683 }
1684
1685 /*
1686  * MPSAFE
1687  */
1688 int
1689 fsetfdflags(struct filedesc *fdp, int fd, int add_flags)
1690 {
1691         int error;
1692
1693         spin_lock(&fdp->fd_spin);
1694         if (((u_int)fd) >= fdp->fd_nfiles) {
1695                 error = EBADF;
1696         } else if (fdp->fd_files[fd].fp == NULL) {
1697                 error = EBADF;
1698         } else {
1699                 fdp->fd_files[fd].fileflags |= add_flags;
1700                 error = 0;
1701         }
1702         spin_unlock(&fdp->fd_spin);
1703         return (error);
1704 }
1705
1706 /*
1707  * MPSAFE
1708  */
1709 int
1710 fclrfdflags(struct filedesc *fdp, int fd, int rem_flags)
1711 {
1712         int error;
1713
1714         spin_lock(&fdp->fd_spin);
1715         if (((u_int)fd) >= fdp->fd_nfiles) {
1716                 error = EBADF;
1717         } else if (fdp->fd_files[fd].fp == NULL) {
1718                 error = EBADF;
1719         } else {
1720                 fdp->fd_files[fd].fileflags &= ~rem_flags;
1721                 error = 0;
1722         }
1723         spin_unlock(&fdp->fd_spin);
1724         return (error);
1725 }
1726
1727 /*
1728  * Set/Change/Clear the creds for a fp and synchronize the uidinfo.
1729  */
1730 void
1731 fsetcred(struct file *fp, struct ucred *ncr)
1732 {
1733         struct ucred *ocr;
1734         struct uidinfo *uip;
1735
1736         ocr = fp->f_cred;
1737         if (ocr == NULL || ncr == NULL || ocr->cr_uidinfo != ncr->cr_uidinfo) {
1738                 if (ocr) {
1739                         uip = ocr->cr_uidinfo;
1740                         atomic_add_int(&uip->ui_openfiles, -1);
1741                 }
1742                 if (ncr) {
1743                         uip = ncr->cr_uidinfo;
1744                         atomic_add_int(&uip->ui_openfiles, 1);
1745                 }
1746         }
1747         if (ncr)
1748                 crhold(ncr);
1749         fp->f_cred = ncr;
1750         if (ocr)
1751                 crfree(ocr);
1752 }
1753
1754 /*
1755  * Free a file descriptor.
1756  */
1757 static
1758 void
1759 ffree(struct file *fp)
1760 {
1761         KASSERT((fp->f_count == 0), ("ffree: fp_fcount not 0!"));
1762         spin_lock(&filehead_spin);
1763         LIST_REMOVE(fp, f_list);
1764         nfiles--;
1765         spin_unlock(&filehead_spin);
1766         fsetcred(fp, NULL);
1767         if (fp->f_nchandle.ncp)
1768             cache_drop(&fp->f_nchandle);
1769         kfree(fp, M_FILE);
1770 }
1771
1772 /*
1773  * called from init_main, initialize filedesc0 for proc0.
1774  */
1775 void
1776 fdinit_bootstrap(struct proc *p0, struct filedesc *fdp0, int cmask)
1777 {
1778         p0->p_fd = fdp0;
1779         p0->p_fdtol = NULL;
1780         fdp0->fd_refcnt = 1;
1781         fdp0->fd_cmask = cmask;
1782         fdp0->fd_files = fdp0->fd_builtin_files;
1783         fdp0->fd_nfiles = NDFILE;
1784         fdp0->fd_lastfile = -1;
1785         spin_init(&fdp0->fd_spin);
1786 }
1787
1788 /*
1789  * Build a new filedesc structure.
1790  *
1791  * NOT MPSAFE (vref)
1792  */
1793 struct filedesc *
1794 fdinit(struct proc *p)
1795 {
1796         struct filedesc *newfdp;
1797         struct filedesc *fdp = p->p_fd;
1798
1799         newfdp = kmalloc(sizeof(struct filedesc), M_FILEDESC, M_WAITOK|M_ZERO);
1800         spin_lock(&fdp->fd_spin);
1801         if (fdp->fd_cdir) {
1802                 newfdp->fd_cdir = fdp->fd_cdir;
1803                 vref(newfdp->fd_cdir);
1804                 cache_copy(&fdp->fd_ncdir, &newfdp->fd_ncdir);
1805         }
1806
1807         /*
1808          * rdir may not be set in e.g. proc0 or anything vm_fork'd off of
1809          * proc0, but should unconditionally exist in other processes.
1810          */
1811         if (fdp->fd_rdir) {
1812                 newfdp->fd_rdir = fdp->fd_rdir;
1813                 vref(newfdp->fd_rdir);
1814                 cache_copy(&fdp->fd_nrdir, &newfdp->fd_nrdir);
1815         }
1816         if (fdp->fd_jdir) {
1817                 newfdp->fd_jdir = fdp->fd_jdir;
1818                 vref(newfdp->fd_jdir);
1819                 cache_copy(&fdp->fd_njdir, &newfdp->fd_njdir);
1820         }
1821         spin_unlock(&fdp->fd_spin);
1822
1823         /* Create the file descriptor table. */
1824         newfdp->fd_refcnt = 1;
1825         newfdp->fd_cmask = cmask;
1826         newfdp->fd_files = newfdp->fd_builtin_files;
1827         newfdp->fd_nfiles = NDFILE;
1828         newfdp->fd_lastfile = -1;
1829         spin_init(&newfdp->fd_spin);
1830
1831         return (newfdp);
1832 }
1833
1834 /*
1835  * Share a filedesc structure.
1836  *
1837  * MPSAFE
1838  */
1839 struct filedesc *
1840 fdshare(struct proc *p)
1841 {
1842         struct filedesc *fdp;
1843
1844         fdp = p->p_fd;
1845         spin_lock(&fdp->fd_spin);
1846         fdp->fd_refcnt++;
1847         spin_unlock(&fdp->fd_spin);
1848         return (fdp);
1849 }
1850
1851 /*
1852  * Copy a filedesc structure.
1853  *
1854  * MPSAFE
1855  */
1856 int
1857 fdcopy(struct proc *p, struct filedesc **fpp)
1858 {
1859         struct filedesc *fdp = p->p_fd;
1860         struct filedesc *newfdp;
1861         struct fdnode *fdnode;
1862         int i;
1863         int ni;
1864
1865         /*
1866          * Certain daemons might not have file descriptors. 
1867          */
1868         if (fdp == NULL)
1869                 return (0);
1870
1871         /*
1872          * Allocate the new filedesc and fd_files[] array.  This can race
1873          * with operations by other threads on the fdp so we have to be
1874          * careful.
1875          */
1876         newfdp = kmalloc(sizeof(struct filedesc), 
1877                          M_FILEDESC, M_WAITOK | M_ZERO | M_NULLOK);
1878         if (newfdp == NULL) {
1879                 *fpp = NULL;
1880                 return (-1);
1881         }
1882 again:
1883         spin_lock(&fdp->fd_spin);
1884         if (fdp->fd_lastfile < NDFILE) {
1885                 newfdp->fd_files = newfdp->fd_builtin_files;
1886                 i = NDFILE;
1887         } else {
1888                 /*
1889                  * We have to allocate (N^2-1) entries for our in-place
1890                  * binary tree.  Allow the table to shrink.
1891                  */
1892                 i = fdp->fd_nfiles;
1893                 ni = (i - 1) / 2;
1894                 while (ni > fdp->fd_lastfile && ni > NDFILE) {
1895                         i = ni;
1896                         ni = (i - 1) / 2;
1897                 }
1898                 spin_unlock(&fdp->fd_spin);
1899                 newfdp->fd_files = kmalloc(i * sizeof(struct fdnode),
1900                                           M_FILEDESC, M_WAITOK | M_ZERO);
1901
1902                 /*
1903                  * Check for race, retry
1904                  */
1905                 spin_lock(&fdp->fd_spin);
1906                 if (i <= fdp->fd_lastfile) {
1907                         spin_unlock(&fdp->fd_spin);
1908                         kfree(newfdp->fd_files, M_FILEDESC);
1909                         goto again;
1910                 }
1911         }
1912
1913         /*
1914          * Dup the remaining fields. vref() and cache_hold() can be
1915          * safely called while holding the read spinlock on fdp.
1916          *
1917          * The read spinlock on fdp is still being held.
1918          *
1919          * NOTE: vref and cache_hold calls for the case where the vnode
1920          * or cache entry already has at least one ref may be called
1921          * while holding spin locks.
1922          */
1923         if ((newfdp->fd_cdir = fdp->fd_cdir) != NULL) {
1924                 vref(newfdp->fd_cdir);
1925                 cache_copy(&fdp->fd_ncdir, &newfdp->fd_ncdir);
1926         }
1927         /*
1928          * We must check for fd_rdir here, at least for now because
1929          * the init process is created before we have access to the
1930          * rootvode to take a reference to it.
1931          */
1932         if ((newfdp->fd_rdir = fdp->fd_rdir) != NULL) {
1933                 vref(newfdp->fd_rdir);
1934                 cache_copy(&fdp->fd_nrdir, &newfdp->fd_nrdir);
1935         }
1936         if ((newfdp->fd_jdir = fdp->fd_jdir) != NULL) {
1937                 vref(newfdp->fd_jdir);
1938                 cache_copy(&fdp->fd_njdir, &newfdp->fd_njdir);
1939         }
1940         newfdp->fd_refcnt = 1;
1941         newfdp->fd_nfiles = i;
1942         newfdp->fd_lastfile = fdp->fd_lastfile;
1943         newfdp->fd_freefile = fdp->fd_freefile;
1944         newfdp->fd_cmask = fdp->fd_cmask;
1945         spin_init(&newfdp->fd_spin);
1946
1947         /*
1948          * Copy the descriptor table through (i).  This also copies the
1949          * allocation state.   Then go through and ref the file pointers
1950          * and clean up any KQ descriptors.
1951          *
1952          * kq descriptors cannot be copied.  Since we haven't ref'd the
1953          * copied files yet we can ignore the return value from funsetfd().
1954          *
1955          * The read spinlock on fdp is still being held.
1956          */
1957         bcopy(fdp->fd_files, newfdp->fd_files, i * sizeof(struct fdnode));
1958         for (i = 0 ; i < newfdp->fd_nfiles; ++i) {
1959                 fdnode = &newfdp->fd_files[i];
1960                 if (fdnode->reserved) {
1961                         fdreserve_locked(newfdp, i, -1);
1962                         fdnode->reserved = 0;
1963                         fdfixup_locked(newfdp, i);
1964                 } else if (fdnode->fp) {
1965                         if (fdnode->fp->f_type == DTYPE_KQUEUE) {
1966                                 (void)funsetfd_locked(newfdp, i);
1967                         } else {
1968                                 fhold(fdnode->fp);
1969                         }
1970                 }
1971         }
1972         spin_unlock(&fdp->fd_spin);
1973         *fpp = newfdp;
1974         return (0);
1975 }
1976
1977 /*
1978  * Release a filedesc structure.
1979  *
1980  * NOT MPSAFE (MPSAFE for refs > 1, but the final cleanup code is not MPSAFE)
1981  */
1982 void
1983 fdfree(struct proc *p, struct filedesc *repl)
1984 {
1985         struct filedesc *fdp;
1986         struct fdnode *fdnode;
1987         int i;
1988         struct filedesc_to_leader *fdtol;
1989         struct file *fp;
1990         struct vnode *vp;
1991         struct flock lf;
1992
1993         /*
1994          * Certain daemons might not have file descriptors.
1995          */
1996         fdp = p->p_fd;
1997         if (fdp == NULL) {
1998                 p->p_fd = repl;
1999                 return;
2000         }
2001
2002         /*
2003          * Severe messing around to follow.
2004          */
2005         spin_lock(&fdp->fd_spin);
2006
2007         /* Check for special need to clear POSIX style locks */
2008         fdtol = p->p_fdtol;
2009         if (fdtol != NULL) {
2010                 KASSERT(fdtol->fdl_refcount > 0,
2011                         ("filedesc_to_refcount botch: fdl_refcount=%d",
2012                          fdtol->fdl_refcount));
2013                 if (fdtol->fdl_refcount == 1 &&
2014                     (p->p_leader->p_flags & P_ADVLOCK) != 0) {
2015                         for (i = 0; i <= fdp->fd_lastfile; ++i) {
2016                                 fdnode = &fdp->fd_files[i];
2017                                 if (fdnode->fp == NULL ||
2018                                     fdnode->fp->f_type != DTYPE_VNODE) {
2019                                         continue;
2020                                 }
2021                                 fp = fdnode->fp;
2022                                 fhold(fp);
2023                                 spin_unlock(&fdp->fd_spin);
2024
2025                                 lf.l_whence = SEEK_SET;
2026                                 lf.l_start = 0;
2027                                 lf.l_len = 0;
2028                                 lf.l_type = F_UNLCK;
2029                                 vp = (struct vnode *)fp->f_data;
2030                                 (void) VOP_ADVLOCK(vp,
2031                                                    (caddr_t)p->p_leader,
2032                                                    F_UNLCK,
2033                                                    &lf,
2034                                                    F_POSIX);
2035                                 fdrop(fp);
2036                                 spin_lock(&fdp->fd_spin);
2037                         }
2038                 }
2039         retry:
2040                 if (fdtol->fdl_refcount == 1) {
2041                         if (fdp->fd_holdleaderscount > 0 &&
2042                             (p->p_leader->p_flags & P_ADVLOCK) != 0) {
2043                                 /*
2044                                  * close() or do_dup() has cleared a reference
2045                                  * in a shared file descriptor table.
2046                                  */
2047                                 fdp->fd_holdleaderswakeup = 1;
2048                                 ssleep(&fdp->fd_holdleaderscount,
2049                                        &fdp->fd_spin, 0, "fdlhold", 0);
2050                                 goto retry;
2051                         }
2052                         if (fdtol->fdl_holdcount > 0) {
2053                                 /* 
2054                                  * Ensure that fdtol->fdl_leader
2055                                  * remains valid in closef().
2056                                  */
2057                                 fdtol->fdl_wakeup = 1;
2058                                 ssleep(fdtol, &fdp->fd_spin, 0, "fdlhold", 0);
2059                                 goto retry;
2060                         }
2061                 }
2062                 fdtol->fdl_refcount--;
2063                 if (fdtol->fdl_refcount == 0 &&
2064                     fdtol->fdl_holdcount == 0) {
2065                         fdtol->fdl_next->fdl_prev = fdtol->fdl_prev;
2066                         fdtol->fdl_prev->fdl_next = fdtol->fdl_next;
2067                 } else {
2068                         fdtol = NULL;
2069                 }
2070                 p->p_fdtol = NULL;
2071                 if (fdtol != NULL) {
2072                         spin_unlock(&fdp->fd_spin);
2073                         kfree(fdtol, M_FILEDESC_TO_LEADER);
2074                         spin_lock(&fdp->fd_spin);
2075                 }
2076         }
2077         if (--fdp->fd_refcnt > 0) {
2078                 spin_unlock(&fdp->fd_spin);
2079                 spin_lock(&p->p_spin);
2080                 p->p_fd = repl;
2081                 spin_unlock(&p->p_spin);
2082                 return;
2083         }
2084
2085         /*
2086          * Even though we are the last reference to the structure allproc
2087          * scans may still reference the structure.  Maintain proper
2088          * locks until we can replace p->p_fd.
2089          *
2090          * Also note that kqueue's closef still needs to reference the
2091          * fdp via p->p_fd, so we have to close the descriptors before
2092          * we replace p->p_fd.
2093          */
2094         for (i = 0; i <= fdp->fd_lastfile; ++i) {
2095                 if (fdp->fd_files[i].fp) {
2096                         fp = funsetfd_locked(fdp, i);
2097                         if (fp) {
2098                                 spin_unlock(&fdp->fd_spin);
2099                                 if (SLIST_FIRST(&fp->f_klist))
2100                                         knote_fdclose(fp, fdp, i);
2101                                 closef(fp, p);
2102                                 spin_lock(&fdp->fd_spin);
2103                         }
2104                 }
2105         }
2106         spin_unlock(&fdp->fd_spin);
2107
2108         /*
2109          * Interlock against an allproc scan operations (typically frevoke).
2110          */
2111         spin_lock(&p->p_spin);
2112         p->p_fd = repl;
2113         spin_unlock(&p->p_spin);
2114
2115         /*
2116          * Wait for any softrefs to go away.  This race rarely occurs so
2117          * we can use a non-critical-path style poll/sleep loop.  The
2118          * race only occurs against allproc scans.
2119          *
2120          * No new softrefs can occur with the fdp disconnected from the
2121          * process.
2122          */
2123         if (fdp->fd_softrefs) {
2124                 kprintf("pid %d: Warning, fdp race avoided\n", p->p_pid);
2125                 while (fdp->fd_softrefs)
2126                         tsleep(&fdp->fd_softrefs, 0, "fdsoft", 1);
2127         }
2128
2129         if (fdp->fd_files != fdp->fd_builtin_files)
2130                 kfree(fdp->fd_files, M_FILEDESC);
2131         if (fdp->fd_cdir) {
2132                 cache_drop(&fdp->fd_ncdir);
2133                 vrele(fdp->fd_cdir);
2134         }
2135         if (fdp->fd_rdir) {
2136                 cache_drop(&fdp->fd_nrdir);
2137                 vrele(fdp->fd_rdir);
2138         }
2139         if (fdp->fd_jdir) {
2140                 cache_drop(&fdp->fd_njdir);
2141                 vrele(fdp->fd_jdir);
2142         }
2143         kfree(fdp, M_FILEDESC);
2144 }
2145
2146 /*
2147  * Retrieve and reference the file pointer associated with a descriptor.
2148  *
2149  * MPSAFE
2150  */
2151 struct file *
2152 holdfp(struct filedesc *fdp, int fd, int flag)
2153 {
2154         struct file* fp;
2155
2156         spin_lock_shared(&fdp->fd_spin);
2157         if (((u_int)fd) >= fdp->fd_nfiles) {
2158                 fp = NULL;
2159                 goto done;
2160         }
2161         if ((fp = fdp->fd_files[fd].fp) == NULL)
2162                 goto done;
2163         if ((fp->f_flag & flag) == 0 && flag != -1) {
2164                 fp = NULL;
2165                 goto done;
2166         }
2167         fhold(fp);
2168 done:
2169         spin_unlock_shared(&fdp->fd_spin);
2170         return (fp);
2171 }
2172
2173 /*
2174  * holdsock() - load the struct file pointer associated
2175  * with a socket into *fpp.  If an error occurs, non-zero
2176  * will be returned and *fpp will be set to NULL.
2177  *
2178  * MPSAFE
2179  */
2180 int
2181 holdsock(struct filedesc *fdp, int fd, struct file **fpp)
2182 {
2183         struct file *fp;
2184         int error;
2185
2186         spin_lock_shared(&fdp->fd_spin);
2187         if ((unsigned)fd >= fdp->fd_nfiles) {
2188                 error = EBADF;
2189                 fp = NULL;
2190                 goto done;
2191         }
2192         if ((fp = fdp->fd_files[fd].fp) == NULL) {
2193                 error = EBADF;
2194                 goto done;
2195         }
2196         if (fp->f_type != DTYPE_SOCKET) {
2197                 error = ENOTSOCK;
2198                 goto done;
2199         }
2200         fhold(fp);
2201         error = 0;
2202 done:
2203         spin_unlock_shared(&fdp->fd_spin);
2204         *fpp = fp;
2205         return (error);
2206 }
2207
2208 /*
2209  * Convert a user file descriptor to a held file pointer.
2210  *
2211  * MPSAFE
2212  */
2213 int
2214 holdvnode(struct filedesc *fdp, int fd, struct file **fpp)
2215 {
2216         struct file *fp;
2217         int error;
2218
2219         spin_lock_shared(&fdp->fd_spin);
2220         if ((unsigned)fd >= fdp->fd_nfiles) {
2221                 error = EBADF;
2222                 fp = NULL;
2223                 goto done;
2224         }
2225         if ((fp = fdp->fd_files[fd].fp) == NULL) {
2226                 error = EBADF;
2227                 goto done;
2228         }
2229         if (fp->f_type != DTYPE_VNODE && fp->f_type != DTYPE_FIFO) {
2230                 fp = NULL;
2231                 error = EINVAL;
2232                 goto done;
2233         }
2234         fhold(fp);
2235         error = 0;
2236 done:
2237         spin_unlock_shared(&fdp->fd_spin);
2238         *fpp = fp;
2239         return (error);
2240 }
2241
2242 /*
2243  * For setugid programs, we don't want to people to use that setugidness
2244  * to generate error messages which write to a file which otherwise would
2245  * otherwise be off-limits to the process.
2246  *
2247  * This is a gross hack to plug the hole.  A better solution would involve
2248  * a special vop or other form of generalized access control mechanism.  We
2249  * go ahead and just reject all procfs file systems accesses as dangerous.
2250  *
2251  * Since setugidsafety calls this only for fd 0, 1 and 2, this check is
2252  * sufficient.  We also don't for check setugidness since we know we are.
2253  */
2254 static int
2255 is_unsafe(struct file *fp)
2256 {
2257         if (fp->f_type == DTYPE_VNODE && 
2258             ((struct vnode *)(fp->f_data))->v_tag == VT_PROCFS)
2259                 return (1);
2260         return (0);
2261 }
2262
2263 /*
2264  * Make this setguid thing safe, if at all possible.
2265  *
2266  * NOT MPSAFE - scans fdp without spinlocks, calls knote_fdclose()
2267  */
2268 void
2269 setugidsafety(struct proc *p)
2270 {
2271         struct filedesc *fdp = p->p_fd;
2272         int i;
2273
2274         /* Certain daemons might not have file descriptors. */
2275         if (fdp == NULL)
2276                 return;
2277
2278         /*
2279          * note: fdp->fd_files may be reallocated out from under us while
2280          * we are blocked in a close.  Be careful!
2281          */
2282         for (i = 0; i <= fdp->fd_lastfile; i++) {
2283                 if (i > 2)
2284                         break;
2285                 if (fdp->fd_files[i].fp && is_unsafe(fdp->fd_files[i].fp)) {
2286                         struct file *fp;
2287
2288                         /*
2289                          * NULL-out descriptor prior to close to avoid
2290                          * a race while close blocks.
2291                          */
2292                         if ((fp = funsetfd_locked(fdp, i)) != NULL) {
2293                                 knote_fdclose(fp, fdp, i);
2294                                 closef(fp, p);
2295                         }
2296                 }
2297         }
2298 }
2299
2300 /*
2301  * Close any files on exec?
2302  *
2303  * NOT MPSAFE - scans fdp without spinlocks, calls knote_fdclose()
2304  */
2305 void
2306 fdcloseexec(struct proc *p)
2307 {
2308         struct filedesc *fdp = p->p_fd;
2309         int i;
2310
2311         /* Certain daemons might not have file descriptors. */
2312         if (fdp == NULL)
2313                 return;
2314
2315         /*
2316          * We cannot cache fd_files since operations may block and rip
2317          * them out from under us.
2318          */
2319         for (i = 0; i <= fdp->fd_lastfile; i++) {
2320                 if (fdp->fd_files[i].fp != NULL &&
2321                     (fdp->fd_files[i].fileflags & UF_EXCLOSE)) {
2322                         struct file *fp;
2323
2324                         /*
2325                          * NULL-out descriptor prior to close to avoid
2326                          * a race while close blocks.
2327                          */
2328                         if ((fp = funsetfd_locked(fdp, i)) != NULL) {
2329                                 knote_fdclose(fp, fdp, i);
2330                                 closef(fp, p);
2331                         }
2332                 }
2333         }
2334 }
2335
2336 /*
2337  * It is unsafe for set[ug]id processes to be started with file
2338  * descriptors 0..2 closed, as these descriptors are given implicit
2339  * significance in the Standard C library.  fdcheckstd() will create a
2340  * descriptor referencing /dev/null for each of stdin, stdout, and
2341  * stderr that is not already open.
2342  *
2343  * NOT MPSAFE - calls falloc, vn_open, etc
2344  */
2345 int
2346 fdcheckstd(struct lwp *lp)
2347 {
2348         struct nlookupdata nd;
2349         struct filedesc *fdp;
2350         struct file *fp;
2351         int retval;
2352         int i, error, flags, devnull;
2353
2354         fdp = lp->lwp_proc->p_fd;
2355         if (fdp == NULL)
2356                 return (0);
2357         devnull = -1;
2358         error = 0;
2359         for (i = 0; i < 3; i++) {
2360                 if (fdp->fd_files[i].fp != NULL)
2361                         continue;
2362                 if (devnull < 0) {
2363                         if ((error = falloc(lp, &fp, &devnull)) != 0)
2364                                 break;
2365
2366                         error = nlookup_init(&nd, "/dev/null", UIO_SYSSPACE,
2367                                                 NLC_FOLLOW|NLC_LOCKVP);
2368                         flags = FREAD | FWRITE;
2369                         if (error == 0)
2370                                 error = vn_open(&nd, fp, flags, 0);
2371                         if (error == 0)
2372                                 fsetfd(fdp, fp, devnull);
2373                         else
2374                                 fsetfd(fdp, NULL, devnull);
2375                         fdrop(fp);
2376                         nlookup_done(&nd);
2377                         if (error)
2378                                 break;
2379                         KKASSERT(i == devnull);
2380                 } else {
2381                         error = kern_dup(DUP_FIXED, devnull, i, &retval);
2382                         if (error != 0)
2383                                 break;
2384                 }
2385         }
2386         return (error);
2387 }
2388
2389 /*
2390  * Internal form of close.
2391  * Decrement reference count on file structure.
2392  * Note: td and/or p may be NULL when closing a file
2393  * that was being passed in a message.
2394  *
2395  * MPALMOSTSAFE - acquires mplock for VOP operations
2396  */
2397 int
2398 closef(struct file *fp, struct proc *p)
2399 {
2400         struct vnode *vp;
2401         struct flock lf;
2402         struct filedesc_to_leader *fdtol;
2403
2404         if (fp == NULL)
2405                 return (0);
2406
2407         /*
2408          * POSIX record locking dictates that any close releases ALL
2409          * locks owned by this process.  This is handled by setting
2410          * a flag in the unlock to free ONLY locks obeying POSIX
2411          * semantics, and not to free BSD-style file locks.
2412          * If the descriptor was in a message, POSIX-style locks
2413          * aren't passed with the descriptor.
2414          */
2415         if (p != NULL && fp->f_type == DTYPE_VNODE &&
2416             (((struct vnode *)fp->f_data)->v_flag & VMAYHAVELOCKS)
2417         ) {
2418                 if ((p->p_leader->p_flags & P_ADVLOCK) != 0) {
2419                         lf.l_whence = SEEK_SET;
2420                         lf.l_start = 0;
2421                         lf.l_len = 0;
2422                         lf.l_type = F_UNLCK;
2423                         vp = (struct vnode *)fp->f_data;
2424                         (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK,
2425                                            &lf, F_POSIX);
2426                 }
2427                 fdtol = p->p_fdtol;
2428                 if (fdtol != NULL) {
2429                         lwkt_gettoken(&p->p_token);
2430                         /*
2431                          * Handle special case where file descriptor table
2432                          * is shared between multiple process leaders.
2433                          */
2434                         for (fdtol = fdtol->fdl_next;
2435                              fdtol != p->p_fdtol;
2436                              fdtol = fdtol->fdl_next) {
2437                                 if ((fdtol->fdl_leader->p_flags &
2438                                      P_ADVLOCK) == 0)
2439                                         continue;
2440                                 fdtol->fdl_holdcount++;
2441                                 lf.l_whence = SEEK_SET;
2442                                 lf.l_start = 0;
2443                                 lf.l_len = 0;
2444                                 lf.l_type = F_UNLCK;
2445                                 vp = (struct vnode *)fp->f_data;
2446                                 (void) VOP_ADVLOCK(vp,
2447                                                    (caddr_t)fdtol->fdl_leader,
2448                                                    F_UNLCK, &lf, F_POSIX);
2449                                 fdtol->fdl_holdcount--;
2450                                 if (fdtol->fdl_holdcount == 0 &&
2451                                     fdtol->fdl_wakeup != 0) {
2452                                         fdtol->fdl_wakeup = 0;
2453                                         wakeup(fdtol);
2454                                 }
2455                         }
2456                         lwkt_reltoken(&p->p_token);
2457                 }
2458         }
2459         return (fdrop(fp));
2460 }
2461
2462 /*
2463  * MPSAFE
2464  *
2465  * fhold() can only be called if f_count is already at least 1 (i.e. the
2466  * caller of fhold() already has a reference to the file pointer in some
2467  * manner or other). 
2468  *
2469  * f_count is not spin-locked.  Instead, atomic ops are used for
2470  * incrementing, decrementing, and handling the 1->0 transition.
2471  */
2472 void
2473 fhold(struct file *fp)
2474 {
2475         atomic_add_int(&fp->f_count, 1);
2476 }
2477
2478 /*
2479  * fdrop() - drop a reference to a descriptor
2480  *
2481  * MPALMOSTSAFE - acquires mplock for final close sequence
2482  */
2483 int
2484 fdrop(struct file *fp)
2485 {
2486         struct flock lf;
2487         struct vnode *vp;
2488         int error;
2489
2490         /*
2491          * A combined fetch and subtract is needed to properly detect
2492          * 1->0 transitions, otherwise two cpus dropping from a ref
2493          * count of 2 might both try to run the 1->0 code.
2494          */
2495         if (atomic_fetchadd_int(&fp->f_count, -1) > 1)
2496                 return (0);
2497
2498         KKASSERT(SLIST_FIRST(&fp->f_klist) == NULL);
2499
2500         /*
2501          * The last reference has gone away, we own the fp structure free
2502          * and clear.
2503          */
2504         if (fp->f_count < 0)
2505                 panic("fdrop: count < 0");
2506         if ((fp->f_flag & FHASLOCK) && fp->f_type == DTYPE_VNODE &&
2507             (((struct vnode *)fp->f_data)->v_flag & VMAYHAVELOCKS)
2508         ) {
2509                 lf.l_whence = SEEK_SET;
2510                 lf.l_start = 0;
2511                 lf.l_len = 0;
2512                 lf.l_type = F_UNLCK;
2513                 vp = (struct vnode *)fp->f_data;
2514                 (void) VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, 0);
2515         }
2516         if (fp->f_ops != &badfileops)
2517                 error = fo_close(fp);
2518         else
2519                 error = 0;
2520         ffree(fp);
2521         return (error);
2522 }
2523
2524 /*
2525  * Apply an advisory lock on a file descriptor.
2526  *
2527  * Just attempt to get a record lock of the requested type on
2528  * the entire file (l_whence = SEEK_SET, l_start = 0, l_len = 0).
2529  *
2530  * MPALMOSTSAFE
2531  */
2532 int
2533 sys_flock(struct flock_args *uap)
2534 {
2535         struct proc *p = curproc;
2536         struct file *fp;
2537         struct vnode *vp;
2538         struct flock lf;
2539         int error;
2540
2541         if ((fp = holdfp(p->p_fd, uap->fd, -1)) == NULL)
2542                 return (EBADF);
2543         if (fp->f_type != DTYPE_VNODE) {
2544                 error = EOPNOTSUPP;
2545                 goto done;
2546         }
2547         vp = (struct vnode *)fp->f_data;
2548         lf.l_whence = SEEK_SET;
2549         lf.l_start = 0;
2550         lf.l_len = 0;
2551         if (uap->how & LOCK_UN) {
2552                 lf.l_type = F_UNLCK;
2553                 fp->f_flag &= ~FHASLOCK;
2554                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, 0);
2555                 goto done;
2556         }
2557         if (uap->how & LOCK_EX)
2558                 lf.l_type = F_WRLCK;
2559         else if (uap->how & LOCK_SH)
2560                 lf.l_type = F_RDLCK;
2561         else {
2562                 error = EBADF;
2563                 goto done;
2564         }
2565         fp->f_flag |= FHASLOCK;
2566         if (uap->how & LOCK_NB)
2567                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, 0);
2568         else
2569                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, F_WAIT);
2570 done:
2571         fdrop(fp);
2572         return (error);
2573 }
2574
2575 /*
2576  * File Descriptor pseudo-device driver (/dev/fd/).
2577  *
2578  * Opening minor device N dup()s the file (if any) connected to file
2579  * descriptor N belonging to the calling process.  Note that this driver
2580  * consists of only the ``open()'' routine, because all subsequent
2581  * references to this file will be direct to the other driver.
2582  */
2583 static int
2584 fdopen(struct dev_open_args *ap)
2585 {
2586         thread_t td = curthread;
2587
2588         KKASSERT(td->td_lwp != NULL);
2589
2590         /*
2591          * XXX Kludge: set curlwp->lwp_dupfd to contain the value of the
2592          * the file descriptor being sought for duplication. The error
2593          * return ensures that the vnode for this device will be released
2594          * by vn_open. Open will detect this special error and take the
2595          * actions in dupfdopen below. Other callers of vn_open or VOP_OPEN
2596          * will simply report the error.
2597          */
2598         td->td_lwp->lwp_dupfd = minor(ap->a_head.a_dev);
2599         return (ENODEV);
2600 }
2601
2602 /*
2603  * The caller has reserved the file descriptor dfd for us.  On success we
2604  * must fsetfd() it.  On failure the caller will clean it up.
2605  *
2606  * MPSAFE
2607  */
2608 int
2609 dupfdopen(struct filedesc *fdp, int dfd, int sfd, int mode, int error)
2610 {
2611         struct file *wfp;
2612         struct file *xfp;
2613         int werror;
2614
2615         if ((wfp = holdfp(fdp, sfd, -1)) == NULL)
2616                 return (EBADF);
2617
2618         /*
2619          * Close a revoke/dup race.  Duping a descriptor marked as revoked
2620          * will dup a dummy descriptor instead of the real one.
2621          */
2622         if (wfp->f_flag & FREVOKED) {
2623                 kprintf("Warning: attempt to dup() a revoked descriptor\n");
2624                 fdrop(wfp);
2625                 wfp = NULL;
2626                 werror = falloc(NULL, &wfp, NULL);
2627                 if (werror)
2628                         return (werror);
2629         }
2630
2631         /*
2632          * There are two cases of interest here.
2633          *
2634          * For ENODEV simply dup sfd to file descriptor dfd and return.
2635          *
2636          * For ENXIO steal away the file structure from sfd and store it
2637          * dfd.  sfd is effectively closed by this operation.
2638          *
2639          * Any other error code is just returned.
2640          */
2641         switch (error) {
2642         case ENODEV:
2643                 /*
2644                  * Check that the mode the file is being opened for is a
2645                  * subset of the mode of the existing descriptor.
2646                  */
2647                 if (((mode & (FREAD|FWRITE)) | wfp->f_flag) != wfp->f_flag) {
2648                         error = EACCES;
2649                         break;
2650                 }
2651                 spin_lock(&fdp->fd_spin);
2652                 fdp->fd_files[dfd].fileflags = fdp->fd_files[sfd].fileflags;
2653                 fsetfd_locked(fdp, wfp, dfd);
2654                 spin_unlock(&fdp->fd_spin);
2655                 error = 0;
2656                 break;
2657         case ENXIO:
2658                 /*
2659                  * Steal away the file pointer from dfd, and stuff it into indx.
2660                  */
2661                 spin_lock(&fdp->fd_spin);
2662                 fdp->fd_files[dfd].fileflags = fdp->fd_files[sfd].fileflags;
2663                 fsetfd(fdp, wfp, dfd);
2664                 if ((xfp = funsetfd_locked(fdp, sfd)) != NULL) {
2665                         spin_unlock(&fdp->fd_spin);
2666                         fdrop(xfp);
2667                 } else {
2668                         spin_unlock(&fdp->fd_spin);
2669                 }
2670                 error = 0;
2671                 break;
2672         default:
2673                 break;
2674         }
2675         fdrop(wfp);
2676         return (error);
2677 }
2678
2679 /*
2680  * NOT MPSAFE - I think these refer to a common file descriptor table
2681  * and we need to spinlock that to link fdtol in.
2682  */
2683 struct filedesc_to_leader *
2684 filedesc_to_leader_alloc(struct filedesc_to_leader *old,
2685                          struct proc *leader)
2686 {
2687         struct filedesc_to_leader *fdtol;
2688         
2689         fdtol = kmalloc(sizeof(struct filedesc_to_leader), 
2690                         M_FILEDESC_TO_LEADER, M_WAITOK | M_ZERO);
2691         fdtol->fdl_refcount = 1;
2692         fdtol->fdl_holdcount = 0;
2693         fdtol->fdl_wakeup = 0;
2694         fdtol->fdl_leader = leader;
2695         if (old != NULL) {
2696                 fdtol->fdl_next = old->fdl_next;
2697                 fdtol->fdl_prev = old;
2698                 old->fdl_next = fdtol;
2699                 fdtol->fdl_next->fdl_prev = fdtol;
2700         } else {
2701                 fdtol->fdl_next = fdtol;
2702                 fdtol->fdl_prev = fdtol;
2703         }
2704         return fdtol;
2705 }
2706
2707 /*
2708  * Scan all file pointers in the system.  The callback is made with
2709  * the master list spinlock held exclusively.
2710  *
2711  * MPSAFE
2712  */
2713 void
2714 allfiles_scan_exclusive(int (*callback)(struct file *, void *), void *data)
2715 {
2716         struct file *fp;
2717         int res;
2718
2719         spin_lock(&filehead_spin);
2720         LIST_FOREACH(fp, &filehead, f_list) {
2721                 res = callback(fp, data);
2722                 if (res < 0)
2723                         break;
2724         }
2725         spin_unlock(&filehead_spin);
2726 }
2727
2728 /*
2729  * Get file structures.
2730  *
2731  * NOT MPSAFE - process list scan, SYSCTL_OUT (probably not mpsafe)
2732  */
2733
2734 struct sysctl_kern_file_info {
2735         int count;
2736         int error;
2737         struct sysctl_req *req;
2738 };
2739
2740 static int sysctl_kern_file_callback(struct proc *p, void *data);
2741
2742 static int
2743 sysctl_kern_file(SYSCTL_HANDLER_ARGS)
2744 {
2745         struct sysctl_kern_file_info info;
2746
2747         /*
2748          * Note: because the number of file descriptors is calculated
2749          * in different ways for sizing vs returning the data,
2750          * there is information leakage from the first loop.  However,
2751          * it is of a similar order of magnitude to the leakage from
2752          * global system statistics such as kern.openfiles.
2753          *
2754          * When just doing a count, note that we cannot just count
2755          * the elements and add f_count via the filehead list because 
2756          * threaded processes share their descriptor table and f_count might
2757          * still be '1' in that case.
2758          *
2759          * Since the SYSCTL op can block, we must hold the process to
2760          * prevent it being ripped out from under us either in the 
2761          * file descriptor loop or in the greater LIST_FOREACH.  The
2762          * process may be in varying states of disrepair.  If the process
2763          * is in SZOMB we may have caught it just as it is being removed
2764          * from the allproc list, we must skip it in that case to maintain
2765          * an unbroken chain through the allproc list.
2766          */
2767         info.count = 0;
2768         info.error = 0;
2769         info.req = req;
2770         allproc_scan(sysctl_kern_file_callback, &info);
2771
2772         /*
2773          * When just calculating the size, overestimate a bit to try to
2774          * prevent system activity from causing the buffer-fill call 
2775          * to fail later on.
2776          */
2777         if (req->oldptr == NULL) {
2778                 info.count = (info.count + 16) + (info.count / 10);
2779                 info.error = SYSCTL_OUT(req, NULL,
2780                                         info.count * sizeof(struct kinfo_file));
2781         }
2782         return (info.error);
2783 }
2784
2785 static int
2786 sysctl_kern_file_callback(struct proc *p, void *data)
2787 {
2788         struct sysctl_kern_file_info *info = data;
2789         struct kinfo_file kf;
2790         struct filedesc *fdp;
2791         struct file *fp;
2792         uid_t uid;
2793         int n;
2794
2795         if (p->p_stat == SIDL || p->p_stat == SZOMB)
2796                 return(0);
2797         if (!PRISON_CHECK(info->req->td->td_ucred, p->p_ucred) != 0)
2798                 return(0);
2799
2800         /*
2801          * Softref the fdp to prevent it from being destroyed
2802          */
2803         spin_lock(&p->p_spin);
2804         if ((fdp = p->p_fd) == NULL) {
2805                 spin_unlock(&p->p_spin);
2806                 return(0);
2807         }
2808         atomic_add_int(&fdp->fd_softrefs, 1);
2809         spin_unlock(&p->p_spin);
2810
2811         /*
2812          * The fdp's own spinlock prevents the contents from being
2813          * modified.
2814          */
2815         spin_lock_shared(&fdp->fd_spin);
2816         for (n = 0; n < fdp->fd_nfiles; ++n) {
2817                 if ((fp = fdp->fd_files[n].fp) == NULL)
2818                         continue;
2819                 if (info->req->oldptr == NULL) {
2820                         ++info->count;
2821                 } else {
2822                         uid = p->p_ucred ? p->p_ucred->cr_uid : -1;
2823                         kcore_make_file(&kf, fp, p->p_pid, uid, n);
2824                         spin_unlock_shared(&fdp->fd_spin);
2825                         info->error = SYSCTL_OUT(info->req, &kf, sizeof(kf));
2826                         spin_lock_shared(&fdp->fd_spin);
2827                         if (info->error)
2828                                 break;
2829                 }
2830         }
2831         spin_unlock_shared(&fdp->fd_spin);
2832         atomic_subtract_int(&fdp->fd_softrefs, 1);
2833         if (info->error)
2834                 return(-1);
2835         return(0);
2836 }
2837
2838 SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD,
2839     0, 0, sysctl_kern_file, "S,file", "Entire file table");
2840
2841 SYSCTL_INT(_kern, OID_AUTO, minfilesperproc, CTLFLAG_RW,
2842     &minfilesperproc, 0, "Minimum files allowed open per process");
2843 SYSCTL_INT(_kern, KERN_MAXFILESPERPROC, maxfilesperproc, CTLFLAG_RW, 
2844     &maxfilesperproc, 0, "Maximum files allowed open per process");
2845 SYSCTL_INT(_kern, OID_AUTO, maxfilesperuser, CTLFLAG_RW,
2846     &maxfilesperuser, 0, "Maximum files allowed open per user");
2847
2848 SYSCTL_INT(_kern, KERN_MAXFILES, maxfiles, CTLFLAG_RW, 
2849     &maxfiles, 0, "Maximum number of files");
2850
2851 SYSCTL_INT(_kern, OID_AUTO, maxfilesrootres, CTLFLAG_RW, 
2852     &maxfilesrootres, 0, "Descriptors reserved for root use");
2853
2854 SYSCTL_INT(_kern, OID_AUTO, openfiles, CTLFLAG_RD, 
2855         &nfiles, 0, "System-wide number of open files");
2856
2857 static void
2858 fildesc_drvinit(void *unused)
2859 {
2860         int fd;
2861
2862         for (fd = 0; fd < NUMFDESC; fd++) {
2863                 make_dev(&fildesc_ops, fd,
2864                          UID_BIN, GID_BIN, 0666, "fd/%d", fd);
2865         }
2866
2867         make_dev(&fildesc_ops, 0, UID_ROOT, GID_WHEEL, 0666, "stdin");
2868         make_dev(&fildesc_ops, 1, UID_ROOT, GID_WHEEL, 0666, "stdout");
2869         make_dev(&fildesc_ops, 2, UID_ROOT, GID_WHEEL, 0666, "stderr");
2870 }
2871
2872 /*
2873  * MPSAFE
2874  */
2875 struct fileops badfileops = {
2876         .fo_read = badfo_readwrite,
2877         .fo_write = badfo_readwrite,
2878         .fo_ioctl = badfo_ioctl,
2879         .fo_kqfilter = badfo_kqfilter,
2880         .fo_stat = badfo_stat,
2881         .fo_close = badfo_close,
2882         .fo_shutdown = badfo_shutdown
2883 };
2884
2885 int
2886 badfo_readwrite(
2887         struct file *fp,
2888         struct uio *uio,
2889         struct ucred *cred,
2890         int flags
2891 ) {
2892         return (EBADF);
2893 }
2894
2895 int
2896 badfo_ioctl(struct file *fp, u_long com, caddr_t data,
2897             struct ucred *cred, struct sysmsg *msgv)
2898 {
2899         return (EBADF);
2900 }
2901
2902 /*
2903  * Must return an error to prevent registration, typically
2904  * due to a revoked descriptor (file_filtops assigned).
2905  */
2906 int
2907 badfo_kqfilter(struct file *fp, struct knote *kn)
2908 {
2909         return (EOPNOTSUPP);
2910 }
2911
2912 /*
2913  * MPSAFE
2914  */
2915 int
2916 badfo_stat(struct file *fp, struct stat *sb, struct ucred *cred)
2917 {
2918         return (EBADF);
2919 }
2920
2921 /*
2922  * MPSAFE
2923  */
2924 int
2925 badfo_close(struct file *fp)
2926 {
2927         return (EBADF);
2928 }
2929
2930 /*
2931  * MPSAFE
2932  */
2933 int
2934 badfo_shutdown(struct file *fp, int how)
2935 {
2936         return (EBADF);
2937 }
2938
2939 /*
2940  * MPSAFE
2941  */
2942 int
2943 nofo_shutdown(struct file *fp, int how)
2944 {
2945         return (EOPNOTSUPP);
2946 }
2947
2948 SYSINIT(fildescdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,
2949                                         fildesc_drvinit,NULL)