aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2021-04-06 09:49:31 -0600
committerJens Axboe <axboe@kernel.dk>2021-04-06 09:49:31 -0600
commit283fc84eaeb1031e1f2389e4e365e44cd4398b9c (patch)
tree61c635b3130b8b19712e249b6166fe6a4d2fda6b
parent542d7354e6f2f06f38a3791b9281021d4a989355 (diff)
downloadlinux-block-poll-multiple.tar.gz
io_uring: poll update test patchpoll-multiple
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--fs/io_uring.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index f94b32b434292d..c210c9cc3feed2 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;
}