diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/kernel/module.c b/kernel/module.c index e8cf636e614b..1a9a3986b136 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1912,12 +1912,6 @@ static noinline struct module *load_module(void __user *umod, | |||
1912 | if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) | 1912 | if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) |
1913 | return ERR_PTR(-ENOMEM); | 1913 | return ERR_PTR(-ENOMEM); |
1914 | 1914 | ||
1915 | /* Create stop_machine threads since the error path relies on | ||
1916 | * a non-failing stop_machine call. */ | ||
1917 | err = stop_machine_create(); | ||
1918 | if (err) | ||
1919 | goto free_hdr; | ||
1920 | |||
1921 | if (copy_from_user(hdr, umod, len) != 0) { | 1915 | if (copy_from_user(hdr, umod, len) != 0) { |
1922 | err = -EFAULT; | 1916 | err = -EFAULT; |
1923 | goto free_hdr; | 1917 | goto free_hdr; |
@@ -2303,12 +2297,13 @@ static noinline struct module *load_module(void __user *umod, | |||
2303 | /* Get rid of temporary copy */ | 2297 | /* Get rid of temporary copy */ |
2304 | vfree(hdr); | 2298 | vfree(hdr); |
2305 | 2299 | ||
2306 | stop_machine_destroy(); | ||
2307 | /* Done! */ | 2300 | /* Done! */ |
2308 | return mod; | 2301 | return mod; |
2309 | 2302 | ||
2310 | unlink: | 2303 | unlink: |
2311 | stop_machine(__unlink_module, mod, NULL); | 2304 | /* Unlink carefully: kallsyms could be walking list. */ |
2305 | list_del_rcu(&mod->list); | ||
2306 | synchronize_sched(); | ||
2312 | module_arch_cleanup(mod); | 2307 | module_arch_cleanup(mod); |
2313 | cleanup: | 2308 | cleanup: |
2314 | kobject_del(&mod->mkobj.kobj); | 2309 | kobject_del(&mod->mkobj.kobj); |
@@ -2331,7 +2326,6 @@ static noinline struct module *load_module(void __user *umod, | |||
2331 | kfree(args); | 2326 | kfree(args); |
2332 | free_hdr: | 2327 | free_hdr: |
2333 | vfree(hdr); | 2328 | vfree(hdr); |
2334 | stop_machine_destroy(); | ||
2335 | return ERR_PTR(err); | 2329 | return ERR_PTR(err); |
2336 | 2330 | ||
2337 | truncated: | 2331 | truncated: |