]> git.itanic.dy.fi Git - linux-stable/commitdiff
io_uring: disable io-wq execution of multishot NOWAIT requests
authorJens Axboe <axboe@kernel.dk>
Mon, 1 Apr 2024 17:30:06 +0000 (11:30 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Apr 2024 09:23:35 +0000 (11:23 +0200)
Commit bee1d5becdf5bf23d4ca0cd9c6b60bdf3c61d72b upstream.

Do the same check for direct io-wq execution for multishot requests that
commit 2a975d426c82 did for the inline execution, and disable multishot
mode (and revert to single shot) if the file type doesn't support NOWAIT,
and isn't opened in O_NONBLOCK mode. For multishot to work properly, it's
a requirement that nonblocking read attempts can be done.

Cc: stable@vger.kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
io_uring/io_uring.c

index 65475b7aa03a372db2c6b85104f38c2b29f9aac0..3fc792dfc6ae724aef7289ea940bc8aed5acd9ee 100644 (file)
@@ -1964,10 +1964,15 @@ void io_wq_submit_work(struct io_wq_work *work)
                err = -EBADFD;
                if (!file_can_poll(req->file))
                        goto fail;
-               err = -ECANCELED;
-               if (io_arm_poll_handler(req, issue_flags) != IO_APOLL_OK)
-                       goto fail;
-               return;
+               if (req->file->f_flags & O_NONBLOCK ||
+                   req->file->f_mode & FMODE_NOWAIT) {
+                       err = -ECANCELED;
+                       if (io_arm_poll_handler(req, issue_flags) != IO_APOLL_OK)
+                               goto fail;
+                       return;
+               } else {
+                       req->flags &= ~REQ_F_APOLL_MULTISHOT;
+               }
        }
 
        if (req->flags & REQ_F_FORCE_ASYNC) {