| 1 | |
| 2 | #ifndef IOU_FILE_TABLE_H
|
| 3 | #define IOU_FILE_TABLE_H
|
| 4 |
|
| 5 | #include <linux/io_uring_types.h>
|
| 6 | #include "rsrc.h"
|
| 7 |
|
| 8 | bool io_alloc_file_tables(struct io_ring_ctx *ctx, struct io_file_table *table, unsigned nr_files);
|
| 9 | void io_free_file_tables(struct io_ring_ctx *ctx, 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 | io_req_flags_t io_file_get_flags(struct file *file);
|
| 21 |
|
| 22 | static inline void io_file_bitmap_clear(struct io_file_table *table, int bit)
|
| 23 | {
|
| 24 | WARN_ON_ONCE(!test_bit(bit, table->bitmap));
|
| 25 | __clear_bit(bit, table->bitmap);
|
| 26 | table->alloc_hint = bit;
|
| 27 | }
|
| 28 |
|
| 29 | static inline void io_file_bitmap_set(struct io_file_table *table, int bit)
|
| 30 | {
|
| 31 | WARN_ON_ONCE(test_bit(bit, table->bitmap));
|
| 32 | __set_bit(bit, table->bitmap);
|
| 33 | table->alloc_hint = bit + 1;
|
| 34 | }
|
| 35 |
|
| 36 | #define FFS_NOWAIT 0x1UL
|
| 37 | #define FFS_ISREG 0x2UL
|
| 38 | #define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG)
|
| 39 |
|
| 40 | static inline unsigned int io_slot_flags(struct io_rsrc_node *node)
|
| 41 | {
|
| 42 |
|
| 43 | return (node->file_ptr & ~FFS_MASK) << REQ_F_SUPPORT_NOWAIT_BIT;
|
| 44 | }
|
| 45 |
|
| 46 | static inline struct file *io_slot_file(struct io_rsrc_node *node)
|
| 47 | {
|
| 48 | return (struct file *)(node->file_ptr & FFS_MASK);
|
| 49 | }
|
| 50 |
|
| 51 | static inline void io_fixed_file_set(struct io_rsrc_node *node,
|
| 52 | struct file *file)
|
| 53 | {
|
| 54 | node->file_ptr = (unsigned long)file |
|
| 55 | (io_file_get_flags(file) >> REQ_F_SUPPORT_NOWAIT_BIT);
|
| 56 | }
|
| 57 |
|
| 58 | static inline void io_file_table_set_alloc_range(struct io_ring_ctx *ctx,
|
| 59 | unsigned off, unsigned len)
|
| 60 | {
|
| 61 | ctx->file_alloc_start = off;
|
| 62 | ctx->file_alloc_end = off + len;
|
| 63 | ctx->file_table.alloc_hint = ctx->file_alloc_start;
|
| 64 | }
|
| 65 |
|
| 66 | #endif
|