Commit 887516b1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by openeuler-sync-bot
Browse files

blk-mq: add the blk_mq_alloc_disk APIs

mainline inclusion
from mainline-v5.14-rc1
commit b461dfc4
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I81XCK

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



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

Add a new API to allocate a gendisk including the request_queue for use
with blk-mq based drivers.  This is to avoid boilerplate code in drivers.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Link: https://lore.kernel.org/r/20210602065345.355274-4-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
conflict:
  include/linux/blk-mq.h
Signed-off-by: default avatarZhong Jinghua <zhongjinghua@huawei.com>
Signed-off-by: default avatarLi Nan <linan122@huawei.com>
(cherry picked from commit b10c31af)
parent 57b5fa02
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -3301,6 +3301,25 @@ struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set)
}
EXPORT_SYMBOL(blk_mq_init_queue);

struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata)
{
	struct request_queue *q;
	struct gendisk *disk;

	q = blk_mq_init_queue_data(set, queuedata);
	if (IS_ERR(q))
		return ERR_CAST(q);

	disk = __alloc_disk_node(0, set->numa_node);
	if (!disk) {
		blk_cleanup_queue(q);
		return ERR_PTR(-ENOMEM);
	}
	disk->queue = q;
	return disk;
}
EXPORT_SYMBOL(__blk_mq_alloc_disk);

/*
 * Helper for setting up a queue with mq ops, given queue depth, and
 * the passed in mq ops flags.
+12 −0
Original line number Diff line number Diff line
@@ -464,6 +464,18 @@ enum {

#define BLK_MQ_NO_HCTX_IDX	(-1U)

#define blk_mq_alloc_disk(set, queuedata)				\
({									\
	static struct lock_class_key __key;				\
	struct gendisk *__disk = __blk_mq_alloc_disk(set, queuedata);	\
									\
	if (__disk)							\
		lockdep_init_map(&__disk->lockdep_map,			\
			"(bio completion)", &__key, 0);			\
	__disk;								\
})
struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set,
		void *queuedata);
struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
		void *queuedata);