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

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

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
Loading
Loading
Loading
Loading
+13 −5
Original line number Original line Diff line number Diff line
@@ -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)