History

io_uring/mock: allow to choose FMODE_NOWAIT

Add an option to choose whether the file supports FMODE_NOWAIT, that changes the execution path io_uring request takes.

Pavel Begunkov committed 1 year ago

Commit 2f71d231 parent d1aa0342 files · +12 −1Browse files

Unified · Split

2 files
  1. include/uapi/linux/io_uring/mock_file.h +5 −0
  2. io_uring/mock_file.c +7 −1
include/uapi/linux/io_uring/mock_file.h+5−0
@@ -6,6 +6,7 @@ · 5 unmodified lines
66 enum {
77 IORING_MOCK_FEAT_CMD_COPY,
88 IORING_MOCK_FEAT_RW_ZERO,
9+ IORING_MOCK_FEAT_RW_NOWAIT,
910
1011 IORING_MOCK_FEAT_END,
1112 };
@@ -15,6 +16,10 @@ struct io_uring_mock_probe { · 3 unmodified lines
1516 __u64 __resv[9];
1617 };
1718
19+enum {
20+ IORING_MOCK_CREATE_F_SUPPORT_NOWAIT = 1,
21+};
22+
1823 struct io_uring_mock_create {
1924 __u32 out_fd;
2025 __u32 flags;
io_uring/mock_file.c+7−1
@@ -131,6 +131,8 @@ static const struct file_operations io_mock_fops = { · 130 unmodified lines
131131 .llseek = io_mock_llseek,
132132 };
133133
134+#define IO_VALID_CREATE_FLAGS (IORING_MOCK_CREATE_F_SUPPORT_NOWAIT)
135+
134136 static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flags)
135137 {
136138 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 · 20 unmodified lines
157159 memset(&mc, 0, sizeof(mc));
158160 if (copy_from_user(&mc, uarg, uarg_size))
159161 return -EFAULT;
160− if (!mem_is_zero(mc.__resv, sizeof(mc.__resv)) || mc.flags)
162+ if (!mem_is_zero(mc.__resv, sizeof(mc.__resv)))
163+ return -EINVAL;
164+ if (mc.flags & ~IO_VALID_CREATE_FLAGS)
161165 return -EINVAL;
162166 if (mc.file_size > SZ_1G)
163167 return -EINVAL;
@@ -180,6 +184,8 @@ static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flag · 16 unmodified lines
180184 file->f_mode |= FMODE_READ | FMODE_CAN_READ |
181185 FMODE_WRITE | FMODE_CAN_WRITE |
182186 FMODE_LSEEK;
187+ if (mc.flags & IORING_MOCK_CREATE_F_SUPPORT_NOWAIT)
188+ file->f_mode |= FMODE_NOWAIT;
183189
184190 mc.out_fd = fd;
185191 if (copy_to_user(uarg, &mc, uarg_size)) {