block: fix empty barrier on write-through w/ ordered tag
Empty barrier on write-through (or no cache) w/ ordered tag has no command to execute and without any command to execute ordered tag is never issued to the device and the ordering is never achieved. Force draining for such cases. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
Родитель
58eea927d2
Коммит
a185eb4bc8
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче