2022-05-25 06:43:10 +03:00
// SPDX-License-Identifier: GPL-2.0
# ifndef IOU_FILE_TABLE_H
# define IOU_FILE_TABLE_H
2022-06-21 12:09:02 +03:00
# include <linux/file.h>
2022-06-25 13:55:38 +03:00
# include <linux/io_uring_types.h>
2022-05-25 06:43:10 +03:00
bool io_alloc_file_tables ( struct io_file_table * table , unsigned nr_files ) ;
void io_free_file_tables ( struct io_file_table * table ) ;
2022-05-26 18:44:31 +03:00
int io_fixed_fd_install ( struct io_kiocb * req , unsigned int issue_flags ,
struct file * file , unsigned int file_slot ) ;
2022-06-13 13:42:56 +03:00
int __io_fixed_fd_install ( struct io_ring_ctx * ctx , struct file * file ,
unsigned int file_slot ) ;
int io_fixed_fd_remove ( struct io_ring_ctx * ctx , unsigned int offset ) ;
2022-05-25 06:43:10 +03:00
2022-06-25 13:55:38 +03:00
int io_register_file_alloc_range ( struct io_ring_ctx * ctx ,
struct io_uring_file_index_range __user * arg ) ;
2022-05-25 19:40:19 +03:00
unsigned int io_file_get_flags ( struct file * file ) ;
2022-05-25 06:43:10 +03:00
static inline void io_file_bitmap_clear ( struct io_file_table * table , int bit )
{
2022-10-16 23:30:49 +03:00
WARN_ON_ONCE ( ! test_bit ( bit , table - > bitmap ) ) ;
2022-05-25 06:43:10 +03:00
__clear_bit ( bit , table - > bitmap ) ;
table - > alloc_hint = bit ;
}
static inline void io_file_bitmap_set ( struct io_file_table * table , int bit )
{
WARN_ON_ONCE ( test_bit ( bit , table - > bitmap ) ) ;
__set_bit ( bit , table - > bitmap ) ;
table - > alloc_hint = bit + 1 ;
}
static inline struct io_fixed_file *
io_fixed_file_slot ( struct io_file_table * table , unsigned i )
{
return & table - > files [ i ] ;
}
2023-06-20 14:32:35 +03:00
# define FFS_NOWAIT 0x1UL
# define FFS_ISREG 0x2UL
# define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG)
static inline unsigned int io_slot_flags ( struct io_fixed_file * slot )
{
return ( slot - > file_ptr & ~ FFS_MASK ) < < REQ_F_SUPPORT_NOWAIT_BIT ;
}
static inline struct file * io_slot_file ( struct io_fixed_file * slot )
{
return ( struct file * ) ( slot - > file_ptr & FFS_MASK ) ;
}
2022-05-25 19:40:19 +03:00
static inline struct file * io_file_from_index ( struct io_file_table * table ,
int index )
{
2023-06-20 14:32:35 +03:00
return io_slot_file ( io_fixed_file_slot ( table , index ) ) ;
2022-05-25 19:40:19 +03:00
}
static inline void io_fixed_file_set ( struct io_fixed_file * file_slot ,
struct file * file )
{
2023-06-20 14:32:32 +03:00
file_slot - > file_ptr = ( unsigned long ) file |
( io_file_get_flags ( file ) > > REQ_F_SUPPORT_NOWAIT_BIT ) ;
2022-05-25 19:40:19 +03:00
}
2022-06-25 13:55:38 +03:00
static inline void io_reset_alloc_hint ( struct io_ring_ctx * ctx )
{
ctx - > file_table . alloc_hint = ctx - > file_alloc_start ;
}
static inline void io_file_table_set_alloc_range ( struct io_ring_ctx * ctx ,
unsigned off , unsigned len )
{
ctx - > file_alloc_start = off ;
ctx - > file_alloc_end = off + len ;
io_reset_alloc_hint ( ctx ) ;
}
2022-05-25 06:43:10 +03:00
# endif