|
@@ -350,31 +350,34 @@ fail_locked:
|
|
|
int del_mtd_device (struct mtd_info *mtd)
|
|
|
{
|
|
|
int ret;
|
|
|
+ struct mtd_notifier *not;
|
|
|
|
|
|
mutex_lock(&mtd_table_mutex);
|
|
|
|
|
|
if (idr_find(&mtd_idr, mtd->index) != mtd) {
|
|
|
ret = -ENODEV;
|
|
|
- } else if (mtd->usecount) {
|
|
|
+ goto out_error;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* No need to get a refcount on the module containing
|
|
|
+ the notifier, since we hold the mtd_table_mutex */
|
|
|
+ list_for_each_entry(not, &mtd_notifiers, list)
|
|
|
+ not->remove(mtd);
|
|
|
+
|
|
|
+ if (mtd->usecount) {
|
|
|
printk(KERN_NOTICE "Removing MTD device #%d (%s) with use count %d\n",
|
|
|
mtd->index, mtd->name, mtd->usecount);
|
|
|
ret = -EBUSY;
|
|
|
} else {
|
|
|
- struct mtd_notifier *not;
|
|
|
-
|
|
|
device_unregister(&mtd->dev);
|
|
|
|
|
|
- /* No need to get a refcount on the module containing
|
|
|
- the notifier, since we hold the mtd_table_mutex */
|
|
|
- list_for_each_entry(not, &mtd_notifiers, list)
|
|
|
- not->remove(mtd);
|
|
|
-
|
|
|
idr_remove(&mtd_idr, mtd->index);
|
|
|
|
|
|
module_put(THIS_MODULE);
|
|
|
ret = 0;
|
|
|
}
|
|
|
|
|
|
+out_error:
|
|
|
mutex_unlock(&mtd_table_mutex);
|
|
|
return ret;
|
|
|
}
|