summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSeth Jennings <sjenning@linux.vnet.ibm.com>2013-08-20 12:13:02 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-21 11:49:47 -0700
commit37171e3cb7a2f6fc594b524c940beb1ce85cc935 (patch)
tree16fe5b67c4ef5e25bce7ebbf1fee2f173311a3f4
parent37a7bd6255b415afe197489b5cd1f9568a7ae058 (diff)
downloadlinux-37171e3cb7a2f6fc594b524c940beb1ce85cc935.tar.bz2
drivers: base: remove improper get/put in add_memory_section()
The path through add_memory_section() when the memory block already exists uses flawed refcounting logic. A get_device() is done on a memory block using a pointer that might not be valid as we dropped our previous reference and didn't obtain a new reference in the proper way. Lets stop pretending and just remove the get/put. The mem_sysfs_mutex, which we hold over the entire init loop now, will prevent the memory blocks from disappearing from under us. Signed-off-by: Seth Jennings <sjenning@linux.vnet.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/base/memory.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
index a9e9c0902cce..9438d541b5c3 100644
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -613,14 +613,12 @@ static int add_memory_section(struct mem_section *section,
if (scn_nr >= (*mem_p)->start_section_nr &&
scn_nr <= (*mem_p)->end_section_nr) {
mem = *mem_p;
- get_device(&mem->dev);
}
}
- if (mem) {
+ if (mem)
mem->section_count++;
- put_device(&mem->dev);
- } else {
+ else {
ret = init_memory_block(&mem, section, MEM_ONLINE);
/* store memory_block pointer for next loop */
if (!ret && mem_p)