io_uring: fix racy REQ_F_LINK_TIMEOUT clearing
authorPavel Begunkov <asml.silence@gmail.com>
Mon, 19 Oct 2020 15:39:16 +0000 (16:39 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 19 Oct 2020 19:29:51 +0000 (13:29 -0600)
commit900fad45dc75c8af6015bc514cc11aa3d265426a
tree97991353a10ad1d323746b75bdc91df9fbabf161
parent4d52f338992bfc9f494e5a7eb55f4249ab11cd66
io_uring: fix racy REQ_F_LINK_TIMEOUT clearing

io_link_timeout_fn() removes REQ_F_LINK_TIMEOUT from the link head's
flags, it's not atomic and may race with what the head is doing.

If io_link_timeout_fn() doesn't clear the flag, as forced by this patch,
then it may happen that for "req -> link_timeout1 -> link_timeout2",
__io_kill_linked_timeout() would find link_timeout2 and try to cancel
it, so miscounting references. Teach it to ignore such double timeouts
by marking the active one with a new flag in io_prep_linked_timeout().

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c