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