|
@@ -518,6 +518,8 @@ void mmput(struct mm_struct *mm)
|
|
|
spin_unlock(&mmlist_lock);
|
|
|
}
|
|
|
put_swap_token(mm);
|
|
|
+ if (mm->binfmt)
|
|
|
+ module_put(mm->binfmt->module);
|
|
|
mmdrop(mm);
|
|
|
}
|
|
|
}
|
|
@@ -643,9 +645,14 @@ struct mm_struct *dup_mm(struct task_struct *tsk)
|
|
|
mm->hiwater_rss = get_mm_rss(mm);
|
|
|
mm->hiwater_vm = mm->total_vm;
|
|
|
|
|
|
+ if (mm->binfmt && !try_module_get(mm->binfmt->module))
|
|
|
+ goto free_pt;
|
|
|
+
|
|
|
return mm;
|
|
|
|
|
|
free_pt:
|
|
|
+ /* don't put binfmt in mmput, we haven't got module yet */
|
|
|
+ mm->binfmt = NULL;
|
|
|
mmput(mm);
|
|
|
|
|
|
fail_nomem:
|
|
@@ -1037,9 +1044,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
|
|
if (!try_module_get(task_thread_info(p)->exec_domain->module))
|
|
|
goto bad_fork_cleanup_count;
|
|
|
|
|
|
- if (p->binfmt && !try_module_get(p->binfmt->module))
|
|
|
- goto bad_fork_cleanup_put_domain;
|
|
|
-
|
|
|
p->did_exec = 0;
|
|
|
delayacct_tsk_init(p); /* Must remain after dup_task_struct() */
|
|
|
copy_flags(clone_flags, p);
|
|
@@ -1327,9 +1331,6 @@ bad_fork_cleanup_cgroup:
|
|
|
#endif
|
|
|
cgroup_exit(p, cgroup_callbacks_done);
|
|
|
delayacct_tsk_free(p);
|
|
|
- if (p->binfmt)
|
|
|
- module_put(p->binfmt->module);
|
|
|
-bad_fork_cleanup_put_domain:
|
|
|
module_put(task_thread_info(p)->exec_domain->module);
|
|
|
bad_fork_cleanup_count:
|
|
|
atomic_dec(&p->cred->user->processes);
|