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