Message ID | 1563891042-25448-1-git-send-email-zhengbin13@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | blk-mq: Fix memory leak in blk_mq_init_allocated_queue error handling | expand |
ping On 2019/7/23 22:10, zhengbin wrote: > If blk_mq_init_allocated_queue->elevator_init_mq fails, need to release > the previously requested resources. > > Fixes: d34849913 ("blk-mq-sched: allow setting of default IO scheduler") > Signed-off-by: zhengbin <zhengbin13@huawei.com> > --- > block/blk-mq.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index b038ec6..e001610 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -2845,6 +2845,8 @@ static unsigned int nr_hw_queues(struct blk_mq_tag_set *set) > struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, > struct request_queue *q) > { > + int ret = -ENOMEM; > + > /* mark the queue as mq asap */ > q->mq_ops = set->ops; > > @@ -2906,17 +2908,18 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, > blk_mq_map_swqueue(q); > > if (!(set->flags & BLK_MQ_F_NO_SCHED)) { > - int ret; > - > ret = elevator_init_mq(q); > if (ret) > - return ERR_PTR(ret); > + goto err_tag_set; > } > > return q; > > +err_tag_set: > + blk_mq_del_queue_tag_set(q); > err_hctxs: > kfree(q->queue_hw_ctx); > + q->nr_hw_queues = 0; > err_sys_init: > blk_mq_sysfs_deinit(q); > err_poll: > -- > 2.7.4 > > > . >
On 7/23/19 7:10 AM, zhengbin wrote: > If blk_mq_init_allocated_queue->elevator_init_mq fails, need to release > the previously requested resources. > > Fixes: d34849913 ("blk-mq-sched: allow setting of default IO scheduler") Please always use 12 char abbreviations for git shas. I fixed it up. But thanks for the patch, applied.
diff --git a/block/blk-mq.c b/block/blk-mq.c index b038ec6..e001610 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -2845,6 +2845,8 @@ static unsigned int nr_hw_queues(struct blk_mq_tag_set *set) struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, struct request_queue *q) { + int ret = -ENOMEM; + /* mark the queue as mq asap */ q->mq_ops = set->ops; @@ -2906,17 +2908,18 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, blk_mq_map_swqueue(q); if (!(set->flags & BLK_MQ_F_NO_SCHED)) { - int ret; - ret = elevator_init_mq(q); if (ret) - return ERR_PTR(ret); + goto err_tag_set; } return q; +err_tag_set: + blk_mq_del_queue_tag_set(q); err_hctxs: kfree(q->queue_hw_ctx); + q->nr_hw_queues = 0; err_sys_init: blk_mq_sysfs_deinit(q); err_poll:
If blk_mq_init_allocated_queue->elevator_init_mq fails, need to release the previously requested resources. Fixes: d34849913 ("blk-mq-sched: allow setting of default IO scheduler") Signed-off-by: zhengbin <zhengbin13@huawei.com> --- block/blk-mq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) -- 2.7.4