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 7 struct io_ring_ctx; 8 struct io_kiocb; 9 10 /* 11 * FFS_SCM is only available on 64-bit archs, for 32-bit we just define it as 0 12 * and define IO_URING_SCM_ALL. For this case, we use SCM for all files as we 13 * can't safely always dereference the file when the task has exited and ring 14 * cleanup is done. If a file is tracked and part of SCM, then unix gc on 15 * process exit may reap it before __io_sqe_files_unregister() is run. 16 */ 17 #define FFS_NOWAIT 0x1UL 18 #define FFS_ISREG 0x2UL 19 #if defined(CONFIG_64BIT) 20 #define FFS_SCM 0x4UL 21 #else 22 #define IO_URING_SCM_ALL 23 #define FFS_SCM 0x0UL 24 #endif 25 #define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG|FFS_SCM) 26 27 bool io_alloc_file_tables(struct io_file_table *table, unsigned nr_files); 28 void io_free_file_tables(struct io_file_table *table); 29 30 int io_fixed_fd_install(struct io_kiocb *req, unsigned int issue_flags, 31 struct file *file, unsigned int file_slot); 32 int __io_fixed_fd_install(struct io_ring_ctx *ctx, struct file *file, 33 unsigned int file_slot); 34 int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset); 35 36 unsigned int io_file_get_flags(struct file *file); 37 38 static inline void io_file_bitmap_clear(struct io_file_table *table, int bit) 39 { 40 __clear_bit(bit, table->bitmap); 41 table->alloc_hint = bit; 42 } 43 44 static inline void io_file_bitmap_set(struct io_file_table *table, int bit) 45 { 46 WARN_ON_ONCE(test_bit(bit, table->bitmap)); 47 __set_bit(bit, table->bitmap); 48 table->alloc_hint = bit + 1; 49 } 50 51 static inline struct io_fixed_file * 52 io_fixed_file_slot(struct io_file_table *table, unsigned i) 53 { 54 return &table->files[i]; 55 } 56 57 static inline struct file *io_file_from_index(struct io_file_table *table, 58 int index) 59 { 60 struct io_fixed_file *slot = io_fixed_file_slot(table, index); 61 62 return (struct file *) (slot->file_ptr & FFS_MASK); 63 } 64 65 static inline void io_fixed_file_set(struct io_fixed_file *file_slot, 66 struct file *file) 67 { 68 unsigned long file_ptr = (unsigned long) file; 69 70 file_ptr |= io_file_get_flags(file); 71 file_slot->file_ptr = file_ptr; 72 } 73 74 #endif 75