You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.1 KiB
58 lines
2.1 KiB
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
|
|
|