On Mon, 25 Sep 2017 10:19:57 +0200 Boris Brezillon <boris.brezillon@xxxxxxxxxxxxxxxxxx> wrote: > Commit 1eeef2d7483a ("mtd: handle partitioning on devices with 0 > erasesize") introduced a regression on heterogeneous erase region > devices. Alignment of the partition was tested against the master > eraseblock size which can be bigger than the slave one, thus leading > to some partitions being marked as read-only. > > Update wr_alignment to match this slave erasesize after this erasesize > has been determined by picking the biggest erasesize of all the regions > embedded in the MTD partition. > > Reported-by: Mathias Thore <Mathias.Thore@xxxxxxxxxxxx> > Fixes: 1eeef2d7483a ("mtd: handle partitioning on devices with 0 erasesize") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxxxxxxx> Applied. > --- > Changes in v2: > - Fix build error reported by Mathias > --- > drivers/mtd/mtdpart.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c > index 5736b0c90b33..a308e707392d 100644 > --- a/drivers/mtd/mtdpart.c > +++ b/drivers/mtd/mtdpart.c > @@ -581,6 +581,14 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, > slave->mtd.erasesize = parent->erasesize; > } > > + /* > + * Slave erasesize might differ from the master one if the master > + * exposes several regions with different erasesize. Adjust > + * wr_alignment accordingly. > + */ > + if (!(slave->mtd.flags & MTD_NO_ERASE)) > + wr_alignment = slave->mtd.erasesize; > + > tmp = slave->offset; > remainder = do_div(tmp, wr_alignment); > if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {