Commit 63e4a8ee authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

greybus: module: fix double free of module

Also properly clean up all modules when you remove a host driver
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 060b93dd
...@@ -190,6 +190,13 @@ void gb_add_module(struct greybus_host_device *hd, u8 module_id, ...@@ -190,6 +190,13 @@ void gb_add_module(struct greybus_host_device *hd, u8 module_id,
greybus_module_release(&gmod->dev); greybus_module_release(&gmod->dev);
} }
static void gb_delete_module(struct gb_module *gmod)
{
/* FIXME - tear down interfaces first */
device_del(&gmod->dev);
}
void gb_remove_module(struct greybus_host_device *hd, u8 module_id) void gb_remove_module(struct greybus_host_device *hd, u8 module_id)
{ {
struct gb_module *gmod; struct gb_module *gmod;
...@@ -202,15 +209,18 @@ void gb_remove_module(struct greybus_host_device *hd, u8 module_id) ...@@ -202,15 +209,18 @@ void gb_remove_module(struct greybus_host_device *hd, u8 module_id)
} }
if (found) if (found)
greybus_remove_device(gmod); gb_delete_module(gmod);
else else
dev_err(hd->parent, "module id %d remove error\n", module_id); dev_err(hd->parent, "module id %d remove error\n", module_id);
} }
void greybus_remove_device(struct gb_module *gmod) static void gb_remove_modules(struct greybus_host_device *hd)
{ {
device_del(&gmod->dev); struct gb_module *gmod, *temp;
put_device(&gmod->dev);
list_for_each_entry_safe(gmod, temp, &hd->modules, links) {
gb_delete_module(gmod);
}
} }
static DEFINE_MUTEX(hd_mutex); static DEFINE_MUTEX(hd_mutex);
...@@ -248,6 +258,7 @@ EXPORT_SYMBOL_GPL(greybus_create_hd); ...@@ -248,6 +258,7 @@ EXPORT_SYMBOL_GPL(greybus_create_hd);
void greybus_remove_hd(struct greybus_host_device *hd) void greybus_remove_hd(struct greybus_host_device *hd)
{ {
gb_remove_modules(hd);
kref_put_mutex(&hd->kref, free_hd, &hd_mutex); kref_put_mutex(&hd->kref, free_hd, &hd_mutex);
} }
EXPORT_SYMBOL_GPL(greybus_remove_hd); EXPORT_SYMBOL_GPL(greybus_remove_hd);
......
...@@ -242,8 +242,6 @@ void greybus_deregister(struct greybus_driver *driver); ...@@ -242,8 +242,6 @@ void greybus_deregister(struct greybus_driver *driver);
int greybus_disabled(void); int greybus_disabled(void);
void greybus_remove_device(struct gb_module *gmod);
/* Internal functions to gb module, move to internal .h file eventually. */ /* Internal functions to gb module, move to internal .h file eventually. */
void gb_add_module(struct greybus_host_device *hd, u8 module_id, void gb_add_module(struct greybus_host_device *hd, u8 module_id,
......
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