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

Commit df60f6e8 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

blk-wbt: fix IO hang in wbt_wait()

On wbt invariant is that if one IO is tracked via WBT_TRACKED, rqw->inflight
should be updated for tracking this IO.

But commit c1c80384 ("block: remove external dependency on wbt_flags")
forgets to remove the early handling of !rwb_enabled(rwb) inside wbt_wait(),
then the inflight counter may not be increased in wbt_wait(), but decreased
in wbt_done() for this kind of IO, so this counter may become negative, then
wbt_wait() may wait forever.

This patch fixes the report in the following link:

	https://marc.info/?l=linux-block&m=153221542021033&w=2



Fixes: c1c80384 ("block: remove external dependency on wbt_flags")
Cc: Josef Bacik <jbacik@fb.com>
Reported-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent b089cfd9
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -576,12 +576,8 @@ static void wbt_wait(struct rq_qos *rqos, struct bio *bio, spinlock_t *lock)
	struct rq_wb *rwb = RQWB(rqos);
	enum wbt_flags flags;

	if (!rwb_enabled(rwb))
		return;

	flags = bio_to_wbt_flags(rwb, bio);

	if (!wbt_should_throttle(rwb, bio)) {
	if (!(flags & WBT_TRACKED)) {
		if (flags & WBT_READ)
			wb_timestamp(rwb, &rwb->last_issue);
		return;