io-wq: fix race around io_worker grabbing
authorJens Axboe <axboe@kernel.dk>
Wed, 24 Feb 2021 02:59:06 +0000 (19:59 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 24 Feb 2021 03:33:41 +0000 (20:33 -0700)
commiteb2de9418d56b5e6ebf27bad51dbce3e22ee109b
treeca26faeedb21d7d419bbd5e4c809dd82516ca4da
parent8b3e78b5955abb98863832453f5c74eca8f53c3a
io-wq: fix race around io_worker grabbing

There's a small window between lookup dropping the reference to the
worker and calling wake_up_process() on the worker task, where the worker
itself could have exited. We ensure that the worker struct itself is
valid, but worker->task may very well be gone by the time we issue the
wakeup.

Fix the race by using a completion triggered by the reference going to
zero, and having exit wait for that completion before proceeding.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.c