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: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Chao Yu 2018-09-12 09:22:29 +08:00 committed by Jaegeuk Kim
parent 7c1a000d46
commit 6f5c2ed0a2
4 changed files with 14 additions and 5 deletions

View file

@ -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.

View file

@ -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)
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);

View file

@ -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,
}; };

View file

@ -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,