I recently found some code which called blk_mq_free_map_and_requests() with a NULL set->tags pointer. I fixed the caller, but it seems like a good idea to add a NULL check here as well. Now we can call: blk_mq_free_tag_set(set); blk_mq_free_tag_set(set); twice in a row and it's harmless.
Unified · Split
| @@ -2341,7 +2341,7 @@ static bool __blk_mq_alloc_rq_map(struct blk_mq_tag_set *set, int hctx_idx) · 2340 unmodified lines | |||
| 2341 | static void blk_mq_free_map_and_requests(struct blk_mq_tag_set *set, | 2341 | static void blk_mq_free_map_and_requests(struct blk_mq_tag_set *set, |
| 2342 | unsigned int hctx_idx) | 2342 | unsigned int hctx_idx) |
| 2343 | { | 2343 | { |
| 2344 | if (set->tags[hctx_idx]) { | 2344 | if (set->tags && set->tags[hctx_idx]) { |
| 2345 | blk_mq_free_rqs(set, set->tags[hctx_idx], hctx_idx); | 2345 | blk_mq_free_rqs(set, set->tags[hctx_idx], hctx_idx); |
| 2346 | blk_mq_free_rq_map(set->tags[hctx_idx]); | 2346 | blk_mq_free_rq_map(set->tags[hctx_idx]); |
| 2347 | set->tags[hctx_idx] = NULL; | 2347 | set->tags[hctx_idx] = NULL; |