Pull core block fix from Jens Axboe:
"Jan reported a problem this morning with a crash in blk-mq, and after
looking over the recent changes, it's obvious that the blk-mq-tag
waitqueue handling change is buggy. We could end up _not_ doing
finish_wait() before switching to a new waitqueue, thus corrupting the
wait task list"
* 'for-linus' of git://git.kernel.dk/linux-block:
Revert "blk-mq: Micro-optimize bt_get()"
if (!(data->gfp & __GFP_WAIT))
return -1;
+ bs = bt_wait_ptr(bt, hctx);
do {
- bs = bt_wait_ptr(bt, hctx);
prepare_to_wait(&bs->wait, &wait, TASK_UNINTERRUPTIBLE);
tag = __bt_get(hctx, bt, last_tag);
hctx = data->hctx;
bt = &hctx->tags->bitmap_tags;
}
+ finish_wait(&bs->wait, &wait);
+ bs = bt_wait_ptr(bt, hctx);
} while (1);
finish_wait(&bs->wait, &wait);