static struct miscdevice ublk_misc;
+static struct lock_class_key ublk_bio_compl_lkclass;
+
static inline bool ublk_can_use_task_work(const struct ublk_queue *ubq)
{
if (IS_BUILTIN(CONFIG_BLK_DEV_UBLK) &&
static int ublk_init_hctx(struct blk_mq_hw_ctx *hctx, void *driver_data,
unsigned int hctx_idx)
{
- struct ublk_device *ub = hctx->queue->queuedata;
+ struct ublk_device *ub = driver_data;
struct ublk_queue *ubq = ublk_get_queue(ub, hctx->queue_num);
hctx->driver_data = ubq;
{
struct ublk_device *ub = container_of(dev, struct ublk_device, cdev_dev);
+ blk_mq_destroy_queue(ub->ub_queue);
+
put_disk(ub->ub_disk);
blk_mq_free_tag_set(&ub->tag_set);
if (err)
goto out_deinit_queues;
- disk = ub->ub_disk = blk_mq_alloc_disk(&ub->tag_set, ub);
+ ub->ub_queue = blk_mq_init_queue(&ub->tag_set);
+ if (IS_ERR(ub->ub_queue))
+ goto out_cleanup_tags;
+ ub->ub_queue->queuedata = ub;
+
+ disk = ub->ub_disk = blk_mq_alloc_disk_for_queue(ub->ub_queue,
+ &ublk_bio_compl_lkclass);
if (IS_ERR(disk)) {
err = PTR_ERR(disk);
- goto out_cleanup_tags;
+ goto out_free_request_queue;
}
- ub->ub_queue = ub->ub_disk->queue;
-
- ub->ub_queue->queuedata = ub;
blk_queue_logical_block_size(ub->ub_queue, bsize);
blk_queue_physical_block_size(ub->ub_queue, bsize);
return 0;
+out_free_request_queue:
+ blk_mq_destroy_queue(ub->ub_queue);
out_cleanup_tags:
blk_mq_free_tag_set(&ub->tag_set);
out_deinit_queues: