From ae5b2ec8ad5e017126cd4552220f25ce8a6b92e9 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 8 Nov 2016 19:39:28 -0700 Subject: block: set REQ_SYNC if we clear REQ_FUA|REQ_PREFLUSH 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 Fixes: b685d3d65ac ("block: treat REQ_FUA and REQ_PREFLUSH as synchronous") Signed-off-by: Jens Axboe --- block/blk-flush.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'block/blk-flush.c') diff --git a/block/blk-flush.c b/block/blk-flush.c index c486b7aa62eeb..1bdbb3d3e5f57 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -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 -- cgit v1.2.3