[MTD] add get_mtd_device_nm() function
authorArtem Bityutskiy <dedekind@infradead.org>
Wed, 11 Oct 2006 11:52:44 +0000 (14:52 +0300)
committerArtem Bityutskiy <dedekind@infradead.org>
Wed, 29 Nov 2006 15:04:31 +0000 (17:04 +0200)
This patch adds one more function to the MTD interface to make it possible to
open MTD devices by their names, not only numbers. This is very handy in many
situations. Also, MTD device number depend on load order and may vary, while
names are fixed.

Signed-off-by: Artem Bityutskiy <dedekind@infradead.org>
drivers/mtd/mtdcore.c
include/linux/mtd/mtd.h

index c4d26de74349e55f9ae32269ff780b0dde50e767..06ec9f836ae5955a4974e1ec01bb485bdfd99c3d 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/timer.h>
 #include <linux/major.h>
 #include <linux/fs.h>
+#include <linux/err.h>
 #include <linux/ioctl.h>
 #include <linux/init.h>
 #include <linux/mtd/compatmac.h>
@@ -223,6 +224,42 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num)
        return ret;
 }
 
+/**
+ *     get_mtd_device_nm - obtain a validated handle for an MTD device by
+ *     device name
+ *     @name: MTD device name to open
+ *
+ *     This function returns MTD device description structure in case of
+ *     success and an error code in case of failure.
+ */
+
+struct mtd_info *get_mtd_device_nm(const char *name)
+{
+       int i;
+       struct mtd_info *mtd = ERR_PTR(-ENODEV);
+
+       mutex_lock(&mtd_table_mutex);
+
+       for (i = 0; i < MAX_MTD_DEVICES; i++) {
+               if (mtd_table[i] && !strcmp(name, mtd_table[i]->name)) {
+                       mtd = mtd_table[i];
+                       break;
+               }
+       }
+
+       if (i == MAX_MTD_DEVICES)
+               goto out_unlock;
+
+       if (!try_module_get(mtd->owner))
+               goto out_unlock;
+
+       mtd->usecount++;
+
+out_unlock:
+       mutex_unlock(&mtd_table_mutex);
+       return mtd;
+}
+
 void put_mtd_device(struct mtd_info *mtd)
 {
        int c;
@@ -267,6 +304,7 @@ int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
 EXPORT_SYMBOL(add_mtd_device);
 EXPORT_SYMBOL(del_mtd_device);
 EXPORT_SYMBOL(get_mtd_device);
+EXPORT_SYMBOL(get_mtd_device_nm);
 EXPORT_SYMBOL(put_mtd_device);
 EXPORT_SYMBOL(register_mtd_user);
 EXPORT_SYMBOL(unregister_mtd_user);
index 18acb6d0033b07ff2943bfb3e61dd918f4b1bc11..89e937dfef55d2859448a21b6abae4d3f1820a26 100644 (file)
@@ -216,6 +216,7 @@ 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 struct mtd_info *get_mtd_device_nm(const char *name);
 
 extern void put_mtd_device(struct mtd_info *mtd);