diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -4173,7 +4173,8 @@ } struct filedesc_to_leader * -filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader) +filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, + struct proc *leader) { struct filedesc_to_leader *fdtol; @@ -4197,6 +4198,15 @@ return (fdtol); } +struct filedesc_to_leader * +filedesc_to_leader_share(struct filedesc_to_leader *fdtol, struct filedesc *fdp) +{ + FILEDESC_XLOCK(fdp); + fdtol->fdl_refcount++; + FILEDESC_XUNLOCK(fdp); + return (fdtol); +} + static int sysctl_kern_proc_nfds(SYSCTL_HANDLER_ARGS) { diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -451,10 +451,7 @@ * Shared file descriptor table, and shared * process leaders. */ - fdtol = p1->p_fdtol; - FILEDESC_XLOCK(p1->p_fd); - fdtol->fdl_refcount++; - FILEDESC_XUNLOCK(p1->p_fd); + fdtol = filedesc_to_leader_share(p1->p_fdtol, p1->p_fd); } else { /* * Shared file descriptor table, and different diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h --- a/sys/sys/filedesc.h +++ b/sys/sys/filedesc.h @@ -270,6 +270,9 @@ struct filedesc_to_leader * filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader); +struct filedesc_to_leader * + filedesc_to_leader_share(struct filedesc_to_leader *fdtol, + struct filedesc *fdp); int getvnode(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp); int getvnode_path(struct thread *td, int fd, cap_rights_t *rightsp,