From: noah <goldstein.n@xxxxxxxxx> This patch makes it so that specify a file descriptor value of -2 will skip updating the corresponding fixed file index. This will allow for users to reduce the number of syscalls necessary to update a sparse file range when using the fixed file option. Signed-off-by: noah <goldstein.w.n@xxxxxxxxx> --- fs/io_uring.c | 72 ++++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index 6f9392c35eef..43ab2b7a87d4 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -7876,42 +7876,44 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx, err = -EFAULT; break; } - i = array_index_nospec(up->offset, ctx->nr_user_files); - table = &ctx->file_data->table[i >> IORING_FILE_TABLE_SHIFT]; - index = i & IORING_FILE_TABLE_MASK; - if (table->files[index]) { - file = table->files[index]; - err = io_queue_file_removal(data, file); - if (err) - break; - table->files[index] = NULL; - needs_switch = true; - } - if (fd != -1) { - file = fget(fd); - if (!file) { - err = -EBADF; - break; - } - /* - * Don't allow io_uring instances to be registered. If - * UNIX isn't enabled, then this causes a reference - * cycle and this instance can never get freed. If UNIX - * is enabled we'll handle it just fine, but there's - * still no point in allowing a ring fd as it doesn't - * support regular read/write anyway. - */ - if (file->f_op == &io_uring_fops) { - fput(file); - err = -EBADF; - break; - } - table->files[index] = file; - err = io_sqe_file_register(ctx, file, i); - if (err) { + if (fd != -2) { + i = array_index_nospec(up->offset, ctx->nr_user_files); + table = &ctx->file_data->table[i >> IORING_FILE_TABLE_SHIFT]; + index = i & IORING_FILE_TABLE_MASK; + if (table->files[index]) { + file = table->files[index]; + err = io_queue_file_removal(data, file); + if (err) + break; table->files[index] = NULL; - fput(file); - break; + needs_switch = true; + } + if (fd != -1) { + file = fget(fd); + if (!file) { + err = -EBADF; + break; + } + /* + * Don't allow io_uring instances to be registered. If + * UNIX isn't enabled, then this causes a reference + * cycle and this instance can never get freed. If UNIX + * is enabled we'll handle it just fine, but there's + * still no point in allowing a ring fd as it doesn't + * support regular read/write anyway. + */ + if (file->f_op == &io_uring_fops) { + fput(file); + err = -EBADF; + break; + } + table->files[index] = file; + err = io_sqe_file_register(ctx, file, i); + if (err) { + table->files[index] = NULL; + fput(file); + break; + } } } nr_args--; -- 2.29.2