[Bugfix][API-1313]after flash_erase system_a, can't startup

Only Configure: No
Affected branch: MR3.0-merged
Affected module: ab backup
Is it affected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update: No

Change-Id: I8d52b2e82f239de34c90bed1a26525bd30e95ebb
(cherry picked from commit 1d74df46ce16aa6a283b775a88f543507ef11734)
diff --git a/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c b/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c
index f7169a1..cdb9ae0 100755
--- a/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c
+++ b/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c
@@ -19,11 +19,15 @@
 

 int bootctrl_write_metadata(AvbABData *bctrl)

 {

-    int err;

+    int err, ret;

     ssize_t sz, size;

-    char *buf = (char *)bctrl;

+    char *buffer = NULL;

+    char *buf = NULL;

+    AvbABData *metadata;

     struct mtd_info *mtd = NULL;

-    loff_t pos = OFFSETOF_SLOT_SUFFIX;

+    struct erase_info ei = {0};

+    size_t misc_erasesize = 0;

+    //loff_t pos = 0;

 

     if(bctrl == NULL)

     {

@@ -43,11 +47,50 @@
         printk("ERROR: pointer: %d.", err);

         return err;

     }

-

-    size = sizeof(AvbABData);

-

+    misc_erasesize = mtd->erasesize;

+//malloc buffer

+    buffer = (char *)kmalloc(misc_erasesize, GFP_KERNEL);

+    if(buffer == NULL)

+    {

+        printk("ERROR: kmalloc error!");

+        return -1;

+    }

+    buf = buffer;

+    size = misc_erasesize;

+//read one erasesize

     do {

-        err = mtd_write(mtd, pos, size, &sz, buf);

+        ret = mtd_read(mtd, 0, size, &sz, buf);

+        if (sz == 0)

+        {

+            break;

+        }

+        else if (sz < 0)

+        {

+            printk("BOOTCTRL:Error reading metadata file: %ld\n", sz);

+            kfree(buffer);

+            return sz;

+        }

+        size -= sz;

+        buf += sz;

+    } while(size > 0);

+

+    printk("BOOTCTRL: end of read block");

+    size = misc_erasesize;

+    ei.addr = 0;

+    ei.len = mtd->erasesize * 1;

+    err = mtd_erase(mtd, &ei);

+    if(err != 0)

+    {

+        printk("ERROR: mtd_erase: %d.", err);

+        kfree(buffer);

+        return err;

+    }

+    metadata = (AvbABData *)(buffer + OFFSETOF_SLOT_SUFFIX);

+    memcpy(metadata, bctrl, sizeof(AvbABData));

+    buf = buffer;

+//write one erasesize

+    do {

+        err = mtd_write(mtd, 0, size, &sz, buf);

 

         if (err == 0) 

         {

@@ -56,12 +99,14 @@
         else if (err < 0)

         {

             printk("Error Writing metadata file\n");

+            kfree(buffer);

             return err;

         }

         size -= sz;

         buf += sz;

     } while(size > 0);

     printk("BOOTCTRL:write new info to metadata\n");

+    kfree(buffer);

     return 0;

 }