From 1f97be20ccf457542fe932920f3d4a6aaad13a50 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 28 Nov 2008 13:32:07 +0900 Subject: [PATCH] --- yaml --- r: 123291 b: refs/heads/master c: a185eb4bc84155fff35b602ce99602c010de9634 h: refs/heads/master i: 123289: 2fdb69d283e0c607518812c1cc6dcd9cc22376dc 123287: 43b5b187ccf4c4fdf5951874d29012e28587e88f v: v3 --- [refs] | 2 +- trunk/block/blk-barrier.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index c501ec0c4c6a..e07cdcd4af2d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 58eea927d2de43dc6f03d1ba2c46e55854b31540 +refs/heads/master: a185eb4bc84155fff35b602ce99602c010de9634 diff --git a/trunk/block/blk-barrier.c b/trunk/block/blk-barrier.c index c63044e9c4c0..8eba4e43bb0c 100644 --- a/trunk/block/blk-barrier.c +++ b/trunk/block/blk-barrier.c @@ -166,9 +166,21 @@ static inline bool start_ordered(struct request_queue *q, struct request **rqp) * For an empty barrier, there's no actual BAR request, which * in turn makes POSTFLUSH unnecessary. Mask them off. */ - if (!rq->hard_nr_sectors) + if (!rq->hard_nr_sectors) { q->ordered &= ~(QUEUE_ORDERED_DO_BAR | QUEUE_ORDERED_DO_POSTFLUSH); + /* + * Empty barrier on a write-through device w/ ordered + * tag has no command to issue and without any command + * to issue, ordering by tag can't be used. Drain + * instead. + */ + if ((q->ordered & QUEUE_ORDERED_BY_TAG) && + !(q->ordered & QUEUE_ORDERED_DO_PREFLUSH)) { + q->ordered &= ~QUEUE_ORDERED_BY_TAG; + q->ordered |= QUEUE_ORDERED_BY_DRAIN; + } + } /* stash away the original request */ elv_dequeue_request(q, rq);