diff options
author | Jens Axboe <axboe@kernel.dk> | 2021-04-06 09:49:31 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-04-06 09:49:31 -0600 |
commit | 283fc84eaeb1031e1f2389e4e365e44cd4398b9c (patch) | |
tree | 61c635b3130b8b19712e249b6166fe6a4d2fda6b | |
parent | 542d7354e6f2f06f38a3791b9281021d4a989355 (diff) |
io_uring: poll update test patchpoll-multiple
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | fs/io_uring.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index f94b32b43429..c210c9cc3fee 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -5413,6 +5413,7 @@ static int io_poll_update(struct io_kiocb *req) { struct io_ring_ctx *ctx = req->ctx; struct io_kiocb *preq; + bool completing; int ret; spin_lock_irq(&ctx->completion_lock); @@ -5425,7 +5426,8 @@ static int io_poll_update(struct io_kiocb *req) ret = -EACCES; goto err; } - if (!__io_poll_remove_one(preq, &preq->poll, false)) { + completing = !__io_poll_remove_one(preq, &preq->poll, false); + if (completing) { if (preq->poll.events & EPOLLONESHOT) { ret = -EALREADY; goto err; @@ -5452,10 +5454,12 @@ err: /* complete update request, we're done with it */ io_req_complete(req, ret); - ret = __io_poll_add(preq); - if (ret < 0) { - req_set_fail_links(preq); - io_req_complete(preq, ret); + if (!completing) { + ret = __io_poll_add(preq); + if (ret < 0) { + req_set_fail_links(preq); + io_req_complete(preq, ret); + } } return 0; } |