@@ -223,7 +223,7 @@ struct mapped_device {
223223 ktime_t last_rq_start_time ;
224224
225225 /* for blk-mq request-based DM support */
226- struct blk_mq_tag_set tag_set ;
226+ struct blk_mq_tag_set * tag_set ;
227227 bool use_blk_mq ;
228228};
229229
@@ -2388,8 +2388,10 @@ static void free_dev(struct mapped_device *md)
23882388 unlock_fs (md );
23892389
23902390 cleanup_mapped_device (md );
2391- if (md -> use_blk_mq )
2392- blk_mq_free_tag_set (& md -> tag_set );
2391+ if (md -> tag_set ) {
2392+ blk_mq_free_tag_set (md -> tag_set );
2393+ kfree (md -> tag_set );
2394+ }
23932395
23942396 free_table_devices (& md -> table_devices );
23952397 dm_stats_cleanup (& md -> stats );
@@ -2710,24 +2712,28 @@ static int dm_init_request_based_blk_mq_queue(struct mapped_device *md)
27102712 struct request_queue * q ;
27112713 int err ;
27122714
2713- memset (& md -> tag_set , 0 , sizeof (md -> tag_set ));
2714- md -> tag_set .ops = & dm_mq_ops ;
2715- md -> tag_set .queue_depth = dm_get_blk_mq_queue_depth ();
2716- md -> tag_set .numa_node = NUMA_NO_NODE ;
2717- md -> tag_set .flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE ;
2718- md -> tag_set .nr_hw_queues = dm_get_blk_mq_nr_hw_queues ();
2715+ md -> tag_set = kzalloc (sizeof (struct blk_mq_tag_set ), GFP_KERNEL );
2716+ if (!md -> tag_set )
2717+ return - ENOMEM ;
2718+
2719+ md -> tag_set -> ops = & dm_mq_ops ;
2720+ md -> tag_set -> queue_depth = dm_get_blk_mq_queue_depth ();
2721+ md -> tag_set -> numa_node = NUMA_NO_NODE ;
2722+ md -> tag_set -> flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE ;
2723+ md -> tag_set -> nr_hw_queues = dm_get_blk_mq_nr_hw_queues ();
2724+ md -> tag_set -> driver_data = md ;
2725+
2726+ md -> tag_set -> cmd_size = sizeof (struct dm_rq_target_io );
27192727 if (md_type == DM_TYPE_REQUEST_BASED ) {
2720- /* make the memory for non-blk-mq clone part of the pdu */
2721- md -> tag_set .cmd_size = sizeof (struct dm_rq_target_io ) + sizeof (struct request );
2722- } else
2723- md -> tag_set .cmd_size = sizeof (struct dm_rq_target_io );
2724- md -> tag_set .driver_data = md ;
2728+ /* put the memory for non-blk-mq clone at the end of the pdu */
2729+ md -> tag_set -> cmd_size += sizeof (struct request );
2730+ }
27252731
2726- err = blk_mq_alloc_tag_set (& md -> tag_set );
2732+ err = blk_mq_alloc_tag_set (md -> tag_set );
27272733 if (err )
2728- return err ;
2734+ goto out_kfree_tag_set ;
27292735
2730- q = blk_mq_init_allocated_queue (& md -> tag_set , md -> queue );
2736+ q = blk_mq_init_allocated_queue (md -> tag_set , md -> queue );
27312737 if (IS_ERR (q )) {
27322738 err = PTR_ERR (q );
27332739 goto out_tag_set ;
@@ -2744,7 +2750,10 @@ static int dm_init_request_based_blk_mq_queue(struct mapped_device *md)
27442750 return 0 ;
27452751
27462752out_tag_set :
2747- blk_mq_free_tag_set (& md -> tag_set );
2753+ blk_mq_free_tag_set (md -> tag_set );
2754+ out_kfree_tag_set :
2755+ kfree (md -> tag_set );
2756+
27482757 return err ;
27492758}
27502759
0 commit comments