This enables mounting, like JFFS2, MTD devices by "label": mount -t squashfs mtd:appfs /tmp where mtd:appfs comes from: # > cat /proc/mtd dev: size erasesize name ... mtd22: 00750000 00010000 "appfs" Signed-off-by: Joakim Tjernlund <joakim.tjernlund@xxxxxxxxxxxx> --- fs/super.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/fs/super.c b/fs/super.c index 97a17f9d9023..8c3aa2f05b42 100644 --- a/fs/super.c +++ b/fs/super.c @@ -37,6 +37,7 @@ #include <linux/user_namespace.h> #include <linux/fs_context.h> #include <uapi/linux/mount.h> +#include <linux/mtd/mtd.h> #include "internal.h" static int thaw_super_locked(struct super_block *sb, enum freeze_holder who); @@ -1595,6 +1596,30 @@ int setup_bdev_super(struct super_block *sb, int sb_flags, } EXPORT_SYMBOL_GPL(setup_bdev_super); +void translate_mtd_name(void) +{ +#ifdef CONFIG_MTD_BLOCK + if (!strncmp(fc->source, "mtd:", 4)) { + struct mtd_info *mtd; + char *blk_source; + + /* mount by MTD device name */ + pr_debug("Block SB: name \"%s\"\n", fc->source); + + mtd = get_mtd_device_nm(fc->source + 4); + if (IS_ERR(mtd)) + return -EINVAL; + blk_source = kmalloc(20, GFP_KERNEL); + if (!blk_source) + return -ENOMEM; + sprintf(blk_source, "/dev/mtdblock%d", mtd->index); + kfree(fc->source); + fc->source = blk_source; + pr_debug("MTD device:%s found\n", fc->source); + } +#endif +} + /** * get_tree_bdev_flags - Get a superblock based on a single block device * @fc: The filesystem context holding the parameters @@ -1612,6 +1637,7 @@ int get_tree_bdev_flags(struct fs_context *fc, if (!fc->source) return invalf(fc, "No source specified"); + translate_mtd_name(); error = lookup_bdev(fc->source, &dev); if (error) { if (!(flags & GET_TREE_BDEV_QUIET_LOOKUP)) -- 2.49.0