kernel: fix mtd partition erase < parent_erasesize writes
[openwrt/staging/rmilecki.git] / target / linux / generic / pending-5.4 / 411-mtd-partial_eraseblock_write.patch
index b46c3f5ed42e1ff342c5778ab77ea4da8ed000f0..c48a144d3de66437b8c6f0f03bfd9d7bf98a5666 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);
-@@ -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 <nbd@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 <nbd@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 */