+++ /dev/null
-From ab0fd1debe730ec9998678a0c53caefbd121ed10 Mon Sep 17 00:00:00 2001
-From: Tejun Heo <tj@kernel.org>
-Date: Fri, 3 Jul 2009 12:56:18 +0200
-Subject: [PATCH] block: don't merge requests of different failfast settings
-References: bnc#519111
-
-Block layer used to merge requests and bios with different failfast
-settings. This caused regular IOs to fail prematurely when they were
-merged into failfast requests for readahead.
-
-Niel Lambrechts could trigger the problem semi-reliably on ext4 when
-resuming from STR. ext4 uses readahead when reading inodes and
-combined with the deterministic extra SATA PHY exception cycle during
-resume on the specific configuration, non-readahead inode read would
-fail causing ext4 errors. Please read the following thread for
-details.
-
- http://lkml.org/lkml/2009/5/23/21
-
-This patch makes block layer reject merging if the failfast settings
-don't match. This is correct but likely to lower IO performance by
-preventing regular IOs from mingling into surrounding readahead
-requests. Changes to allow such mixed merges and handle errors
-correctly will be added later.
-
-Signed-off-by: Tejun Heo <tj@kernel.org>
-Reported-by: Niel Lambrechts <niel.lambrechts@gmail.com>
-Cc: Theodore Tso <tytso@mit.edu>
-Signed-off-by: Jens Axboe <axboe@carl.(none)>
-Signed-off-by: Tejun Heo <teheo@suse.de>
----
- block/blk-merge.c | 6 ++++++
- block/elevator.c | 8 ++++++++
- 2 files changed, 14 insertions(+)
-
---- a/block/blk-merge.c
-+++ b/block/blk-merge.c
-@@ -376,6 +376,12 @@ static int attempt_merge(struct request_
- if (blk_integrity_rq(req) != blk_integrity_rq(next))
- return 0;
-
-+ /* don't merge requests of different failfast settings */
-+ if (blk_failfast_dev(req) != blk_failfast_dev(next) ||
-+ blk_failfast_transport(req) != blk_failfast_transport(next) ||
-+ blk_failfast_driver(req) != blk_failfast_driver(next))
-+ return 0;
-+
- /*
- * If we are allowed to merge, then append bio list
- * from next to rq and release next. merge_requests_fn
---- a/block/elevator.c
-+++ b/block/elevator.c
-@@ -97,6 +97,14 @@ int elv_rq_merge_ok(struct request *rq,
- if (bio_integrity(bio) != blk_integrity_rq(rq))
- return 0;
-
-+ /*
-+ * Don't merge if failfast settings don't match
-+ */
-+ if (!bio_failfast_dev(bio) != !blk_failfast_dev(rq) ||
-+ !bio_failfast_transport(bio) != !blk_failfast_transport(rq) ||
-+ !bio_failfast_driver(bio) != !blk_failfast_driver(rq))
-+ return 0;
-+
- if (!elv_iosched_allow_merge(rq, bio))
- return 0;
-