]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 May 2013 22:58:10 +0000 (15:58 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 May 2013 22:58:10 +0000 (15:58 -0700)
added patches:
module-don-t-unlink-the-module-until-we-ve-removed-all-exposure.patch

queue-3.9/module-don-t-unlink-the-module-until-we-ve-removed-all-exposure.patch [new file with mode: 0644]
queue-3.9/series

diff --git a/queue-3.9/module-don-t-unlink-the-module-until-we-ve-removed-all-exposure.patch b/queue-3.9/module-don-t-unlink-the-module-until-we-ve-removed-all-exposure.patch
new file mode 100644 (file)
index 0000000..6b17534
--- /dev/null
@@ -0,0 +1,79 @@
+From 944a1fa01266aa9ace607f29551b73c41e9440e9 Mon Sep 17 00:00:00 2001
+From: Rusty Russell <rusty@rustcorp.com.au>
+Date: Wed, 17 Apr 2013 13:20:03 +0930
+Subject: module: don't unlink the module until we've removed all exposure.
+
+From: Rusty Russell <rusty@rustcorp.com.au>
+
+commit 944a1fa01266aa9ace607f29551b73c41e9440e9 upstream.
+
+Otherwise we get a race between unload and reload of the same module:
+the new module doesn't see the old one in the list, but then fails because
+it can't register over the still-extant entries in sysfs:
+
+ [  103.981925] ------------[ cut here ]------------
+ [  103.986902] WARNING: at fs/sysfs/dir.c:536 sysfs_add_one+0xab/0xd0()
+ [  103.993606] Hardware name: CrownBay Platform
+ [  103.998075] sysfs: cannot create duplicate filename '/module/pch_gbe'
+ [  104.004784] Modules linked in: pch_gbe(+) [last unloaded: pch_gbe]
+ [  104.011362] Pid: 3021, comm: modprobe Tainted: G        W    3.9.0-rc5+ #5
+ [  104.018662] Call Trace:
+ [  104.021286]  [<c103599d>] warn_slowpath_common+0x6d/0xa0
+ [  104.026933]  [<c1168c8b>] ? sysfs_add_one+0xab/0xd0
+ [  104.031986]  [<c1168c8b>] ? sysfs_add_one+0xab/0xd0
+ [  104.037000]  [<c1035a4e>] warn_slowpath_fmt+0x2e/0x30
+ [  104.042188]  [<c1168c8b>] sysfs_add_one+0xab/0xd0
+ [  104.046982]  [<c1168dbe>] create_dir+0x5e/0xa0
+ [  104.051633]  [<c1168e78>] sysfs_create_dir+0x78/0xd0
+ [  104.056774]  [<c1262bc3>] kobject_add_internal+0x83/0x1f0
+ [  104.062351]  [<c126daf6>] ? kvasprintf+0x46/0x60
+ [  104.067231]  [<c1262ebd>] kobject_add_varg+0x2d/0x50
+ [  104.072450]  [<c1262f07>] kobject_init_and_add+0x27/0x30
+ [  104.078075]  [<c1089240>] mod_sysfs_setup+0x80/0x540
+ [  104.083207]  [<c1260851>] ? module_bug_finalize+0x51/0xc0
+ [  104.088720]  [<c108ab29>] load_module+0x1429/0x18b0
+
+We can teardown sysfs first, then to be sure, put the state in
+MODULE_STATE_UNFORMED so it's ignored while we deconstruct it.
+
+Reported-by: Veaceslav Falico <vfalico@redhat.com>
+Tested-by: Veaceslav Falico <vfalico@redhat.com>
+Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
+Cc: Ben Greear <greearb@candelatech.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/module.c |   13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -1861,12 +1861,12 @@ static void free_module(struct module *m
+ {
+       trace_module_free(mod);
+-      /* Delete from various lists */
+-      mutex_lock(&module_mutex);
+-      stop_machine(__unlink_module, mod, NULL);
+-      mutex_unlock(&module_mutex);
+       mod_sysfs_teardown(mod);
++      /* We leave it in list to prevent duplicate loads, but make sure
++       * that noone uses it while it's being deconstructed. */
++      mod->state = MODULE_STATE_UNFORMED;
++
+       /* Remove dynamic debug info */
+       ddebug_remove_module(mod->name);
+@@ -1879,6 +1879,11 @@ static void free_module(struct module *m
+       /* Free any allocated parameters. */
+       destroy_params(mod->kp, mod->num_kp);
++      /* Now we can delete it from the lists */
++      mutex_lock(&module_mutex);
++      stop_machine(__unlink_module, mod, NULL);
++      mutex_unlock(&module_mutex);
++
+       /* This may be NULL, but that's OK */
+       unset_module_init_ro_nx(mod);
+       module_free(mod, mod->module_init);
index a44affdb113e9ca54c2acc5efa40507f8f555c53..3fb334aac83a2c0a074b4a8435a409a4c60844de 100644 (file)
@@ -58,3 +58,4 @@ x86-allow-fpu-to-be-used-at-interrupt-time-even-with-eagerfpu.patch
 x86-64-init-fix-a-possible-wraparound-bug-in-switchover-in-head_64.s.patch
 x86-range-fix-missing-merge-during-add-range.patch
 x86-crc32-pclmul-fix-build-with-older-binutils.patch
+module-don-t-unlink-the-module-until-we-ve-removed-all-exposure.patch