12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- From 1186af457cc186c5ed01708da71b1ffbdf0a2638 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
- 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 <rafal@milecki.pl>
- Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
- ---
- 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
- @@ -652,6 +652,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
|