On Mon, Apr 02, 2018 at 12:55:43PM +0200, Martin Pieuchot wrote:
> dodup3() is already calling FREF(), just before a sleeping point.  Diff
> below moves it right after fd_getfile() to prepare for unlocking some
> syscalls.
> 
> Ok?

OK bluhm@

> Index: kern/kern_descrip.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_descrip.c,v
> retrieving revision 1.143
> diff -u -p -r1.143 kern_descrip.c
> --- kern/kern_descrip.c       28 Mar 2018 09:49:28 -0000      1.143
> +++ kern/kern_descrip.c       2 Apr 2018 10:51:51 -0000
> @@ -289,9 +289,12 @@ dodup3(struct proc *p, int old, int new,
>  restart:
>       if ((fp = fd_getfile(fdp, old)) == NULL)
>               return (EBADF);
> +     FREF(fp);
>       if ((u_int)new >= p->p_rlimit[RLIMIT_NOFILE].rlim_cur ||
> -         (u_int)new >= maxfiles)
> +         (u_int)new >= maxfiles) {
> +             FRELE(fp, p);
>               return (EBADF);
> +     }
>       if (old == new) {
>               /*
>                * NOTE! This doesn't clear the close-on-exec flag. This might
> @@ -299,9 +302,9 @@ restart:
>                * this is what everyone else does.
>                */
>               *retval = new;
> +             FRELE(fp, p);
>               return (0);
>       }
> -     FREF(fp);
>       fdplock(fdp);
>       if (new >= fdp->fd_nfiles) {
>               if ((error = fdalloc(p, new, &i)) != 0) {

Reply via email to