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
# define FFS_NOWAIT 0x1UL
# define FFS_ISREG 0x2UL
2022-10-16 23:30:48 +03:00
# define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG)
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 ] ;
}
2022-05-25 19:40:19 +03:00
static inline struct file * io_file_from_index ( struct io_file_table * table ,
int index )
{
struct io_fixed_file * slot = io_fixed_file_slot ( table , index ) ;
return ( struct file * ) ( slot - > file_ptr & FFS_MASK ) ;
}
static inline void io_fixed_file_set ( struct io_fixed_file * file_slot ,
struct file * file )
{
unsigned long file_ptr = ( unsigned long ) file ;
file_ptr | = io_file_get_flags ( file ) ;
file_slot - > file_ptr = file_ptr ;
}
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