aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2019-11-18 12:27:57 -0700
committerJens Axboe <axboe@kernel.dk>2019-11-25 19:56:05 -0700
commitfba38c272a0385148935d6443cb9dc68cf1f37a7 (patch)
tree0c7d7b8b48b83f58c7bd6eef2fa4f3046f37bd75 /fs
parentio_uring: correct poll cancel and linked timeout expiration completion (diff)
downloadwireguard-linux-fba38c272a0385148935d6443cb9dc68cf1f37a7.tar.xz
wireguard-linux-fba38c272a0385148935d6443cb9dc68cf1f37a7.zip
io_uring: request cancellations should break links
We currently don't explicitly break links if a request is cancelled, but we should. Add explicitly link breakage for all types of request cancellations that we support. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r--fs/io_uring.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 40c351a9ed26..6550b7eab7d2 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2118,6 +2118,8 @@ static void io_poll_complete_work(struct io_wq_work **workptr)
io_cqring_ev_posted(ctx);
+ if (ret < 0 && req->flags & REQ_F_LINK)
+ req->flags |= REQ_F_FAIL_LINK;
io_put_req_find_next(req, &nxt);
if (nxt)
*workptr = &nxt->work;
@@ -2331,6 +2333,8 @@ static int io_timeout_cancel(struct io_ring_ctx *ctx, __u64 user_data)
if (ret == -1)
return -EALREADY;
+ if (req->flags & REQ_F_LINK)
+ req->flags |= REQ_F_FAIL_LINK;
io_cqring_fill_event(req, -ECANCELED);
io_put_req(req);
return 0;
@@ -2841,6 +2845,8 @@ static enum hrtimer_restart io_link_timeout_fn(struct hrtimer *timer)
spin_unlock_irqrestore(&ctx->completion_lock, flags);
if (prev) {
+ if (prev->flags & REQ_F_LINK)
+ prev->flags |= REQ_F_FAIL_LINK;
io_async_find_and_cancel(ctx, req, prev->user_data, NULL,
-ETIME);
io_put_req(prev);