summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2014-07-06 23:20:48 +0000
committermjg <mjg@FreeBSD.org>2014-07-06 23:20:48 +0000
commit63523f9ee102fe01f49d27f93b1c7826f21279cb (patch)
tree008585f2ea373e75c556e7cd8e567abd450b20ca /sys/kern
parent12766f2ff4b9f4fb6f1b98c96b5f5207ad0c9de7 (diff)
downloadFreeBSD-src-63523f9ee102fe01f49d27f93b1c7826f21279cb.zip
FreeBSD-src-63523f9ee102fe01f49d27f93b1c7826f21279cb.tar.gz
MFC r268000:
Make sure to always clear p_fd for process getting rid of its filetable. Filetable can be shared with other processes. Previous code failed to clear the pointer for all but the last process getting rid of the table. This is mostly cosmetics. Get rid of 'This should happen earlier' comment. Clearing the pointer in this place is fine as consumers can reliably check for files availability by inspecting fd_refcnt and vnodes availabity by NULL-checking them.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_descrip.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 4219b07..4105ee3 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -2036,6 +2036,11 @@ fdescfree(struct thread *td)
if (fdtol != NULL)
free(fdtol, M_FILEDESC_TO_LEADER);
}
+
+ mtx_lock(&fdesc_mtx);
+ td->td_proc->p_fd = NULL;
+ mtx_unlock(&fdesc_mtx);
+
FILEDESC_XLOCK(fdp);
i = --fdp->fd_refcnt;
FILEDESC_XUNLOCK(fdp);
@@ -2053,11 +2058,6 @@ fdescfree(struct thread *td)
}
FILEDESC_XLOCK(fdp);
- /* XXX This should happen earlier. */
- mtx_lock(&fdesc_mtx);
- td->td_proc->p_fd = NULL;
- mtx_unlock(&fdesc_mtx);
-
if (fdp->fd_nfiles > NDFILE)
free(fdp->fd_ofiles, M_FILEDESC);
if (NDSLOTS(fdp->fd_nfiles) > NDSLOTS(NDFILE))
OpenPOWER on IntegriCloud