block: fix bug with inserting flush requests as sort/merge
authorJens Axboe <jaxboe@fusionio.com>
Fri, 25 Mar 2011 15:57:52 +0000 (16:57 +0100)
committerJens Axboe <jaxboe@fusionio.com>
Fri, 25 Mar 2011 16:04:08 +0000 (17:04 +0100)
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>
block/blk-core.c

index 59b5c00c01262100c76abbf109583a4da37c0c54..64e96ee1d6af2250765f8a4de30d0cb2416da74c 100644 (file)
@@ -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) {