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: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
da19cbcf71
commit
00a41db522
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue