io_uring: disable multishot poll for double poll add cases
authorJens Axboe <axboe@kernel.dk>
Thu, 15 Apr 2021 15:47:13 +0000 (09:47 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 16 Apr 2021 02:17:11 +0000 (20:17 -0600)
The re-add handling isn't correct for the multi wait case, so let's
just disable it for now explicitly until we can get that sorted out. This
just turns it into a one-shot request. Since we pass back whether or not
a poll request terminates in multishot mode on completion, this should
not break properly behaving applications that check for IORING_CQE_F_MORE
on completion.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index ab14692b05b41f161c0c7a84d700a9dd7f89af26..4803e31e93012b8e12494d0a64a7034b00132054 100644 (file)
@@ -4976,6 +4976,12 @@ static void __io_queue_proc(struct io_poll_iocb *poll, struct io_poll_table *pt,
                        pt->error = -EINVAL;
                        return;
                }
+               /*
+                * Can't handle multishot for double wait for now, turn it
+                * into one-shot mode.
+                */
+               if (!(req->poll.events & EPOLLONESHOT))
+                       req->poll.events |= EPOLLONESHOT;
                /* double add on the same waitqueue head, ignore */
                if (poll->head == head)
                        return;