Hi, Chao

On 2017/10/31 15:20, Chao Yu wrote:
On 2017/10/31 9:38, Sheng Yong wrote:
Fixing corrupted data depends on c.fix_on. If it's not set, we should not
force fixing corrupted data.  So if nat entries are found invalid when
building nat_area_bitmap, we should just set c.bug_on, and fix it later.

It looks comments and code change doesn't match?
In build_nat_area_bitmap(), if node/meta inode is invalid, the node block is
corrected and written back directly. The "write" should depend on c.fix_on.
So I think we should not fix the node block in build_nat_area_bitmap().

do you mean

@@ -2031,7 +2032,6 @@ void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
                                 */
                                ASSERT_MSG("Invalid nat entry[0]: "
                                        "blk_addr[0x%x]\n", ni.blk_addr);
-                               c.fix_on = 1;
                                fsck->chk.valid_nat_entry_cnt--;
                        }

Thanks,


Signed-off-by: Sheng Yong <shengyo...@huawei.com>
---
  fsck/mount.c | 21 ++++++++++++++-------
  1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/fsck/mount.c b/fsck/mount.c
index faa9bc8..2d51678 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -1877,9 +1877,15 @@ void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 nid)
        ret = dev_read_block(nat_block, block_addr);
        ASSERT(ret >= 0);
- memset(&nat_block->entries[entry_off], 0,
+       if (nid == F2FS_NODE_INO(sbi) || nid == F2FS_META_INO(sbi)) {
+               FIX_MSG("nid [0x%x] block_addr= 0x%x -> 0x1", nid,
+                       le32_to_cpu(nat_block->entries[entry_off].block_addr));
+               nat_block->entries[entry_off].block_addr = cpu_to_le32(0x1);
+       } else {
+               memset(&nat_block->entries[entry_off], 0,
                                        sizeof(struct f2fs_nat_entry));
-       FIX_MSG("Remove nid [0x%x] in NAT\n", nid);
+               FIX_MSG("Remove nid [0x%x] in NAT\n", nid);
+       }
ret = dev_write_block(nat_block, block_addr);
        ASSERT(ret >= 0);
@@ -2001,13 +2007,14 @@ void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
if ((nid + i) == F2FS_NODE_INO(sbi) ||
                                        (nid + i) == F2FS_META_INO(sbi)) {
-                               /* block_addr of node/meta inode should be 0x1 
*/
+                               /*
+                                * block_addr of node/meta inode should be 0x1.
+                                * Set this bit, and fsck_verify will fix it.
+                                */
                                if 
(le32_to_cpu(nat_block->entries[i].block_addr) != 0x1) {
-                                       FIX_MSG("ino: 0x%x node/meta inode, block_addr= 
0x%x -> 0x1",
+                                       ASSERT_MSG("\tError: ino[0x%x] 
block_addr[0x%x] is invalid\n",
                                                        nid + i, 
le32_to_cpu(nat_block->entries[i].block_addr));
-                                       nat_block->entries[i].block_addr = 
cpu_to_le32(0x1);
-                                       ret = dev_write_block(nat_block, 
block_addr);
dev_write_block should depend on (c.fix_on == 1). ^^^^^^^^^^^
The corruption will be fixed in nullify_nat_entry().

thanks,
Sheng
-                                       ASSERT(ret >= 0);
+                                       f2fs_set_bit(nid + i, 
fsck->nat_area_bitmap);
                                }
                                continue;
                        }



.



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to