59 lines
2.1 KiB
Diff
59 lines
2.1 KiB
Diff
|
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
|
||
|
@@ -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
|