diff options
author | kib <kib@FreeBSD.org> | 2017-03-11 09:22:53 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-03-11 09:22:53 +0000 |
commit | dfe31808b5e0144baf461828d07d4eda93b93b4b (patch) | |
tree | 4c507f944f34e58dbe12f28a23a1758274fae0ac /sys/ufs/ffs | |
parent | a7726c1826bf72fe96a464af20c59a842f8c4491 (diff) | |
download | FreeBSD-src-dfe31808b5e0144baf461828d07d4eda93b93b4b.zip FreeBSD-src-dfe31808b5e0144baf461828d07d4eda93b93b4b.tar.gz |
MFC r314253:
Do not leak mount references for dying threads.
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r-- | sys/ufs/ffs/ffs_softdep.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 94ac101..e7214cb 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -902,7 +902,7 @@ static int pagedep_find(struct pagedep_hashhead *, ino_t, ufs_lbn_t, static void pause_timer(void *); static int request_cleanup(struct mount *, int); static void schedule_cleanup(struct mount *); -static void softdep_ast_cleanup_proc(void); +static void softdep_ast_cleanup_proc(struct thread *); static int process_worklist_item(struct mount *, int, int); static void process_removes(struct vnode *); static void process_truncates(struct vnode *); @@ -13437,15 +13437,13 @@ schedule_cleanup(struct mount *mp) } static void -softdep_ast_cleanup_proc(void) +softdep_ast_cleanup_proc(struct thread *td) { - struct thread *td; struct mount *mp; struct ufsmount *ump; int error; bool req; - td = curthread; while ((mp = td->td_su) != NULL) { td->td_su = NULL; error = vfs_busy(mp, MBF_NOWAIT); @@ -13483,6 +13481,10 @@ softdep_ast_cleanup_proc(void) } vfs_unbusy(mp); } + if ((mp = td->td_su) != NULL) { + td->td_su = NULL; + vfs_rel(mp); + } } /* |