aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch')
-rw-r--r--target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch b/target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch
new file mode 100644
index 0000000000..0d3e10ac20
--- /dev/null
+++ b/target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch
@@ -0,0 +1,96 @@
+From 97519dc52b44af054d7654776e78eaa211cf1842 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Wed, 21 Jun 2017 08:26:45 +0200
+Subject: [PATCH] mtd: partitions: add support for subpartitions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some flash device partitions can be containers with extra subpartitions
+(volumes). All callbacks are already capable of this additional level of
+indirection.
+
+This patch makes sure we always display subpartitions using a tree
+structure and takes care of deleting subpartitions when parent gets
+removed.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+---
+ drivers/mtd/mtdpart.c | 23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -413,7 +413,7 @@ static struct mtd_part *allocate_partiti
+ * parent conditional on that option. Note, this is a way to
+ * distinguish between the master and the partition in sysfs.
+ */
+- slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) ?
++ slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) || mtd_is_partition(parent) ?
+ &parent->dev :
+ parent->dev.parent;
+ slave->mtd.dev.of_node = part->of_node;
+@@ -664,8 +664,17 @@ EXPORT_SYMBOL_GPL(mtd_add_partition);
+ */
+ static int __mtd_del_partition(struct mtd_part *priv)
+ {
++ struct mtd_part *child, *next;
+ int err;
+
++ list_for_each_entry_safe(child, next, &mtd_partitions, list) {
++ if (child->parent == &priv->mtd) {
++ err = __mtd_del_partition(child);
++ if (err)
++ return err;
++ }
++ }
++
+ sysfs_remove_files(&priv->mtd.dev.kobj, mtd_partition_attrs);
+
+ err = del_mtd_device(&priv->mtd);
+@@ -680,16 +689,16 @@ static int __mtd_del_partition(struct mt
+
+ /*
+ * This function unregisters and destroy all slave MTD objects which are
+- * attached to the given master MTD object.
++ * attached to the given MTD object.
+ */
+-int del_mtd_partitions(struct mtd_info *master)
++int del_mtd_partitions(struct mtd_info *mtd)
+ {
+ struct mtd_part *slave, *next;
+ int ret, err = 0;
+
+ mutex_lock(&mtd_partitions_mutex);
+ list_for_each_entry_safe(slave, next, &mtd_partitions, list)
+- if (slave->parent == master) {
++ if (slave->parent == mtd) {
+ ret = __mtd_del_partition(slave);
+ if (ret < 0)
+ err = ret;
+@@ -699,14 +708,14 @@ int del_mtd_partitions(struct mtd_info *
+ return err;
+ }
+
+-int mtd_del_partition(struct mtd_info *master, int partno)
++int mtd_del_partition(struct mtd_info *mtd, int partno)
+ {
+ struct mtd_part *slave, *next;
+ int ret = -EINVAL;
+
+ mutex_lock(&mtd_partitions_mutex);
+ list_for_each_entry_safe(slave, next, &mtd_partitions, list)
+- if ((slave->parent == master) &&
++ if ((slave->parent == mtd) &&
+ (slave->mtd.index == partno)) {
+ ret = __mtd_del_partition(slave);
+ break;
+@@ -939,6 +948,6 @@ uint64_t mtd_get_device_size(const struc
+ if (!mtd_is_partition(mtd))
+ return mtd->size;
+
+- return mtd_to_part(mtd)->parent->size;
++ return mtd_get_device_size(mtd_to_part(mtd)->parent);
+ }
+ EXPORT_SYMBOL_GPL(mtd_get_device_size);