> -----Original Message----- > From: Boris Brezillon [mailto:boris.brezillon@xxxxxxxxxxxxxxxxxx] > Sent: den 25 september 2017 10:20 > To: David Woodhouse; Brian Norris; Boris Brezillon; Marek Vasut; Richard > Weinberger; Cyrille Pitchen; linux-mtd@xxxxxxxxxxxxxxxxxxx > Cc: Mathias Thore; Chris Packham; stable@xxxxxxxxxxxxxxx > Subject: [PATCH v2] mtd: Fix partition alignment check on multi-erasesize > devices > > 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> Tested-by: Mathias Thore <Mathias.Thore@xxxxxxxxxxxx> Reviewed-by: Mathias Thore <Mathias.Thore@xxxxxxxxxxxx> > --- > 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) { > -- > 2.11.0