| From f56fd4ce5cbda5f8698fcd8878b41e46f3271263 Mon Sep 17 00:00:00 2001 |
| From: Tejun Heo <tj@kernel.org> |
| Date: Tue, 15 Oct 2019 08:49:27 -0700 |
| Subject: [PATCH] blk-rq-qos: fix first node deletion of rq_qos_del() |
| |
| commit 307f4065b9d7c1e887e8bdfb2487e4638559fea1 upstream. |
| |
| rq_qos_del() incorrectly assigns the node being deleted to the head if |
| it was the first on the list in the !prev path. Fix it by iterating |
| with ** instead. |
| |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Cc: Josef Bacik <josef@toxicpanda.com> |
| Fixes: a79050434b45 ("blk-rq-qos: refactor out common elements of blk-wbt") |
| Cc: stable@vger.kernel.org # v4.19+ |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/block/blk-rq-qos.h b/block/blk-rq-qos.h |
| index c0f0778d5396..8378f68a21ac 100644 |
| --- a/block/blk-rq-qos.h |
| +++ b/block/blk-rq-qos.h |
| @@ -103,16 +103,13 @@ static inline void rq_qos_add(struct request_queue *q, struct rq_qos *rqos) |
| |
| static inline void rq_qos_del(struct request_queue *q, struct rq_qos *rqos) |
| { |
| - struct rq_qos *cur, *prev = NULL; |
| - for (cur = q->rq_qos; cur; cur = cur->next) { |
| - if (cur == rqos) { |
| - if (prev) |
| - prev->next = rqos->next; |
| - else |
| - q->rq_qos = cur; |
| + struct rq_qos **cur; |
| + |
| + for (cur = &q->rq_qos; *cur; cur = &(*cur)->next) { |
| + if (*cur == rqos) { |
| + *cur = rqos->next; |
| break; |
| } |
| - prev = cur; |
| } |
| |
| blk_mq_debugfs_unregister_rqos(rqos); |
| -- |
| 2.7.4 |
| |