summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-08-10 10:54:02 -0600
committerJens Axboe <axboe@kernel.dk>2020-08-10 15:19:25 -0600
commit9b7adba9eaec28e0e4343c96d0dbeb9578802f5f (patch)
tree5dbf29bdddb9f401cb6a38468d7ad90896f4aa9f
parent7271ef3a93a832180068c7aade3f130b7f39b17e (diff)
downloadlinux-stable-9b7adba9eaec28e0e4343c96d0dbeb9578802f5f.tar.gz
linux-stable-9b7adba9eaec28e0e4343c96d0dbeb9578802f5f.tar.bz2
linux-stable-9b7adba9eaec28e0e4343c96d0dbeb9578802f5f.zip
io_uring: add missing REQ_F_COMP_LOCKED for nested requests
When we traverse into failing links or timeouts, we need to ensure we propagate the REQ_F_COMP_LOCKED flag to ensure that we correctly signal to the completion side that we already hold the completion lock. Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--fs/io_uring.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 360649041bfa..56115cb4b9fa 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1609,6 +1609,7 @@ static bool __io_kill_linked_timeout(struct io_kiocb *req)
return false;
list_del_init(&link->link_list);
+ link->flags |= REQ_F_COMP_LOCKED;
wake_ev = io_link_cancel_timeout(link);
req->flags &= ~REQ_F_LINK_TIMEOUT;
return wake_ev;
@@ -1667,6 +1668,7 @@ static void __io_fail_links(struct io_kiocb *req)
trace_io_uring_fail_link(req, link);
io_cqring_fill_event(link, -ECANCELED);
+ link->flags |= REQ_F_COMP_LOCKED;
__io_double_put_req(link);
req->flags &= ~REQ_F_LINK_TIMEOUT;
}
@@ -5071,6 +5073,7 @@ static int io_timeout_cancel(struct io_ring_ctx *ctx, __u64 user_data)
return -EALREADY;
req_set_fail_links(req);
+ req->flags |= REQ_F_COMP_LOCKED;
io_cqring_fill_event(req, -ECANCELED);
io_put_req(req);
return 0;