diff options
author | Jens Axboe <jaxboe@fusionio.com> | 2011-03-25 18:57:52 +0300 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-03-25 19:04:08 +0300 |
commit | 401a18e92ce32cd0ddfa5738899ca2b8114f2bbf (patch) | |
tree | f8c7dbb61a7a90ae43065075b640512899fafd28 /block | |
parent | 6c5103890057b1bb781b26b7aae38d33e4c517d8 (diff) | |
download | linux-401a18e92ce32cd0ddfa5738899ca2b8114f2bbf.tar.xz |
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.c | 5 |
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) { |