From owner-svn-src-all@FreeBSD.ORG Thu Nov 13 21:15:10 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 844D1797; Thu, 13 Nov 2014 21:15:10 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 6521F78F; Thu, 13 Nov 2014 21:15:10 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sADLFAFL082483; Thu, 13 Nov 2014 21:15:10 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sADLF9lQ082480; Thu, 13 Nov 2014 21:15:09 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <201411132115.sADLF9lQ082480@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Thu, 13 Nov 2014 21:15:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r274482 - head/sys/kern X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Nov 2014 21:15:10 -0000 Author: mjg Date: Thu Nov 13 21:15:09 2014 New Revision: 274482 URL: https://svnweb.freebsd.org/changeset/base/274482 Log: filedesc: fixup fdinit to lock fdp and preapare files conditinally Not all consumers providing fdp to copy from want files. Perhaps these functions should be reorganized to better express the outcome. This fixes up panics after r273895 . Reported by: markj Modified: head/sys/kern/init_main.c head/sys/kern/kern_descrip.c head/sys/kern/kern_fork.c Modified: head/sys/kern/init_main.c ============================================================================== --- head/sys/kern/init_main.c Thu Nov 13 20:09:47 2014 (r274481) +++ head/sys/kern/init_main.c Thu Nov 13 21:15:09 2014 (r274482) @@ -527,7 +527,7 @@ proc0_init(void *dummy __unused) siginit(&proc0); /* Create the file descriptor table. */ - p->p_fd = fdinit(NULL); + p->p_fd = fdinit(NULL, false); p->p_fdtol = NULL; /* Create the limits structures. */ Modified: head/sys/kern/kern_descrip.c ============================================================================== --- head/sys/kern/kern_descrip.c Thu Nov 13 20:09:47 2014 (r274481) +++ head/sys/kern/kern_descrip.c Thu Nov 13 21:15:09 2014 (r274482) @@ -1797,7 +1797,7 @@ finstall(struct thread *td, struct file * If fdp is not NULL, return with it shared locked. */ struct filedesc * -fdinit(struct filedesc *fdp) +fdinit(struct filedesc *fdp, bool prepfiles) { struct filedesc0 *newfdp0; struct filedesc *newfdp; @@ -1818,7 +1818,7 @@ fdinit(struct filedesc *fdp) if (fdp == NULL) return (newfdp); - if (fdp->fd_lastfile >= newfdp->fd_nfiles) + if (prepfiles && fdp->fd_lastfile >= newfdp->fd_nfiles) fdgrowtable(newfdp, fdp->fd_lastfile + 1); FILEDESC_SLOCK(fdp); @@ -1832,10 +1832,14 @@ fdinit(struct filedesc *fdp) if (newfdp->fd_jdir) VREF(newfdp->fd_jdir); - while (fdp->fd_lastfile >= newfdp->fd_nfiles) { + if (!prepfiles) { FILEDESC_SUNLOCK(fdp); - fdgrowtable(newfdp, fdp->fd_lastfile + 1); - FILEDESC_SLOCK(fdp); + } else { + while (fdp->fd_lastfile >= newfdp->fd_nfiles) { + FILEDESC_SUNLOCK(fdp); + fdgrowtable(newfdp, fdp->fd_lastfile + 1); + FILEDESC_SLOCK(fdp); + } } return (newfdp); @@ -1914,7 +1918,7 @@ fdcopy(struct filedesc *fdp) MPASS(fdp != NULL); - newfdp = fdinit(fdp); + newfdp = fdinit(fdp, true); /* copy all passable descriptors (i.e. not kqueue) */ newfdp->fd_freefile = -1; for (i = 0; i <= fdp->fd_lastfile; ++i) { Modified: head/sys/kern/kern_fork.c ============================================================================== --- head/sys/kern/kern_fork.c Thu Nov 13 20:09:47 2014 (r274481) +++ head/sys/kern/kern_fork.c Thu Nov 13 21:15:09 2014 (r274482) @@ -333,7 +333,7 @@ fork_norfproc(struct thread *td, int fla */ if (flags & RFCFDG) { struct filedesc *fdtmp; - fdtmp = fdinit(td->td_proc->p_fd); + fdtmp = fdinit(td->td_proc->p_fd, false); fdescfree(td); p1->p_fd = fdtmp; } @@ -418,7 +418,7 @@ do_fork(struct thread *td, int flags, st * Copy filedesc. */ if (flags & RFCFDG) { - fd = fdinit(p1->p_fd); + fd = fdinit(p1->p_fd, false); fdtol = NULL; } else if (flags & RFFDG) { fd = fdcopy(p1->p_fd);