Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'dm-4.1-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper bugfixes from Mike Snitzer:
"Fix two bugs in the request-based DM blk-mq support that was added
during the 4.1 merge"

* tag 'dm-4.1-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
dm: fix free_rq_clone() NULL pointer when requeueing unmapped request
dm: only initialize the request_queue once

+21 -15
+9 -8
drivers/md/dm-ioctl.c
··· 1298 1298 goto err_unlock_md_type; 1299 1299 } 1300 1300 1301 - if (dm_get_md_type(md) == DM_TYPE_NONE) 1301 + if (dm_get_md_type(md) == DM_TYPE_NONE) { 1302 1302 /* Initial table load: acquire type of table. */ 1303 1303 dm_set_md_type(md, dm_table_get_type(t)); 1304 - else if (dm_get_md_type(md) != dm_table_get_type(t)) { 1304 + 1305 + /* setup md->queue to reflect md's type (may block) */ 1306 + r = dm_setup_md_queue(md); 1307 + if (r) { 1308 + DMWARN("unable to set up device queue for new table."); 1309 + goto err_unlock_md_type; 1310 + } 1311 + } else if (dm_get_md_type(md) != dm_table_get_type(t)) { 1305 1312 DMWARN("can't change device type after initial table load."); 1306 1313 r = -EINVAL; 1307 1314 goto err_unlock_md_type; 1308 1315 } 1309 1316 1310 - /* setup md->queue to reflect md's type (may block) */ 1311 - r = dm_setup_md_queue(md); 1312 - if (r) { 1313 - DMWARN("unable to set up device queue for new table."); 1314 - goto err_unlock_md_type; 1315 - } 1316 1317 dm_unlock_md_type(md); 1317 1318 1318 1319 /* stage inactive table */
+12 -7
drivers/md/dm.c
··· 1082 1082 dm_put(md); 1083 1083 } 1084 1084 1085 - static void free_rq_clone(struct request *clone) 1085 + static void free_rq_clone(struct request *clone, bool must_be_mapped) 1086 1086 { 1087 1087 struct dm_rq_target_io *tio = clone->end_io_data; 1088 1088 struct mapped_device *md = tio->md; 1089 1089 1090 + WARN_ON_ONCE(must_be_mapped && !clone->q); 1091 + 1090 1092 blk_rq_unprep_clone(clone); 1091 1093 1092 - if (clone->q->mq_ops) 1094 + if (md->type == DM_TYPE_MQ_REQUEST_BASED) 1095 + /* stacked on blk-mq queue(s) */ 1093 1096 tio->ti->type->release_clone_rq(clone); 1094 1097 else if (!md->queue->mq_ops) 1095 1098 /* request_fn queue stacked on request_fn queue(s) */ 1096 1099 free_clone_request(md, clone); 1100 + /* 1101 + * NOTE: for the blk-mq queue stacked on request_fn queue(s) case: 1102 + * no need to call free_clone_request() because we leverage blk-mq by 1103 + * allocating the clone at the end of the blk-mq pdu (see: clone_rq) 1104 + */ 1097 1105 1098 1106 if (!md->queue->mq_ops) 1099 1107 free_rq_tio(tio); ··· 1132 1124 rq->sense_len = clone->sense_len; 1133 1125 } 1134 1126 1135 - free_rq_clone(clone); 1127 + free_rq_clone(clone, true); 1136 1128 if (!rq->q->mq_ops) 1137 1129 blk_end_request_all(rq, error); 1138 1130 else ··· 1151 1143 } 1152 1144 1153 1145 if (clone) 1154 - free_rq_clone(clone); 1146 + free_rq_clone(clone, false); 1155 1147 } 1156 1148 1157 1149 /* ··· 2669 2661 static int dm_init_request_based_queue(struct mapped_device *md) 2670 2662 { 2671 2663 struct request_queue *q = NULL; 2672 - 2673 - if (md->queue->elevator) 2674 - return 0; 2675 2664 2676 2665 /* Fully initialize the queue */ 2677 2666 q = blk_init_allocated_queue(md->queue, dm_request_fn, NULL);