Keep all error injection in one place, and out of line for the main I/O submission fast path.
Signed-off-by: Christoph Hellwig <[email protected]> --- block/blk-core.c | 37 ++----------------------------------- block/error-injection.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 35 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 04a392849ab0..7465dd291272 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -29,7 +29,6 @@ #include <linux/swap.h> #include <linux/writeback.h> #include <linux/task_io_accounting_ops.h> -#include <linux/fault-inject.h> #include <linux/list_sort.h> #include <linux/delay.h> #include <linux/ratelimit.h> @@ -534,32 +533,6 @@ bool blk_get_queue(struct request_queue *q) } EXPORT_SYMBOL(blk_get_queue); -#ifdef CONFIG_FAIL_MAKE_REQUEST - -static DECLARE_FAULT_ATTR(fail_make_request); - -static int __init setup_fail_make_request(char *str) -{ - return setup_fault_attr(&fail_make_request, str); -} -__setup("fail_make_request=", setup_fail_make_request); - -bool should_fail_request(unsigned int bytes) -{ - return should_fail(&fail_make_request, bytes); -} - -static int __init fail_make_request_debugfs(void) -{ - struct dentry *dir = fault_create_debugfs_attr("fail_make_request", - NULL, &fail_make_request); - - return PTR_ERR_OR_ZERO(dir); -} - -late_initcall(fail_make_request_debugfs); -#endif /* CONFIG_FAIL_MAKE_REQUEST */ - static inline void bio_check_ro(struct bio *bio) { if (op_is_write(bio_op(bio)) && bdev_read_only(bio->bi_bdev)) { @@ -764,14 +737,8 @@ static void __submit_bio_noacct_mq(struct bio *bio) void submit_bio_noacct_nocheck(struct bio *bio, bool split) { - if (unlikely(may_fail_bio(bio))) { - if (blk_error_inject(bio)) - return; - if (should_fail_request(bio->bi_iter.bi_size)) { - bio_io_error(bio); - return; - } - } + if (unlikely(may_fail_bio(bio)) && blk_error_inject(bio)) + return; blk_cgroup_bio_start(bio); diff --git a/block/error-injection.c b/block/error-injection.c index dc0420c4eb58..45f2454d0bca 100644 --- a/block/error-injection.c +++ b/block/error-injection.c @@ -4,6 +4,7 @@ */ #include <linux/debugfs.h> #include <linux/blkdev.h> +#include <linux/fault-inject.h> #include <linux/parser.h> #include <linux/seq_file.h> #include "blk.h" @@ -47,6 +48,13 @@ bool __blk_error_inject(struct bio *bio) } } rcu_read_unlock(); + + /* legacy I/O error injection */ + if (should_fail_request(bio->bi_iter.bi_size)) { + bio_io_error(bio); + return true; + } + return false; } @@ -297,3 +305,25 @@ void blk_error_injection_exit(struct gendisk *disk) { error_inject_removall(disk); } + +static DECLARE_FAULT_ATTR(fail_make_request); + +bool should_fail_request(unsigned int bytes) +{ + return should_fail(&fail_make_request, bytes); +} + +static int __init setup_fail_make_request(char *str) +{ + return setup_fault_attr(&fail_make_request, str); +} +__setup("fail_make_request=", setup_fail_make_request); + +static int __init fail_make_request_debugfs(void) +{ + struct dentry *dir = fault_create_debugfs_attr("fail_make_request", + NULL, &fail_make_request); + + return PTR_ERR_OR_ZERO(dir); +} +late_initcall(fail_make_request_debugfs); -- 2.53.0
