mtd: improve calculating partition boundaries when checking for alignment
PATCH 1/1 mtd: improve calculating partition boundaries when checking for alignment
From: Rafał Miłecki <[email protected]>
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.
--- drivers/mtd/mtdpart.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/mtd/mtdpart.c +11 -2
@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd) return container_of(mtd, struct mtd_part, mtd); } +static uint64_t 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
@@ -514,7 +523,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,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 */
@@ -525,7 +534,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, 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 ;
Signature · 1 line
2.13.7
Quoted 16 lines · On Tue, 20 Nov 2018 09:56:12 +0100 Rafał Miłecki <[email protected]> wrote:
From: Rafał Miłecki <[email protected]>
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 <[email protected]>--- drivers/mtd/mtdpart.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)drivers/mtd/mtdpart.c +0
-0
drivers/mtd/mtdpart.c static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd) · line 64
Quoted 4 lines
drivers/mtd/mtdpart.c +1
-0@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd) return container_of(mtd, struct mtd_part, mtd); } +static uint64_t part_absolute_offset (struct mtd_info *mtd)
^ u64
Looks good otherwise.
Quoted 29 lines
drivers/mtd/mtdpart.c +10
-2+{ +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 @@ -514,7 +523,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,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 */ @@ -525,7 +534,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, 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 ;
PATCH v2 1/1 mtd: improve calculating partition boundaries when checking for alignment
In reply to Rafał MiłeckiFrom: Rafał Miłecki <[email protected]>
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.
---
V2: Switch from uint64_t to u64. I got incorrectly inspired by
uint64_t offset; --- drivers/mtd/mtdpart.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/mtd/mtdpart.c +11 -2
@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd) 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
@@ -514,7 +523,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,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 */
@@ -525,7 +534,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, 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 ;
Signature · 1 line
2.13.7
Boris Brezillon
AppliedQuoted 7 lines · On Tue, 20 Nov 2018 10:24:09 +0100 Rafał Miłecki <[email protected]> wrote:
From: Rafał Miłecki <[email protected]>
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 <[email protected]>
Queued to mtd/next.
Quoted 45 lines
---
V2: Switch fromuint64_tto u64. I got incorrectly inspired byuint64_t offset; --- drivers/mtd/mtdpart.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)drivers/mtd/mtdpart.c +11
-2@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd) 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 @@ -514,7 +523,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,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 */ @@ -525,7 +534,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, 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 ;