aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2018-11-20 04:24:09 -0500
committerBoris Brezillon <boris.brezillon@bootlin.com>2018-12-02 03:32:44 -0500
commit6750f61a13a0197c40e4a40739117493b15f19e8 (patch)
treeb8bb14ab4178689a2b1e396d2606c02581f95d66
parent1186af457cc186c5ed01708da71b1ffbdf0a2638 (diff)
mtd: improve calculating partition boundaries when checking for alignment
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 <rafal@milecki.pl> Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
-rw-r--r--drivers/mtd/mtdpart.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 2b6e53af47da..b6af41b04622 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd)
61 return container_of(mtd, struct mtd_part, mtd); 61 return container_of(mtd, struct mtd_part, mtd);
62} 62}
63 63
64static u64 part_absolute_offset(struct mtd_info *mtd)
65{
66 struct mtd_part *part = mtd_to_part(mtd);
67
68 if (!mtd_is_partition(mtd))
69 return 0;
70
71 return part_absolute_offset(part->parent) + part->offset;
72}
64 73
65/* 74/*
66 * MTD methods which simply translate the effective address and pass through 75 * 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,
514 if (!(slave->mtd.flags & MTD_NO_ERASE)) 523 if (!(slave->mtd.flags & MTD_NO_ERASE))
515 wr_alignment = slave->mtd.erasesize; 524 wr_alignment = slave->mtd.erasesize;
516 525
517 tmp = slave->offset; 526 tmp = part_absolute_offset(parent) + slave->offset;
518 remainder = do_div(tmp, wr_alignment); 527 remainder = do_div(tmp, wr_alignment);
519 if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { 528 if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
520 /* Doesn't start on a boundary of major erase size */ 529 /* Doesn't start on a boundary of major erase size */
@@ -525,7 +534,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,
525 part->name); 534 part->name);
526 } 535 }
527 536
528 tmp = slave->mtd.size; 537 tmp = part_absolute_offset(parent) + slave->mtd.size;
529 remainder = do_div(tmp, wr_alignment); 538 remainder = do_div(tmp, wr_alignment);
530 if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { 539 if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
531 slave->mtd.flags &= ~MTD_WRITEABLE; 540 slave->mtd.flags &= ~MTD_WRITEABLE;