mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 06:41:39 -04:00
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:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user