summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJens Axboe <jaxboe@fusionio.com>2011-03-25 16:57:52 +0100
committerJens Axboe <jaxboe@fusionio.com>2011-03-25 17:04:08 +0100
commit401a18e92ce32cd0ddfa5738899ca2b8114f2bbf (patch)
treef8c7dbb61a7a90ae43065075b640512899fafd28 /block
parentMerge branch 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block (diff)
downloadlinux-401a18e92ce32cd0ddfa5738899ca2b8114f2bbf.tar.xz
linux-401a18e92ce32cd0ddfa5738899ca2b8114f2bbf.zip
block: fix bug with inserting flush requests as sort/merge
With the introduction of the on-stack plugging, we would assume that any request being inserted was a normal file system request. As flush/fua requires a special insert mode, this caused problems. Fix this up by checking for this in flush_plug_list() and use the appropriate insert mechanism. Big thanks goes to Markus Tripplesdorf for tirelessly testing patches, and to Sergey Senozhatsky for helping find the real issue. Reported-by: Markus Tripplesdorf <markus@trippelsdorf.de> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'block')
-rw-r--r--block/blk-core.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 59b5c00c0126..64e96ee1d6af 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -2702,7 +2702,10 @@ static void flush_plug_list(struct blk_plug *plug)
/*
* rq is already accounted, so use raw insert
*/
- __elv_add_request(q, rq, ELEVATOR_INSERT_SORT_MERGE);
+ if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA))
+ __elv_add_request(q, rq, ELEVATOR_INSERT_FLUSH);
+ else
+ __elv_add_request(q, rq, ELEVATOR_INSERT_SORT_MERGE);
}
if (q) {