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 | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/fs/super.c b/fs/super.c index 97a17f9d9023..df7a6cfa34d3 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,32 @@ int setup_bdev_super(struct super_block *sb, int sb_flags, } EXPORT_SYMBOL_GPL(setup_bdev_super); +static int translate_mtd_name(struct fs_context *fc) +{ +#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); + return 0; + } +#endif + return 0; +} + /** * get_tree_bdev_flags - Get a superblock based on a single block device * @fc: The filesystem context holding the parameters @@ -1612,6 +1639,9 @@ int get_tree_bdev_flags(struct fs_context *fc, if (!fc->source) return invalf(fc, "No source specified"); + error = translate_mtd_name(fc); + if (error) + return error; error = lookup_bdev(fc->source, &dev); if (error) { if (!(flags & GET_TREE_BDEV_QUIET_LOOKUP)) -- 2.49.0