mtd: call the remove notifiers before assuming it is in use
authorMaxim Levitsky <maximlevitsky@gmail.com>
Mon, 22 Feb 2010 18:39:32 +0000 (20:39 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 26 Feb 2010 17:37:10 +0000 (17:37 +0000)
Now that mtd block common layer is prepared for proper hotplug support,
enable it here

Now all users of the mtd device have a chance to put the mtd device
when they are notified to do so, and they have to do so to make hotplug work.

[dwmw2: There's more work to be done to fix hotplug in the general case, but
        this is a reasonable start]

Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/mtdcore.c

index 67669a76eaf5d028d56c55d70301daebb8f200bc..70a78587c3c072521d1a1ed70464f6c473d31f15 100644 (file)
@@ -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;
 }