From e24983e710dd7a22909e26af1ad8ee8d027b5c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 3 Dec 2018 10:33:36 +0100 Subject: kernel: backport 2 mtd partitioning fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This improves handling of subpartitions. Signed-off-by: Rafał Miłecki --- ...-original-flags-for-every-struct-mtd_info.patch | 58 ++++++++++++++++++++++ ...-calculating-partition-boundaries-when-ch.patch | 55 ++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 target/linux/generic/backport-4.14/047-v4.21-mtd-keep-original-flags-for-every-struct-mtd_info.patch create mode 100644 target/linux/generic/backport-4.14/048-v4.21-mtd-improve-calculating-partition-boundaries-when-ch.patch (limited to 'target/linux/generic/backport-4.14') diff --git a/target/linux/generic/backport-4.14/047-v4.21-mtd-keep-original-flags-for-every-struct-mtd_info.patch b/target/linux/generic/backport-4.14/047-v4.21-mtd-keep-original-flags-for-every-struct-mtd_info.patch new file mode 100644 index 0000000000..7f90cf946a --- /dev/null +++ b/target/linux/generic/backport-4.14/047-v4.21-mtd-keep-original-flags-for-every-struct-mtd_info.patch @@ -0,0 +1,58 @@ +From 1186af457cc186c5ed01708da71b1ffbdf0a2638 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 20 Nov 2018 09:55:45 +0100 +Subject: [PATCH] mtd: keep original flags for every struct mtd_info +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When allocating a new partition mtd subsystem runs internal tests in the +allocate_partition(). They may result in modifying specified flags (e.g. +dropping some /features/ like write access). + +Those constraints don't have to be necessary true for subpartitions. It +may happen parent partition isn't block aligned (effectively disabling +write access) while subpartition may fit blocks nicely. In such case all +checks should be run again (starting with original flags value). + +Signed-off-by: Rafał Miłecki +Signed-off-by: Boris Brezillon +--- + drivers/mtd/mtdcore.c | 2 ++ + drivers/mtd/mtdpart.c | 3 ++- + include/linux/mtd/mtd.h | 1 + + 3 files changed, 5 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/mtdcore.c ++++ b/drivers/mtd/mtdcore.c +@@ -650,6 +650,8 @@ static void mtd_set_dev_defaults(struct + } else { + pr_debug("mtd device won't show a device symlink in sysfs\n"); + } ++ ++ mtd->orig_flags = mtd->flags; + } + + /** +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -394,7 +394,8 @@ static struct mtd_part *allocate_partiti + + /* set up the MTD object for this partition */ + slave->mtd.type = parent->type; +- slave->mtd.flags = parent->flags & ~part->mask_flags; ++ slave->mtd.flags = parent->orig_flags & ~part->mask_flags; ++ slave->mtd.orig_flags = slave->mtd.flags; + slave->mtd.size = part->size; + slave->mtd.writesize = parent->writesize; + slave->mtd.writebufsize = parent->writebufsize; +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -218,6 +218,7 @@ struct mtd_debug_info { + struct mtd_info { + u_char type; + uint32_t flags; ++ uint32_t orig_flags; /* Flags as before running mtd checks */ + uint64_t size; // Total size of the MTD + + /* "Major" erase size for the device. Naïve users may take this diff --git a/target/linux/generic/backport-4.14/048-v4.21-mtd-improve-calculating-partition-boundaries-when-ch.patch b/target/linux/generic/backport-4.14/048-v4.21-mtd-improve-calculating-partition-boundaries-when-ch.patch new file mode 100644 index 0000000000..58163e6935 --- /dev/null +++ b/target/linux/generic/backport-4.14/048-v4.21-mtd-improve-calculating-partition-boundaries-when-ch.patch @@ -0,0 +1,55 @@ +From 6750f61a13a0197c40e4a40739117493b15f19e8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 20 Nov 2018 10:24:09 +0100 +Subject: [PATCH] mtd: improve calculating partition boundaries when checking + for alignment +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When checking for alignment mtd should check absolute offsets. It's +important for subpartitions as it doesn't make sense to check their +relative addresses. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Boris Brezillon +--- + drivers/mtd/mtdpart.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_pa + return container_of(mtd, struct mtd_part, mtd); + } + ++static u64 part_absolute_offset(struct mtd_info *mtd) ++{ ++ struct mtd_part *part = mtd_to_part(mtd); ++ ++ if (!mtd_is_partition(mtd)) ++ return 0; ++ ++ return part_absolute_offset(part->parent) + part->offset; ++} + + /* + * MTD methods which simply translate the effective address and pass through +@@ -562,7 +571,7 @@ static struct mtd_part *allocate_partiti + if (!(slave->mtd.flags & MTD_NO_ERASE)) + wr_alignment = slave->mtd.erasesize; + +- tmp = slave->offset; ++ tmp = part_absolute_offset(parent) + slave->offset; + remainder = do_div(tmp, wr_alignment); + if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { + /* Doesn't start on a boundary of major erase size */ +@@ -573,7 +582,7 @@ static struct mtd_part *allocate_partiti + part->name); + } + +- tmp = slave->mtd.size; ++ tmp = part_absolute_offset(parent) + slave->mtd.size; + remainder = do_div(tmp, wr_alignment); + if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { + slave->mtd.flags &= ~MTD_WRITEABLE; -- cgit v1.2.3