]> git.hungrycats.org Git - linux/commitdiff
[PATCH] io scheduler barrier fix
authorJens Axboe <axboe@suse.de>
Thu, 18 Sep 2003 11:58:32 +0000 (04:58 -0700)
committerLinus Torvalds <torvalds@laptop.osdl.org>
Thu, 18 Sep 2003 11:58:32 +0000 (04:58 -0700)
From: Nick Piggin <piggin@cyberone.com.au>

This should be the last piece to ensure correct barrier handling for AS
and DL?

drivers/block/as-iosched.c
drivers/block/deadline-iosched.c

index 9099467dfec2f4b813263fd0da4ef5938418e8a7..a54f8e9a358e5a9543f458ad5b0c7c02232ddc95 100644 (file)
@@ -1403,6 +1403,11 @@ as_insert_request(request_queue_t *q, struct request *rq, int where)
        struct as_data *ad = q->elevator.elevator_data;
        struct as_rq *arq = RQ_DATA(rq);
 
+       /* barriers must flush the reorder queue */
+       if (unlikely(rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)
+                       && where == ELEVATOR_INSERT_SORT))
+               where = ELEVATOR_INSERT_BACK;
+
        switch (where) {
                case ELEVATOR_INSERT_BACK:
                        while (ad->next_arq[REQ_SYNC])
index 8bb37f65d53618f9829be9b6650776d841313f2c..ecc2a9997007665772d8e81dff1313c6b5f204d6 100644 (file)
@@ -618,6 +618,11 @@ deadline_insert_request(request_queue_t *q, struct request *rq, int where)
        struct deadline_data *dd = q->elevator.elevator_data;
        struct deadline_rq *drq = RQ_DATA(rq);
 
+       /* barriers must flush the reorder queue */
+       if (unlikely(rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)
+                       && where == ELEVATOR_INSERT_SORT))
+               where = ELEVATOR_INSERT_BACK;
+
        switch (where) {
                case ELEVATOR_INSERT_BACK:
                        while (deadline_dispatch_requests(dd))