]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring/mock: allow to choose FMODE_NOWAIT
authorPavel Begunkov <asml.silence@gmail.com>
Mon, 30 Jun 2025 18:16:54 +0000 (19:16 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 2 Jul 2025 14:10:26 +0000 (08:10 -0600)
Add an option to choose whether the file supports FMODE_NOWAIT, that
changes the execution path io_uring request takes.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/1e532565b05a05b23589d237c24ee1a3d90c2fd9.1750599274.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/uapi/linux/io_uring/mock_file.h
io_uring/mock_file.c

index de27295bb365c2f42dc53079a41a9a392b8eccc9..125949d2b5cea0aec2046956ad2d6b61c10c9ed6 100644 (file)
@@ -6,6 +6,7 @@
 enum {
        IORING_MOCK_FEAT_CMD_COPY,
        IORING_MOCK_FEAT_RW_ZERO,
+       IORING_MOCK_FEAT_RW_NOWAIT,
 
        IORING_MOCK_FEAT_END,
 };
@@ -15,6 +16,10 @@ struct io_uring_mock_probe {
        __u64           __resv[9];
 };
 
+enum {
+       IORING_MOCK_CREATE_F_SUPPORT_NOWAIT                     = 1,
+};
+
 struct io_uring_mock_create {
        __u32           out_fd;
        __u32           flags;
index 90160ccb50f0711b9a64c5ee447b510486a34b19..0eb1d3bd63681aeabf6f11d6057ace87d360430f 100644 (file)
@@ -131,6 +131,8 @@ static const struct file_operations io_mock_fops = {
        .llseek         = io_mock_llseek,
 };
 
+#define IO_VALID_CREATE_FLAGS (IORING_MOCK_CREATE_F_SUPPORT_NOWAIT)
+
 static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flags)
 {
        const struct io_uring_sqe *sqe = cmd->sqe;
@@ -157,7 +159,9 @@ static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flag
        memset(&mc, 0, sizeof(mc));
        if (copy_from_user(&mc, uarg, uarg_size))
                return -EFAULT;
-       if (!mem_is_zero(mc.__resv, sizeof(mc.__resv)) || mc.flags)
+       if (!mem_is_zero(mc.__resv, sizeof(mc.__resv)))
+               return -EINVAL;
+       if (mc.flags & ~IO_VALID_CREATE_FLAGS)
                return -EINVAL;
        if (mc.file_size > SZ_1G)
                return -EINVAL;
@@ -180,6 +184,8 @@ static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flag
        file->f_mode |= FMODE_READ | FMODE_CAN_READ |
                        FMODE_WRITE | FMODE_CAN_WRITE |
                        FMODE_LSEEK;
+       if (mc.flags & IORING_MOCK_CREATE_F_SUPPORT_NOWAIT)
+               file->f_mode |= FMODE_NOWAIT;
 
        mc.out_fd = fd;
        if (copy_to_user(uarg, &mc, uarg_size)) {