aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2015-05-28 15:12:52 -0400
committerMike Snitzer <snitzer@redhat.com>2015-05-29 11:07:36 -0400
commite5d8de32cc02a259e1a237ab57cba00f2930fa6a (patch)
tree5c0230f71e12c9349e9c755f722bf837456b0802 /drivers/md
parent45714fbed4556149d7f1730f5bae74f81d5e2cd5 (diff)
dm: fix false warning in free_rq_clone() for unmapped requests
When stacking request-based dm device on non blk-mq device and device-mapper target could not map the request (error target is used, multipath target with all paths down, etc), the WARN_ON_ONCE() in free_rq_clone() will trigger when it shouldn't. The warning was added by commit aa6df8d ("dm: fix free_rq_clone() NULL pointer when requeueing unmapped request"). But free_rq_clone() with clone->q == NULL is valid usage for the case where dm_kill_unmapped_request() initiates request cleanup. Fix this false warning by just removing the WARN_ON -- it only generated false positives and was never useful in catching the intended case (completing clone request not being mapped e.g. clone->q being NULL). Fixes: aa6df8d ("dm: fix free_rq_clone() NULL pointer when requeueing unmapped request") Reported-by: Bart Van Assche <bart.vanassche@sandisk.com> Reported-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 1badfb250a18..e24069aaeb18 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1082,13 +1082,11 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue)
1082 dm_put(md); 1082 dm_put(md);
1083} 1083}
1084 1084
1085static void free_rq_clone(struct request *clone, bool must_be_mapped) 1085static void free_rq_clone(struct request *clone)
1086{ 1086{
1087 struct dm_rq_target_io *tio = clone->end_io_data; 1087 struct dm_rq_target_io *tio = clone->end_io_data;
1088 struct mapped_device *md = tio->md; 1088 struct mapped_device *md = tio->md;
1089 1089
1090 WARN_ON_ONCE(must_be_mapped && !clone->q);
1091
1092 blk_rq_unprep_clone(clone); 1090 blk_rq_unprep_clone(clone);
1093 1091
1094 if (md->type == DM_TYPE_MQ_REQUEST_BASED) 1092 if (md->type == DM_TYPE_MQ_REQUEST_BASED)
@@ -1132,7 +1130,7 @@ static void dm_end_request(struct request *clone, int error)
1132 rq->sense_len = clone->sense_len; 1130 rq->sense_len = clone->sense_len;
1133 } 1131 }
1134 1132
1135 free_rq_clone(clone, true); 1133 free_rq_clone(clone);
1136 if (!rq->q->mq_ops) 1134 if (!rq->q->mq_ops)
1137 blk_end_request_all(rq, error); 1135 blk_end_request_all(rq, error);
1138 else 1136 else
@@ -1151,7 +1149,7 @@ static void dm_unprep_request(struct request *rq)
1151 } 1149 }
1152 1150
1153 if (clone) 1151 if (clone)
1154 free_rq_clone(clone, false); 1152 free_rq_clone(clone);
1155} 1153}
1156 1154
1157/* 1155/*