Skip to content

Commit

Permalink
block: set REQ_SYNC if we clear REQ_FUA|REQ_PREFLUSH
Browse files Browse the repository at this point in the history
If we insert a flush request, we clear REQ_PREFLUSH and/or REQ_FUA,
depending on flush settings. Since op_is_sync() factors those flags
in for deciding whether this request is sync or not, we should
set REQ_SYNC to avoid screwing up this accounting.

This should be less fragile.

Reported-by: Logan Gunthorpe <logang@deltatee.com>
Fixes: b685d3d ("block: treat REQ_FUA and REQ_PREFLUSH as synchronous")
Signed-off-by: Jens Axboe <axboe@fb.com>
  • Loading branch information
Jens Axboe committed Nov 9, 2016
1 parent b57d74a commit ae5b2ec
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions block/blk-flush.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,13 @@ void blk_insert_flush(struct request *rq)
if (!(fflags & (1UL << QUEUE_FLAG_FUA)))
rq->cmd_flags &= ~REQ_FUA;

/*
* REQ_PREFLUSH|REQ_FUA implies REQ_SYNC, so if we clear any
* of those flags, we have to set REQ_SYNC to avoid skewing
* the request accounting.
*/
rq->cmd_flags |= REQ_SYNC;

/*
* An empty flush handed down from a stacking driver may
* translate into nothing if the underlying device does not
Expand Down

0 comments on commit ae5b2ec

Please sign in to comment.