/* * get a superblock on an MTD-backed filesystem by MTD device number */ static int get_sb_mtd_nr(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, int mtdnr, int (*fill_super)(struct super_block *, void *, int), struct vfsmount *mnt) { struct mtd_info *mtd; mtd = get_mtd_device(NULL, mtdnr); if (IS_ERR(mtd)) { DEBUG(0, "MTDSB: Device #%u doesn't appear to exist\n", mtdnr); return PTR_ERR(mtd); } return get_sb_mtd_aux(fs_type, flags, dev_name, data, mtd, fill_super, mnt); }
/* * set up an MTD-based superblock */ int get_sb_mtd(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, int (*fill_super)(struct super_block *, void *, int), struct vfsmount *mnt) { #ifdef CONFIG_BLOCK struct block_device *bdev; int ret, major; #endif int mtdnr; if (!dev_name) return -EINVAL; DEBUG(2, "MTDSB: dev_name \"%s\"\n", dev_name); /* the preferred way of mounting in future; especially when * CONFIG_BLOCK=n - we specify the underlying MTD device by number or * by name, so that we don't require block device support to be present * in the kernel. */ if (dev_name[0] == 'm' && dev_name[1] == 't' && dev_name[2] == 'd') { if (dev_name[3] == ':') { struct mtd_info *mtd; /* mount by MTD device name */ DEBUG(1, "MTDSB: mtd:%%s, name \"%s\"\n", dev_name + 4); mtd = get_mtd_device_nm(dev_name + 4); if (!IS_ERR(mtd)) return get_sb_mtd_aux( fs_type, flags, dev_name, data, mtd, fill_super, mnt); printk(KERN_NOTICE "MTD:" " MTD device with name \"%s\" not found.\n", dev_name + 4); } else if (isdigit(dev_name[3])) { /* mount by MTD device number name */ char *endptr; mtdnr = simple_strtoul(dev_name + 3, &endptr, 0); if (!*endptr) { /* It was a valid number */ DEBUG(1, "MTDSB: mtd%%d, mtdnr %d\n", mtdnr); return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, mnt); } } } #ifdef CONFIG_BLOCK /* try the old way - the hack where we allowed users to mount * /dev/mtdblock$(n) but didn't actually _use_ the blockdev */ bdev = lookup_bdev(dev_name); if (IS_ERR(bdev)) { ret = PTR_ERR(bdev); DEBUG(1, "MTDSB: lookup_bdev() returned %d\n", ret); return ret; } DEBUG(1, "MTDSB: lookup_bdev() returned 0\n"); ret = -EINVAL; major = MAJOR(bdev->bd_dev); mtdnr = MINOR(bdev->bd_dev); bdput(bdev); if (major != MTD_BLOCK_MAJOR) goto not_an_MTD_device; return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, mnt); not_an_MTD_device: #endif /* CONFIG_BLOCK */ if (!(flags & MS_SILENT)) printk(KERN_NOTICE "MTD: Attempt to mount non-MTD device \"%s\"\n", dev_name); return -EINVAL; }
int get_sb_mtd(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, int (*fill_super)(struct super_block *, void *, int), struct vfsmount *mnt) { #ifdef CONFIG_BLOCK struct block_device *bdev; int ret, major; #endif int mtdnr; if (!dev_name) return -EINVAL; DEBUG(2, "MTDSB: dev_name \"%s\"\n", dev_name); if (dev_name[0] == 'm' && dev_name[1] == 't' && dev_name[2] == 'd') { if (dev_name[3] == ':') { struct mtd_info *mtd; DEBUG(1, "MTDSB: mtd:%%s, name \"%s\"\n", dev_name + 4); for (mtdnr = 0; mtdnr < MAX_MTD_DEVICES; mtdnr++) { mtd = get_mtd_device(NULL, mtdnr); if (!IS_ERR(mtd)) { if (!strcmp(mtd->name, dev_name + 4)) return get_sb_mtd_aux( fs_type, flags, dev_name, data, mtd, fill_super, mnt); put_mtd_device(mtd); } } printk(KERN_NOTICE "MTD:" " MTD device with name \"%s\" not found.\n", dev_name + 4); } else if (isdigit(dev_name[3])) { char *endptr; mtdnr = simple_strtoul(dev_name + 3, &endptr, 0); if (!*endptr) { DEBUG(1, "MTDSB: mtd%%d, mtdnr %d\n", mtdnr); return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, mnt); } } } #ifdef CONFIG_BLOCK bdev = lookup_bdev(dev_name); if (IS_ERR(bdev)) { ret = PTR_ERR(bdev); DEBUG(1, "MTDSB: lookup_bdev() returned %d\n", ret); return ret; } DEBUG(1, "MTDSB: lookup_bdev() returned 0\n"); ret = -EINVAL; major = MAJOR(bdev->bd_dev); mtdnr = MINOR(bdev->bd_dev); bdput(bdev); if (major != MTD_BLOCK_MAJOR) goto not_an_MTD_device; return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, mnt); not_an_MTD_device: #endif if (!(flags & MS_SILENT)) printk(KERN_NOTICE "MTD: Attempt to mount non-MTD device \"%s\"\n", dev_name); return -EINVAL; }