Commit 00a41db5 authored by Badari Pulavarty's avatar Badari Pulavarty Committed by Greg Kroah-Hartman

driver core: register_memory/unregister_memory clean ups and bugfix

register_memory()/unregister_memory() never gets called with
"root". unregister_memory() is accessing kobject_name of
the object just freed up. Since no one uses the code,
lets take the code out. And also, make register_memory() static.

Another bug fix - before calling unregister_memory()
remove_memory_block() gets a ref on kobject. unregister_memory()
need to drop that ref before calling sysdev_unregister().
Signed-off-by: default avatarBadari Pulavarty <pbadari@us.ibm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent da19cbcf
...@@ -62,8 +62,8 @@ void unregister_memory_notifier(struct notifier_block *nb) ...@@ -62,8 +62,8 @@ void unregister_memory_notifier(struct notifier_block *nb)
/* /*
* register_memory - Setup a sysfs device for a memory block * register_memory - Setup a sysfs device for a memory block
*/ */
int register_memory(struct memory_block *memory, struct mem_section *section, static
struct node *root) int register_memory(struct memory_block *memory, struct mem_section *section)
{ {
int error; int error;
...@@ -71,26 +71,18 @@ int register_memory(struct memory_block *memory, struct mem_section *section, ...@@ -71,26 +71,18 @@ int register_memory(struct memory_block *memory, struct mem_section *section,
memory->sysdev.id = __section_nr(section); memory->sysdev.id = __section_nr(section);
error = sysdev_register(&memory->sysdev); error = sysdev_register(&memory->sysdev);
if (root && !error)
error = sysfs_create_link(&root->sysdev.kobj,
&memory->sysdev.kobj,
kobject_name(&memory->sysdev.kobj));
return error; return error;
} }
static void static void
unregister_memory(struct memory_block *memory, struct mem_section *section, unregister_memory(struct memory_block *memory, struct mem_section *section)
struct node *root)
{ {
BUG_ON(memory->sysdev.cls != &memory_sysdev_class); BUG_ON(memory->sysdev.cls != &memory_sysdev_class);
BUG_ON(memory->sysdev.id != __section_nr(section)); BUG_ON(memory->sysdev.id != __section_nr(section));
/* drop the ref. we got in remove_memory_block() */
kobject_put(&memory->sysdev.kobj);
sysdev_unregister(&memory->sysdev); sysdev_unregister(&memory->sysdev);
if (root)
sysfs_remove_link(&root->sysdev.kobj,
kobject_name(&memory->sysdev.kobj));
} }
/* /*
...@@ -345,7 +337,7 @@ static int add_memory_block(unsigned long node_id, struct mem_section *section, ...@@ -345,7 +337,7 @@ static int add_memory_block(unsigned long node_id, struct mem_section *section,
mutex_init(&mem->state_mutex); mutex_init(&mem->state_mutex);
mem->phys_device = phys_device; mem->phys_device = phys_device;
ret = register_memory(mem, section, NULL); ret = register_memory(mem, section);
if (!ret) if (!ret)
ret = mem_create_simple_file(mem, phys_index); ret = mem_create_simple_file(mem, phys_index);
if (!ret) if (!ret)
...@@ -396,7 +388,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section, ...@@ -396,7 +388,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
mem_remove_simple_file(mem, phys_index); mem_remove_simple_file(mem, phys_index);
mem_remove_simple_file(mem, state); mem_remove_simple_file(mem, state);
mem_remove_simple_file(mem, phys_device); mem_remove_simple_file(mem, phys_device);
unregister_memory(mem, section, NULL); unregister_memory(mem, section);
return 0; return 0;
} }
......
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