From: T Karthik Reddy <t.karthik.re...@xilinx.com>

Nand writes should skip the bad blocks with "nand write" command.
In case of bad blocks with above 32-bit address, nand_block_isbad()
returns false due to truncated bad block address.

In below code segment,

        if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1)))

offset is 64-bit and mtd->erasesize is 32-bit, hence the truncation is
happening. Cast 'mtd->erasesize' with loff_t to fix this issue.

Signed-off-by: T Karthik Reddy <t.karthik.re...@xilinx.com>
Signed-off-by: Michal Simek <michal.si...@xilinx.com>
---

Was trying to find out fixed sha1 but maybe none really tested to have back
blocks above 4GB.
---
 drivers/mtd/nand/raw/nand_util.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_util.c b/drivers/mtd/nand/raw/nand_util.c
index 5b74ef0dfdbf..00c3c6c41226 100644
--- a/drivers/mtd/nand/raw/nand_util.c
+++ b/drivers/mtd/nand/raw/nand_util.c
@@ -635,14 +635,14 @@ int nand_write_skip_bad(struct mtd_info *mtd, loff_t 
offset, size_t *length,
        }
 
        while (left_to_write > 0) {
+               loff_t block_start = offset & ~(loff_t)(mtd->erasesize - 1);
                size_t block_offset = offset & (mtd->erasesize - 1);
                size_t write_size, truncated_write_size;
 
                WATCHDOG_RESET();
 
-               if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) {
-                       printf("Skip bad block 0x%08llx\n",
-                               offset & ~(mtd->erasesize - 1));
+               if (nand_block_isbad(mtd, block_start)) {
+                       printf("Skip bad block 0x%08llx\n", block_start);
                        offset += mtd->erasesize - block_offset;
                        continue;
                }
-- 
2.28.0

Reply via email to