summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/core.c2
-rw-r--r--drivers/mtd/partition.c8
-rw-r--r--fs/devfs-core.c30
3 files changed, 23 insertions, 17 deletions
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index 95044d57de..36a363fa37 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -409,7 +409,7 @@ int add_mtd_device(struct mtd_info *mtd, char *devname, int device_id)
devfs_create(&mtd->cdev);
- if (mtd->parent)
+ if (mtd->parent && !mtd->master)
of_parse_partitions(&mtd->cdev, mtd->parent->device_node);
list_for_each_entry(hook, &mtd_register_hooks, hook)
diff --git a/drivers/mtd/partition.c b/drivers/mtd/partition.c
index 3d2fac6855..351c5831b0 100644
--- a/drivers/mtd/partition.c
+++ b/drivers/mtd/partition.c
@@ -125,6 +125,11 @@ struct mtd_info *mtd_add_partition(struct mtd_info *mtd, off_t offset, size_t si
part->master_offset = offset;
part->master = mtd;
+ if (!strncmp(mtd->cdev.name, name, strlen(mtd->cdev.name)))
+ part->cdev.partname = xstrdup(name + strlen(mtd->cdev.name) + 1);
+
+ add_mtd_device(part, part->name, DEVICE_ID_SINGLE);
+
return part;
}
@@ -133,6 +138,9 @@ int mtd_del_partition(struct mtd_info *part)
if (!part->master)
return -EINVAL;
+ del_mtd_device(part);
+
+ free(part->cdev.partname);
free(part->name);
free(part);
diff --git a/fs/devfs-core.c b/fs/devfs-core.c
index 44f0169e63..bd6d482867 100644
--- a/fs/devfs-core.c
+++ b/fs/devfs-core.c
@@ -276,6 +276,15 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
if (offset + size > cdev->size)
return ERR_PTR(-EINVAL);
+ if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD) && cdev->mtd) {
+ struct mtd_info *mtd;
+
+ mtd = mtd_add_partition(cdev->mtd, offset, size, flags, name);
+ if (IS_ERR(mtd))
+ return (void *)mtd;
+ return 0;
+ }
+
new = xzalloc(sizeof (*new));
new->name = strdup(name);
if (!strncmp(devname, name, strlen(devname)))
@@ -287,17 +296,6 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
new->dev = cdev->dev;
new->flags = flags | DEVFS_IS_PARTITION;
-#ifdef CONFIG_PARTITION_NEED_MTD
- if (cdev->mtd) {
- new->mtd = mtd_add_partition(cdev->mtd, offset, size, flags, name);
- if (IS_ERR(new->mtd)) {
- int ret = PTR_ERR(new->mtd);
- free(new);
- return ERR_PTR(ret);
- }
- }
-#endif
-
devfs_create(new);
return new;
@@ -312,16 +310,16 @@ int devfs_del_partition(const char *name)
if (!cdev)
return -ENOENT;
+ if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD) && cdev->mtd) {
+ ret = mtd_del_partition(cdev->mtd);
+ return ret;
+ }
+
if (!(cdev->flags & DEVFS_IS_PARTITION))
return -EINVAL;
if (cdev->flags & DEVFS_PARTITION_FIXED)
return -EPERM;
-#ifdef CONFIG_PARTITION_NEED_MTD
- if (cdev->mtd)
- mtd_del_partition(cdev->mtd);
-#endif
-
ret = devfs_remove(cdev);
if (ret)
return ret;