diff options
author | Zhiguo Niu <zhiguo.niu@unisoc.com> | 2023-10-16 19:27:31 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2023-11-28 17:19:45 +0000 |
commit | 0237975d8e3ec10c07b8169e22a6cea35afd8475 (patch) | |
tree | d2b22c33562ba190f40f727f5633e4e627a43b54 /fs/f2fs | |
parent | e69ec2352087d9b6f5bcf31dbd4c14028b74671a (diff) | |
download | linux-starfive-0237975d8e3ec10c07b8169e22a6cea35afd8475.tar.gz linux-starfive-0237975d8e3ec10c07b8169e22a6cea35afd8475.tar.bz2 linux-starfive-0237975d8e3ec10c07b8169e22a6cea35afd8475.zip |
f2fs: fix error path of __f2fs_build_free_nids
[ Upstream commit a5e80e18f268ea7c7a36bc4159de0deb3b5a2171 ]
If NAT is corrupted, let scan_nat_page() return EFSCORRUPTED, so that,
caller can set SBI_NEED_FSCK flag into checkpoint for later repair by
fsck.
Also, this patch introduces a new fscorrupted error flag, and in above
scenario, it will persist the error flag into superblock synchronously
to avoid it has no luck to trigger a checkpoint to record SBI_NEED_FSCK
Signed-off-by: Zhiguo Niu <zhiguo.niu@unisoc.com>
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/node.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index ee2e1dd64f25..248764badcde 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -2389,7 +2389,7 @@ static int scan_nat_page(struct f2fs_sb_info *sbi, blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); if (blk_addr == NEW_ADDR) - return -EINVAL; + return -EFSCORRUPTED; if (blk_addr == NULL_ADDR) { add_free_nid(sbi, start_nid, true, true); @@ -2504,7 +2504,14 @@ static int __f2fs_build_free_nids(struct f2fs_sb_info *sbi, if (ret) { f2fs_up_read(&nm_i->nat_tree_lock); - f2fs_err(sbi, "NAT is corrupt, run fsck to fix it"); + + if (ret == -EFSCORRUPTED) { + f2fs_err(sbi, "NAT is corrupt, run fsck to fix it"); + set_sbi_flag(sbi, SBI_NEED_FSCK); + f2fs_handle_error(sbi, + ERROR_INCONSISTENT_NAT); + } + return ret; } } |