Hi John. W dniu 05.08.2020 o 23:13, John Thomson pisze: > This bug applied where mtd partition end address, > or erase start address, was not cleanly divisible by parent mtd erasesize. > > This error would cause the bits following the end of the partition > to the next erasesize block boundary to be erased, > and this partition-overflow data to be written to the partition erase > address (missing additional partition offset address) > of the mtd (top) parent device. > > Signed-off-by: John Thomson <g...@johnthomson.fastmail.com.au>
Yay! The description in this patch matches the symptoms I described Year ago in this bug report: https://bugs.openwrt.org/index.php?do=details&task_id=2428 and this patch fixes it, Thank You very much. Tested-by: Tomasz Maciej Nowak <tome...@o2.pl> Fixes: FS#2428 > > -- > > 4.19 also requires this fix > > A little discussion here: > https://github.com/openwrt/openwrt/pull/3103#issuecomment-667610510 > > mtdpart.c should be made to work with 4K erase sectors, where available > Considering this here: > https://github.com/openwrt/openwrt/pull/3271 > --- > .../411-mtd-partial_eraseblock_write.patch | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git > a/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch > b/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch > index b46c3f5ed4..c48a144d3d 100644 > --- a/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch > +++ b/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch > @@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <n...@nbd.name> > /* Our partition linked list */ > static LIST_HEAD(mtd_partitions); > static DEFINE_MUTEX(mtd_partitions_mutex); > -@@ -206,6 +208,53 @@ static int part_erase(struct mtd_info *m > +@@ -206,11 +208,77 @@ static int part_erase(struct mtd_info *m > { > struct mtd_part *part = mtd_to_part(mtd); > int ret; > @@ -73,10 +73,9 @@ Signed-off-by: Felix Fietkau <n...@nbd.name> > > instr->addr += part->offset; > ret = part->parent->_erase(part->parent, instr); > -@@ -213,6 +262,24 @@ static int part_erase(struct mtd_info *m > + if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) > instr->fail_addr -= part->offset; > - instr->addr -= part->offset; > - > ++ > + if (mtd->flags & MTD_ERASE_PARTIAL) { > + if (partial_start) { > + part->parent->_write(part->parent, > @@ -95,10 +94,10 @@ Signed-off-by: Felix Fietkau <n...@nbd.name> > + kfree(erase_buf); > + } > + > - return ret; > - } > + instr->addr -= part->offset; > > -@@ -525,19 +592,22 @@ static struct mtd_part *allocate_partiti > + return ret; > +@@ -525,19 +593,22 @@ static struct mtd_part *allocate_partiti > remainder = do_div(tmp, wr_alignment); > if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { > /* Doesn't start on a boundary of major erase size */ > -- TMN _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel