mtd: create unlocked versions of {get,put}_mtd_device
authorMaxim Levitsky <maximlevitsky@gmail.com>
Mon, 22 Feb 2010 18:39:28 +0000 (20:39 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 26 Feb 2010 17:03:15 +0000 (17:03 +0000)
Use these only if you know that you already hold mtd_table_mutex

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

index b3b98d1fffc38c52bad40e0d5b9e42d3e67f17d3..67669a76eaf5d028d56c55d70301daebb8f200bc 100644 (file)
@@ -463,27 +463,38 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num)
                        ret = NULL;
        }
 
-       if (!ret)
-               goto out_unlock;
-
-       if (!try_module_get(ret->owner))
-               goto out_unlock;
-
-       if (ret->get_device) {
-               err = ret->get_device(ret);
-               if (err)
-                       goto out_put;
+       if (!ret) {
+               ret = ERR_PTR(err);
+               goto out;
        }
 
-       ret->usecount++;
+       err = __get_mtd_device(ret);
+       if (err)
+               ret = ERR_PTR(err);
+out:
        mutex_unlock(&mtd_table_mutex);
        return ret;
+}
 
-out_put:
-       module_put(ret->owner);
-out_unlock:
-       mutex_unlock(&mtd_table_mutex);
-       return ERR_PTR(err);
+
+int __get_mtd_device(struct mtd_info *mtd)
+{
+       int err;
+
+       if (!try_module_get(mtd->owner))
+               return -ENODEV;
+
+       if (mtd->get_device) {
+
+               err = mtd->get_device(mtd);
+
+               if (err) {
+                       module_put(mtd->owner);
+                       return err;
+               }
+       }
+       mtd->usecount++;
+       return 0;
 }
 
 /**
@@ -534,14 +545,19 @@ out_unlock:
 
 void put_mtd_device(struct mtd_info *mtd)
 {
-       int c;
-
        mutex_lock(&mtd_table_mutex);
-       c = --mtd->usecount;
+       __put_mtd_device(mtd);
+       mutex_unlock(&mtd_table_mutex);
+
+}
+
+void __put_mtd_device(struct mtd_info *mtd)
+{
+       --mtd->usecount;
+       BUG_ON(mtd->usecount < 0);
+
        if (mtd->put_device)
                mtd->put_device(mtd);
-       mutex_unlock(&mtd_table_mutex);
-       BUG_ON(c < 0);
 
        module_put(mtd->owner);
 }
@@ -579,7 +595,9 @@ EXPORT_SYMBOL_GPL(add_mtd_device);
 EXPORT_SYMBOL_GPL(del_mtd_device);
 EXPORT_SYMBOL_GPL(get_mtd_device);
 EXPORT_SYMBOL_GPL(get_mtd_device_nm);
+EXPORT_SYMBOL_GPL(__get_mtd_device);
 EXPORT_SYMBOL_GPL(put_mtd_device);
+EXPORT_SYMBOL_GPL(__put_mtd_device);
 EXPORT_SYMBOL_GPL(register_mtd_user);
 EXPORT_SYMBOL_GPL(unregister_mtd_user);
 EXPORT_SYMBOL_GPL(default_mtd_writev);
index ba53ecca107ccc2d6e7224a0a56408d43089b1b9..11d8e68d17c071b68cb9ecb687255363ca70fe30 100644 (file)
@@ -289,8 +289,9 @@ extern int add_mtd_device(struct mtd_info *mtd);
 extern int del_mtd_device (struct mtd_info *mtd);
 
 extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
+extern int __get_mtd_device(struct mtd_info *mtd);
+extern void __put_mtd_device(struct mtd_info *mtd);
 extern struct mtd_info *get_mtd_device_nm(const char *name);
-
 extern void put_mtd_device(struct mtd_info *mtd);