{
struct io_ring_ctx *ctx = req->ctx;
struct io_kiocb *preq;
+ bool completing;
int ret;
spin_lock_irq(&ctx->completion_lock);
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;
/* 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;
}