Commit 6f5c2ed0 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim

f2fs: split IO error injection according to RW

This patch adds to support injecting error for write IO, this can simulate
IO error like fail_make_request or dm_flakey does.
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 7c1a000d
...@@ -172,9 +172,10 @@ fault_type=%d Support configuring fault injection type, should be ...@@ -172,9 +172,10 @@ fault_type=%d Support configuring fault injection type, should be
FAULT_DIR_DEPTH 0x000000100 FAULT_DIR_DEPTH 0x000000100
FAULT_EVICT_INODE 0x000000200 FAULT_EVICT_INODE 0x000000200
FAULT_TRUNCATE 0x000000400 FAULT_TRUNCATE 0x000000400
FAULT_IO 0x000000800 FAULT_READ_IO 0x000000800
FAULT_CHECKPOINT 0x000001000 FAULT_CHECKPOINT 0x000001000
FAULT_DISCARD 0x000002000 FAULT_DISCARD 0x000002000
FAULT_WRITE_IO 0x000004000
mode=%s Control block allocation mode which supports "adaptive" mode=%s Control block allocation mode which supports "adaptive"
and "lfs". In "lfs" mode, there should be no random and "lfs". In "lfs" mode, there should be no random
writes towards main area. writes towards main area.
......
...@@ -123,8 +123,9 @@ static bool f2fs_bio_post_read_required(struct bio *bio) ...@@ -123,8 +123,9 @@ static bool f2fs_bio_post_read_required(struct bio *bio)
static void f2fs_read_end_io(struct bio *bio) static void f2fs_read_end_io(struct bio *bio)
{ {
if (time_to_inject(F2FS_P_SB(bio_first_page_all(bio)), FAULT_IO)) { if (time_to_inject(F2FS_P_SB(bio_first_page_all(bio)),
f2fs_show_injection_info(FAULT_IO); FAULT_READ_IO)) {
f2fs_show_injection_info(FAULT_READ_IO);
bio->bi_status = BLK_STS_IOERR; bio->bi_status = BLK_STS_IOERR;
} }
...@@ -145,6 +146,11 @@ static void f2fs_write_end_io(struct bio *bio) ...@@ -145,6 +146,11 @@ static void f2fs_write_end_io(struct bio *bio)
struct bio_vec *bvec; struct bio_vec *bvec;
int i; int i;
if (time_to_inject(sbi, FAULT_WRITE_IO)) {
f2fs_show_injection_info(FAULT_WRITE_IO);
bio->bi_status = BLK_STS_IOERR;
}
bio_for_each_segment_all(bvec, bio, i) { bio_for_each_segment_all(bvec, bio, i) {
struct page *page = bvec->bv_page; struct page *page = bvec->bv_page;
enum count_type type = WB_DATA_TYPE(page); enum count_type type = WB_DATA_TYPE(page);
......
...@@ -50,9 +50,10 @@ enum { ...@@ -50,9 +50,10 @@ enum {
FAULT_DIR_DEPTH, FAULT_DIR_DEPTH,
FAULT_EVICT_INODE, FAULT_EVICT_INODE,
FAULT_TRUNCATE, FAULT_TRUNCATE,
FAULT_IO, FAULT_READ_IO,
FAULT_CHECKPOINT, FAULT_CHECKPOINT,
FAULT_DISCARD, FAULT_DISCARD,
FAULT_WRITE_IO,
FAULT_MAX, FAULT_MAX,
}; };
......
...@@ -50,9 +50,10 @@ char *f2fs_fault_name[FAULT_MAX] = { ...@@ -50,9 +50,10 @@ char *f2fs_fault_name[FAULT_MAX] = {
[FAULT_DIR_DEPTH] = "too big dir depth", [FAULT_DIR_DEPTH] = "too big dir depth",
[FAULT_EVICT_INODE] = "evict_inode fail", [FAULT_EVICT_INODE] = "evict_inode fail",
[FAULT_TRUNCATE] = "truncate fail", [FAULT_TRUNCATE] = "truncate fail",
[FAULT_IO] = "IO error", [FAULT_READ_IO] = "read IO error",
[FAULT_CHECKPOINT] = "checkpoint error", [FAULT_CHECKPOINT] = "checkpoint error",
[FAULT_DISCARD] = "discard error", [FAULT_DISCARD] = "discard error",
[FAULT_WRITE_IO] = "write IO error",
}; };
void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate, void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment