Commit f05d1ba7 authored by Bart Van Assche's avatar Bart Van Assche Committed by Jens Axboe

blk-mq: Only unregister hctxs for which registration succeeded

Hctx unregistration involves calling kobject_del(). kobject_del()
must not be called if kobject_add() has not been called. Hence in
the error path only unregister hctxs for which registration succeeded.
Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Cc: Omar Sandoval <osandov@fb.com>
Cc: Hannes Reinecke <hare@suse.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 62d6c949
...@@ -323,16 +323,24 @@ int __blk_mq_register_dev(struct device *dev, struct request_queue *q) ...@@ -323,16 +323,24 @@ int __blk_mq_register_dev(struct device *dev, struct request_queue *q)
queue_for_each_hw_ctx(q, hctx, i) { queue_for_each_hw_ctx(q, hctx, i) {
ret = blk_mq_register_hctx(hctx); ret = blk_mq_register_hctx(hctx);
if (ret) if (ret)
break; goto unreg;
} }
if (ret)
__blk_mq_unregister_dev(dev, q);
else
q->mq_sysfs_init_done = true; q->mq_sysfs_init_done = true;
out: out:
return ret; return ret;
unreg:
while (--i >= 0)
blk_mq_unregister_hctx(q->queue_hw_ctx[i]);
blk_mq_debugfs_unregister_mq(q);
kobject_uevent(&q->mq_kobj, KOBJ_REMOVE);
kobject_del(&q->mq_kobj);
kobject_put(&dev->kobj);
return ret;
} }
int blk_mq_register_dev(struct device *dev, struct request_queue *q) int blk_mq_register_dev(struct device *dev, struct request_queue *q)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment