io_uring: fix exiting io_req_task_work_add leaks
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 1 Jul 2021 12:26:05 +0000 (13:26 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 1 Jul 2021 19:40:32 +0000 (13:40 -0600)
commite09ee510600b941c62e94f6b59878cf53ba0e447
treee0ec580f8a7b915b9368913228f2a39c43b116f7
parent5b0a6acc73fcac5f7d17badd09275bf7b9b46603
io_uring: fix exiting io_req_task_work_add leaks

If one entered io_req_task_work_add() not seeing PF_EXITING, it will set
a ->task_state bit and try task_work_add(), which may fail by that
moment. If that happens the function would try to cancel the request.

However, in a meanwhile there might come other io_req_task_work_add()
callers, which will see the bit set and leave their requests in the
list, which will never be executed.

Don't propagate an error, but clear the bit first and then fallback
all requests that we can splice from the list. The callback functions
have to be able to deal with PF_EXITING, so poll and apoll was modified
via changing io_poll_rewait().

Fixes: 7cbf1722d5fc ("io_uring: provide FIFO ordering for task_work")
Reported-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/060002f19f1fdbd130ba24aef818ea4d3080819b.1625142209.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c