Commit f9d6f1f7 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Zheng Qixing
Browse files

block: fix error unwinding in blk_register_queue

mainline inclusion
from mainline-v6.2-rc1
commit 40602997
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBSG04

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=40602997be26887bdfa3d58659c3acb4579099e9



------------------

blk_register_queue fails to handle errors from blk_mq_sysfs_register,
leaks various resources on errors and accidentally sets queue refs percpu
refcount to percpu mode on kobject_add failure.  Fix all that by
properly unwinding on errors.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20221114042637.1009333-4-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Conflicts:
	block/blk-sysfs.c
[Context conflicts.]
Signed-off-by: default avatarZheng Qixing <zhengqixing@huawei.com>
parent 10501491
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -961,15 +961,21 @@ int blk_register_queue(struct gendisk *disk)
		return ret;

	mutex_lock(&queue_to_wrapper(q)->sysfs_dir_lock);

	ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue");
	if (ret < 0) {
		blk_trace_remove_sysfs(dev);
		goto unlock;
	}

	if (q->mq_ops)
		__blk_mq_register_dev(dev, q);
	if (q->mq_ops) {
		ret = __blk_mq_register_dev(dev, q);
		if (ret) {
			blk_trace_remove_sysfs(dev);
			kobject_del(&q->kobj);
			kobject_put(&dev->kobj);
			goto unlock;
		}
	}
	mutex_lock(&q->sysfs_lock);

	mutex_lock(&q->debugfs_mutex);