Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae5b2ec8 authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarLogan Gunthorpe <logang@deltatee.com>
Fixes: b685d3d6 ("block: treat REQ_FUA and REQ_PREFLUSH as synchronous")
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent b57d74af
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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