blk-mq-tag: check for NULL rq when iterating tags
Since we introduced blk-mq-sched, the tags->rqs[] array has been dynamically assigned. So we need to check for NULL when iterating, since there's a window of time where the bit is set, but we haven't dynamically assigned the tags->rqs[] array position yet. This is perfectly safe, since the memory backing of the request is never going away while the device is alive. Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
62d20aa6a0
commit
7f5562d5ec
|
@ -214,7 +214,11 @@ static bool bt_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
|
||||||
bitnr += tags->nr_reserved_tags;
|
bitnr += tags->nr_reserved_tags;
|
||||||
rq = tags->rqs[bitnr];
|
rq = tags->rqs[bitnr];
|
||||||
|
|
||||||
if (rq->q == hctx->queue)
|
/*
|
||||||
|
* We can hit rq == NULL here, because the tagging functions
|
||||||
|
* test and set the bit before assining ->rqs[].
|
||||||
|
*/
|
||||||
|
if (rq && rq->q == hctx->queue)
|
||||||
iter_data->fn(hctx, rq, iter_data->data, reserved);
|
iter_data->fn(hctx, rq, iter_data->data, reserved);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -248,9 +252,15 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
|
||||||
|
|
||||||
if (!reserved)
|
if (!reserved)
|
||||||
bitnr += tags->nr_reserved_tags;
|
bitnr += tags->nr_reserved_tags;
|
||||||
rq = tags->rqs[bitnr];
|
|
||||||
|
|
||||||
iter_data->fn(rq, iter_data->data, reserved);
|
/*
|
||||||
|
* We can hit rq == NULL here, because the tagging functions
|
||||||
|
* test and set the bit before assining ->rqs[].
|
||||||
|
*/
|
||||||
|
rq = tags->rqs[bitnr];
|
||||||
|
if (rq)
|
||||||
|
iter_data->fn(rq, iter_data->data, reserved);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue