io_uring: add helpers to decode the fixed file file_ptr
authorChristoph Hellwig <hch@lst.de>
Tue, 20 Jun 2023 11:32:35 +0000 (13:32 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 20 Jun 2023 15:36:22 +0000 (09:36 -0600)
Remove all the open coded magic on slot->file_ptr by introducing two
helpers that return the file pointer and the flags instead.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230620113235.920399-9-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/filetable.c
io_uring/filetable.h
io_uring/io_uring.c
io_uring/rsrc.c

index 0f6fa791a47de6834de0b264812f367485dcd080..e7d749991de4267e8d1771b20a1e8d9cbe5c31c6 100644 (file)
@@ -78,10 +78,8 @@ static int io_install_fixed_file(struct io_ring_ctx *ctx, struct file *file,
        file_slot = io_fixed_file_slot(&ctx->file_table, slot_index);
 
        if (file_slot->file_ptr) {
-               struct file *old_file;
-
-               old_file = (struct file *)(file_slot->file_ptr & FFS_MASK);
-               ret = io_queue_rsrc_removal(ctx->file_data, slot_index, old_file);
+               ret = io_queue_rsrc_removal(ctx->file_data, slot_index,
+                                           io_slot_file(file_slot));
                if (ret)
                        return ret;
 
@@ -140,7 +138,6 @@ int io_fixed_fd_install(struct io_kiocb *req, unsigned int issue_flags,
 int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset)
 {
        struct io_fixed_file *file_slot;
-       struct file *file;
        int ret;
 
        if (unlikely(!ctx->file_data))
@@ -153,8 +150,8 @@ int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset)
        if (!file_slot->file_ptr)
                return -EBADF;
 
-       file = (struct file *)(file_slot->file_ptr & FFS_MASK);
-       ret = io_queue_rsrc_removal(ctx->file_data, offset, file);
+       ret = io_queue_rsrc_removal(ctx->file_data, offset,
+                                   io_slot_file(file_slot));
        if (ret)
                return ret;
 
index 697cb68adc816981b2e16067fa4dad984605cfd6..b47adf170c314daaf4c09b2b8ab1876079ccbf60 100644 (file)
@@ -5,10 +5,6 @@
 #include <linux/file.h>
 #include <linux/io_uring_types.h>
 
-#define FFS_NOWAIT             0x1UL
-#define FFS_ISREG              0x2UL
-#define FFS_MASK               ~(FFS_NOWAIT|FFS_ISREG)
-
 bool io_alloc_file_tables(struct io_file_table *table, unsigned nr_files);
 void io_free_file_tables(struct io_file_table *table);
 
@@ -43,12 +39,24 @@ io_fixed_file_slot(struct io_file_table *table, unsigned i)
        return &table->files[i];
 }
 
+#define FFS_NOWAIT             0x1UL
+#define FFS_ISREG              0x2UL
+#define FFS_MASK               ~(FFS_NOWAIT|FFS_ISREG)
+
+static inline unsigned int io_slot_flags(struct io_fixed_file *slot)
+{
+       return (slot->file_ptr & ~FFS_MASK) << REQ_F_SUPPORT_NOWAIT_BIT;
+}
+
+static inline struct file *io_slot_file(struct io_fixed_file *slot)
+{
+       return (struct file *)(slot->file_ptr & FFS_MASK);
+}
+
 static inline struct file *io_file_from_index(struct io_file_table *table,
                                              int index)
 {
-       struct io_fixed_file *slot = io_fixed_file_slot(table, index);
-
-       return (struct file *) (slot->file_ptr & FFS_MASK);
+       return io_slot_file(io_fixed_file_slot(table, index));
 }
 
 static inline void io_fixed_file_set(struct io_fixed_file *file_slot,
index 1f348753694bfe8eb3fccb25da7c3f6645fa243d..ae4cb3c4e73034769de8b4a07a17d995ca91ab49 100644 (file)
@@ -2028,19 +2028,17 @@ inline struct file *io_file_get_fixed(struct io_kiocb *req, int fd,
                                      unsigned int issue_flags)
 {
        struct io_ring_ctx *ctx = req->ctx;
+       struct io_fixed_file *slot;
        struct file *file = NULL;
-       unsigned long file_ptr;
 
        io_ring_submit_lock(ctx, issue_flags);
 
        if (unlikely((unsigned int)fd >= ctx->nr_user_files))
                goto out;
        fd = array_index_nospec(fd, ctx->nr_user_files);
-       file_ptr = io_fixed_file_slot(&ctx->file_table, fd)->file_ptr;
-       file = (struct file *) (file_ptr & FFS_MASK);
-       file_ptr &= ~FFS_MASK;
-       /* mask in overlapping REQ_F and FFS bits */
-       req->flags |= (file_ptr << REQ_F_SUPPORT_NOWAIT_BIT);
+       slot = io_fixed_file_slot(&ctx->file_table, fd);
+       file = io_slot_file(slot);
+       req->flags |= io_slot_flags(slot);
        io_req_set_rsrc_node(req, ctx, 0);
 out:
        io_ring_submit_unlock(ctx, issue_flags);
index d46f72a5ef732374a3f623e78ff636102490c673..a2dce7ef3a7877e75238a4b014cb88c928f94294 100644 (file)
@@ -354,7 +354,6 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
        __s32 __user *fds = u64_to_user_ptr(up->data);
        struct io_rsrc_data *data = ctx->file_data;
        struct io_fixed_file *file_slot;
-       struct file *file;
        int fd, i, err = 0;
        unsigned int done;
 
@@ -382,15 +381,16 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
                file_slot = io_fixed_file_slot(&ctx->file_table, i);
 
                if (file_slot->file_ptr) {
-                       file = (struct file *)(file_slot->file_ptr & FFS_MASK);
-                       err = io_queue_rsrc_removal(data, i, file);
+                       err = io_queue_rsrc_removal(data, i,
+                                                   io_slot_file(file_slot));
                        if (err)
                                break;
                        file_slot->file_ptr = 0;
                        io_file_bitmap_clear(&ctx->file_table, i);
                }
                if (fd != -1) {
-                       file = fget(fd);
+                       struct file *file = fget(fd);
+
                        if (!file) {
                                err = -EBADF;
                                break;