Commit 37171e3c authored by Seth Jennings's avatar Seth Jennings Committed by Greg Kroah-Hartman

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: default avatarSeth Jennings <sjenning@linux.vnet.ibm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 37a7bd62
...@@ -613,14 +613,12 @@ static int add_memory_section(struct mem_section *section, ...@@ -613,14 +613,12 @@ static int add_memory_section(struct mem_section *section,
if (scn_nr >= (*mem_p)->start_section_nr && if (scn_nr >= (*mem_p)->start_section_nr &&
scn_nr <= (*mem_p)->end_section_nr) { scn_nr <= (*mem_p)->end_section_nr) {
mem = *mem_p; mem = *mem_p;
get_device(&mem->dev);
} }
} }
if (mem) { if (mem)
mem->section_count++; mem->section_count++;
put_device(&mem->dev); else {
} else {
ret = init_memory_block(&mem, section, MEM_ONLINE); ret = init_memory_block(&mem, section, MEM_ONLINE);
/* store memory_block pointer for next loop */ /* store memory_block pointer for next loop */
if (!ret && mem_p) if (!ret && mem_p)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment