1 // SPDX-License-Identifier: GPL-2.0
2 #ifndef IOU_FILE_TABLE_H
3 #define IOU_FILE_TABLE_H
5 #include <linux/file.h>
6 #include <linux/io_uring_types.h>
9 bool io_alloc_file_tables(struct io_ring_ctx
*ctx
, struct io_file_table
*table
, unsigned nr_files
);
10 void io_free_file_tables(struct io_ring_ctx
*ctx
, struct io_file_table
*table
);
12 int io_fixed_fd_install(struct io_kiocb
*req
, unsigned int issue_flags
,
13 struct file
*file
, unsigned int file_slot
);
14 int __io_fixed_fd_install(struct io_ring_ctx
*ctx
, struct file
*file
,
15 unsigned int file_slot
);
16 int io_fixed_fd_remove(struct io_ring_ctx
*ctx
, unsigned int offset
);
18 int io_register_file_alloc_range(struct io_ring_ctx
*ctx
,
19 struct io_uring_file_index_range __user
*arg
);
21 io_req_flags_t
io_file_get_flags(struct file
*file
);
23 static inline void io_file_bitmap_clear(struct io_file_table
*table
, int bit
)
25 WARN_ON_ONCE(!test_bit(bit
, table
->bitmap
));
26 __clear_bit(bit
, table
->bitmap
);
27 table
->alloc_hint
= bit
;
30 static inline void io_file_bitmap_set(struct io_file_table
*table
, int bit
)
32 WARN_ON_ONCE(test_bit(bit
, table
->bitmap
));
33 __set_bit(bit
, table
->bitmap
);
34 table
->alloc_hint
= bit
+ 1;
37 #define FFS_NOWAIT 0x1UL
38 #define FFS_ISREG 0x2UL
39 #define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG)
41 static inline unsigned int io_slot_flags(struct io_rsrc_node
*node
)
44 return (node
->file_ptr
& ~FFS_MASK
) << REQ_F_SUPPORT_NOWAIT_BIT
;
47 static inline struct file
*io_slot_file(struct io_rsrc_node
*node
)
49 return (struct file
*)(node
->file_ptr
& FFS_MASK
);
52 static inline void io_fixed_file_set(struct io_rsrc_node
*node
,
55 node
->file_ptr
= (unsigned long)file
|
56 (io_file_get_flags(file
) >> REQ_F_SUPPORT_NOWAIT_BIT
);
59 static inline void io_file_table_set_alloc_range(struct io_ring_ctx
*ctx
,
60 unsigned off
, unsigned len
)
62 ctx
->file_alloc_start
= off
;
63 ctx
->file_alloc_end
= off
+ len
;
64 ctx
->file_table
.alloc_hint
= ctx
->file_alloc_start
;