f2fs: call f2fs_handle_critical_error() to set cp_error flag

f2fs_handle_page_eio() is the only left place we set CP_ERROR_FLAG
directly, it missed to update superblock.s_stop_reason, let's
call f2fs_handle_critical_error() instead to fix that.

Introduce STOP_CP_REASON_READ_{META,NODE,DATA} stop_cp_reason enum
variable to indicate which kind of data we failed to read.

Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Chao Yu
2026-03-23 16:38:32 +08:00
committed by Jaegeuk Kim
parent 5471834a96
commit bd882ffdd4
2 changed files with 22 additions and 2 deletions

View File

@@ -5070,8 +5070,25 @@ static inline void f2fs_handle_page_eio(struct f2fs_sb_info *sbi,
return;
if (ofs == sbi->page_eio_ofs[type]) {
if (sbi->page_eio_cnt[type]++ == MAX_RETRY_PAGE_EIO)
set_ckpt_flags(sbi, CP_ERROR_FLAG);
if (sbi->page_eio_cnt[type]++ == MAX_RETRY_PAGE_EIO) {
enum stop_cp_reason stop_reason;
switch (type) {
case META:
stop_reason = STOP_CP_REASON_READ_META;
break;
case NODE:
stop_reason = STOP_CP_REASON_READ_NODE;
break;
case DATA:
stop_reason = STOP_CP_REASON_READ_DATA;
break;
default:
f2fs_bug_on(sbi, 1);
return;
}
f2fs_handle_critical_error(sbi, stop_reason);
}
} else {
sbi->page_eio_ofs[type] = ofs;
sbi->page_eio_cnt[type] = 0;

View File

@@ -80,6 +80,9 @@ enum stop_cp_reason {
STOP_CP_REASON_NO_SEGMENT,
STOP_CP_REASON_CORRUPTED_FREE_BITMAP,
STOP_CP_REASON_CORRUPTED_NID,
STOP_CP_REASON_READ_META,
STOP_CP_REASON_READ_NODE,
STOP_CP_REASON_READ_DATA,
STOP_CP_REASON_MAX,
};