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>
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
);
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
);
17 int io_register_file_alloc_range(struct io_ring_ctx
*ctx
,
18 struct io_uring_file_index_range __user
*arg
);
20 unsigned int io_file_get_flags(struct file
*file
);
22 static inline void io_file_bitmap_clear(struct io_file_table
*table
, int bit
)
24 WARN_ON_ONCE(!test_bit(bit
, table
->bitmap
));
25 __clear_bit(bit
, table
->bitmap
);
26 table
->alloc_hint
= bit
;
29 static inline void io_file_bitmap_set(struct io_file_table
*table
, int bit
)
31 WARN_ON_ONCE(test_bit(bit
, table
->bitmap
));
32 __set_bit(bit
, table
->bitmap
);
33 table
->alloc_hint
= bit
+ 1;
36 static inline struct io_fixed_file
*
37 io_fixed_file_slot(struct io_file_table
*table
, unsigned i
)
39 return &table
->files
[i
];
42 #define FFS_NOWAIT 0x1UL
43 #define FFS_ISREG 0x2UL
44 #define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG)
46 static inline unsigned int io_slot_flags(struct io_fixed_file
*slot
)
48 return (slot
->file_ptr
& ~FFS_MASK
) << REQ_F_SUPPORT_NOWAIT_BIT
;
51 static inline struct file
*io_slot_file(struct io_fixed_file
*slot
)
53 return (struct file
*)(slot
->file_ptr
& FFS_MASK
);
56 static inline struct file
*io_file_from_index(struct io_file_table
*table
,
59 return io_slot_file(io_fixed_file_slot(table
, index
));
62 static inline void io_fixed_file_set(struct io_fixed_file
*file_slot
,
65 file_slot
->file_ptr
= (unsigned long)file
|
66 (io_file_get_flags(file
) >> REQ_F_SUPPORT_NOWAIT_BIT
);
69 static inline void io_reset_alloc_hint(struct io_ring_ctx
*ctx
)
71 ctx
->file_table
.alloc_hint
= ctx
->file_alloc_start
;
74 static inline void io_file_table_set_alloc_range(struct io_ring_ctx
*ctx
,
75 unsigned off
, unsigned len
)
77 ctx
->file_alloc_start
= off
;
78 ctx
->file_alloc_end
= off
+ len
;
79 io_reset_alloc_hint(ctx
);