mtd: call the remove notifiers before assuming it is in use

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Fri Feb 26 13:59:02 EST 2010


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=75c0b84d41c6f08c0cb083464907005683ef2920
Commit:     75c0b84d41c6f08c0cb083464907005683ef2920
Parent:     298304f1a554d44cf13391e531ced3cde69a8ce4
Author:     Maxim Levitsky <maximlevitsky at gmail.com>
AuthorDate: Mon Feb 22 20:39:32 2010 +0200
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Fri Feb 26 17:37:10 2010 +0000

    mtd: call the remove notifiers before assuming it is in use
    
    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 at gmail.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 drivers/mtd/mtdcore.c |   19 +++++++++++--------
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 67669a7..70a7858 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -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;
 }



More information about the linux-mtd-cvs mailing list