kernel: fix mtd partition erase < parent_erasesize writes
[openwrt/staging/dedeckeh.git] / target / linux / generic / pending-4.19 / 411-mtd-partial_eraseblock_write.patch
index f3a314ae02e16def6ffaace8593ef89390ec703f..f945122149229b11363fa3ba2da536a8d5e881f6 100644 (file)
@@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  /* Our partition linked list */
  static LIST_HEAD(mtd_partitions);
  static DEFINE_MUTEX(mtd_partitions_mutex);
-@@ -220,6 +222,53 @@ static int part_erase(struct mtd_info *m
+@@ -220,11 +222,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 <nbd@nbd.name>
  
        instr->addr += part->offset;
        ret = part->parent->_erase(part->parent, instr);
-@@ -227,6 +276,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 <nbd@nbd.name>
 +              kfree(erase_buf);
 +      }
 +
-       return ret;
- }
+       instr->addr -= part->offset;
  
-@@ -539,19 +606,22 @@ static struct mtd_part *allocate_partiti
+       return ret;
+@@ -539,19 +607,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 */