Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : #ifndef IOU_FILE_TABLE_H 3 : #define IOU_FILE_TABLE_H 4 : 5 : #include <linux/file.h> 6 : #include <linux/io_uring_types.h> 7 : 8 : bool io_alloc_file_tables(struct io_file_table *table, unsigned nr_files); 9 : void io_free_file_tables(struct io_file_table *table); 10 : 11 : int io_fixed_fd_install(struct io_kiocb *req, unsigned int issue_flags, 12 : struct file *file, unsigned int file_slot); 13 : int __io_fixed_fd_install(struct io_ring_ctx *ctx, struct file *file, 14 : unsigned int file_slot); 15 : int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset); 16 : 17 : int io_register_file_alloc_range(struct io_ring_ctx *ctx, 18 : struct io_uring_file_index_range __user *arg); 19 : 20 : unsigned int io_file_get_flags(struct file *file); 21 : 22 0 : static inline void io_file_bitmap_clear(struct io_file_table *table, int bit) 23 : { 24 0 : WARN_ON_ONCE(!test_bit(bit, table->bitmap)); 25 0 : __clear_bit(bit, table->bitmap); 26 0 : table->alloc_hint = bit; 27 0 : } 28 : 29 0 : static inline void io_file_bitmap_set(struct io_file_table *table, int bit) 30 : { 31 0 : WARN_ON_ONCE(test_bit(bit, table->bitmap)); 32 0 : __set_bit(bit, table->bitmap); 33 0 : table->alloc_hint = bit + 1; 34 0 : } 35 : 36 : static inline struct io_fixed_file * 37 : io_fixed_file_slot(struct io_file_table *table, unsigned i) 38 : { 39 0 : return &table->files[i]; 40 : } 41 : 42 : #define FFS_NOWAIT 0x1UL 43 : #define FFS_ISREG 0x2UL 44 : #define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG) 45 : 46 : static inline unsigned int io_slot_flags(struct io_fixed_file *slot) 47 : { 48 0 : return (slot->file_ptr & ~FFS_MASK) << REQ_F_SUPPORT_NOWAIT_BIT; 49 : } 50 : 51 : static inline struct file *io_slot_file(struct io_fixed_file *slot) 52 : { 53 0 : return (struct file *)(slot->file_ptr & FFS_MASK); 54 : } 55 : 56 : static inline struct file *io_file_from_index(struct io_file_table *table, 57 : int index) 58 : { 59 0 : return io_slot_file(io_fixed_file_slot(table, index)); 60 : } 61 : 62 : static inline void io_fixed_file_set(struct io_fixed_file *file_slot, 63 : struct file *file) 64 : { 65 0 : file_slot->file_ptr = (unsigned long)file | 66 0 : (io_file_get_flags(file) >> REQ_F_SUPPORT_NOWAIT_BIT); 67 : } 68 : 69 : static inline void io_reset_alloc_hint(struct io_ring_ctx *ctx) 70 : { 71 0 : ctx->file_table.alloc_hint = ctx->file_alloc_start; 72 : } 73 : 74 : static inline void io_file_table_set_alloc_range(struct io_ring_ctx *ctx, 75 : unsigned off, unsigned len) 76 : { 77 0 : ctx->file_alloc_start = off; 78 0 : ctx->file_alloc_end = off + len; 79 0 : io_reset_alloc_hint(ctx); 80 : } 81 : 82 : #endif