2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_MOVE_H
# define _BCACHEFS_MOVE_H
2023-10-20 13:32:42 -04:00
# include "bbpos.h"
2023-09-10 18:05:17 -04:00
# include "bcachefs_ioctl.h"
2017-03-16 22:18:50 -08:00
# include "btree_iter.h"
# include "buckets.h"
2022-06-13 19:07:19 -04:00
# include "data_update.h"
2017-03-16 22:18:50 -08:00
# include "move_types.h"
struct bch_read_bio ;
2022-06-13 19:07:19 -04:00
struct moving_context {
2023-10-20 13:32:42 -04:00
struct btree_trans * trans ;
2023-03-11 20:38:46 -05:00
struct list_head list ;
void * fn ;
2022-06-20 15:40:26 -04:00
struct bch_ratelimit * rate ;
2022-06-13 19:07:19 -04:00
struct bch_move_stats * stats ;
2022-06-20 15:40:26 -04:00
struct write_point_specifier wp ;
bool wait_on_copygc ;
2022-03-18 00:42:09 -04:00
bool write_error ;
2017-03-16 22:18:50 -08:00
2022-06-20 15:40:26 -04:00
/* For waiting on outstanding reads and writes: */
struct closure cl ;
2023-03-11 20:38:46 -05:00
struct mutex lock ;
2022-06-13 19:07:19 -04:00
struct list_head reads ;
2023-03-11 20:38:46 -05:00
struct list_head ios ;
2017-03-16 22:18:50 -08:00
2022-06-13 19:07:19 -04:00
/* in flight sectors: */
atomic_t read_sectors ;
atomic_t write_sectors ;
2023-01-09 01:45:18 -05:00
atomic_t read_ios ;
atomic_t write_ios ;
2017-03-16 22:18:50 -08:00
2022-06-13 19:07:19 -04:00
wait_queue_head_t wait ;
2017-03-16 22:18:50 -08:00
} ;
2023-11-22 23:44:47 -05:00
# define move_ctxt_wait_event_timeout(_ctxt, _cond, _timeout) \
( { \
int _ret = 0 ; \
while ( true ) { \
bool cond_finished = false ; \
bch2_moving_ctxt_do_pending_writes ( _ctxt ) ; \
\
if ( _cond ) \
break ; \
bch2_trans_unlock_long ( ( _ctxt ) - > trans ) ; \
_ret = __wait_event_timeout ( ( _ctxt ) - > wait , \
bch2_moving_ctxt_next_pending_write ( _ctxt ) | | \
( cond_finished = ( _cond ) ) , _timeout ) ; \
if ( _ret | | ( cond_finished ) ) \
break ; \
} \
_ret ; \
} )
2023-10-20 13:32:42 -04:00
# define move_ctxt_wait_event(_ctxt, _cond) \
2023-01-03 23:39:42 -05:00
do { \
bool cond_finished = false ; \
2023-10-20 13:32:42 -04:00
bch2_moving_ctxt_do_pending_writes ( _ctxt ) ; \
2023-01-03 23:39:42 -05:00
\
if ( _cond ) \
break ; \
2023-10-30 15:13:09 -04:00
bch2_trans_unlock_long ( ( _ctxt ) - > trans ) ; \
2023-01-03 23:39:42 -05:00
__wait_event ( ( _ctxt ) - > wait , \
bch2_moving_ctxt_next_pending_write ( _ctxt ) | | \
( cond_finished = ( _cond ) ) ) ; \
if ( cond_finished ) \
break ; \
2023-01-02 17:53:02 -05:00
} while ( 1 )
2022-06-13 19:17:45 -04:00
typedef bool ( * move_pred_fn ) ( struct bch_fs * , void * , struct bkey_s_c ,
2022-06-20 15:40:26 -04:00
struct bch_io_opts * , struct data_update_opts * ) ;
2023-11-20 18:43:48 -05:00
extern const char * const bch2_data_ops_strs [ ] ;
2022-06-20 15:40:26 -04:00
void bch2_moving_ctxt_exit ( struct moving_context * ) ;
void bch2_moving_ctxt_init ( struct moving_context * , struct bch_fs * ,
struct bch_ratelimit * , struct bch_move_stats * ,
struct write_point_specifier , bool ) ;
2023-01-02 17:53:02 -05:00
struct moving_io * bch2_moving_ctxt_next_pending_write ( struct moving_context * ) ;
2023-10-20 13:32:42 -04:00
void bch2_moving_ctxt_do_pending_writes ( struct moving_context * ) ;
2023-11-26 19:33:31 +13:00
void bch2_moving_ctxt_flush_all ( struct moving_context * ) ;
2023-10-20 13:32:42 -04:00
void bch2_move_ctxt_wait_for_io ( struct moving_context * ) ;
int bch2_move_ratelimit ( struct moving_context * ) ;
2017-03-16 22:18:50 -08:00
2023-10-21 15:03:05 -04:00
/* Inodes in different snapshots may have different IO options: */
struct snapshot_io_opts_entry {
u32 snapshot ;
struct bch_io_opts io_opts ;
} ;
struct per_snapshot_io_opts {
u64 cur_inum ;
struct bch_io_opts fs_io_opts ;
DARRAY ( struct snapshot_io_opts_entry ) d ;
} ;
static inline void per_snapshot_io_opts_init ( struct per_snapshot_io_opts * io_opts , struct bch_fs * c )
{
memset ( io_opts , 0 , sizeof ( * io_opts ) ) ;
io_opts - > fs_io_opts = bch2_opts_to_inode_opts ( c - > opts ) ;
}
static inline void per_snapshot_io_opts_exit ( struct per_snapshot_io_opts * io_opts )
{
darray_exit ( & io_opts - > d ) ;
}
struct bch_io_opts * bch2_move_get_io_opts ( struct btree_trans * ,
struct per_snapshot_io_opts * , struct bkey_s_c ) ;
2023-10-20 13:32:42 -04:00
int bch2_move_get_io_opts_one ( struct btree_trans * , struct bch_io_opts * , struct bkey_s_c ) ;
2023-10-21 15:03:05 -04:00
2021-03-22 18:39:16 -04:00
int bch2_scan_old_btree_nodes ( struct bch_fs * , struct bch_move_stats * ) ;
2023-10-20 13:32:42 -04:00
int bch2_move_extent ( struct moving_context * ,
2023-10-20 13:32:42 -04:00
struct move_bucket_in_flight * ,
2023-10-20 13:32:42 -04:00
struct btree_iter * ,
2023-10-20 13:32:42 -04:00
struct bkey_s_c ,
2023-10-20 13:32:42 -04:00
struct bch_io_opts ,
2023-10-20 13:32:42 -04:00
struct data_update_opts ) ;
2023-10-20 13:32:42 -04:00
int __bch2_move_data ( struct moving_context * ,
2023-10-20 13:32:42 -04:00
struct bbpos ,
struct bbpos ,
move_pred_fn , void * ) ;
2021-03-14 19:01:14 -04:00
int bch2_move_data ( struct bch_fs * ,
2023-10-20 13:32:42 -04:00
struct bbpos start ,
struct bbpos end ,
2021-03-14 19:01:14 -04:00
struct bch_ratelimit * ,
2022-06-16 02:06:43 +12:00
struct bch_move_stats * ,
2022-06-20 15:40:26 -04:00
struct write_point_specifier ,
bool ,
move_pred_fn , void * ) ;
2017-03-16 22:18:50 -08:00
2023-11-26 20:26:07 +13:00
int bch2_evacuate_bucket ( struct moving_context * ,
2023-02-27 22:58:01 -05:00
struct move_bucket_in_flight * ,
2022-03-18 00:42:09 -04:00
struct bpos , int ,
struct data_update_opts ) ;
2017-03-16 22:18:50 -08:00
int bch2_data_job ( struct bch_fs * ,
struct bch_move_stats * ,
struct bch_ioctl_data ) ;
2023-10-23 16:21:54 -04:00
void bch2_move_stats_to_text ( struct printbuf * , struct bch_move_stats * ) ;
void bch2_move_stats_exit ( struct bch_move_stats * , struct bch_fs * ) ;
2023-11-20 18:43:48 -05:00
void bch2_move_stats_init ( struct bch_move_stats * , const char * ) ;
2023-10-23 16:21:54 -04:00
2023-03-11 20:38:46 -05:00
void bch2_fs_moving_ctxts_to_text ( struct printbuf * , struct bch_fs * ) ;
2021-07-23 13:57:19 -06:00
2023-03-11 20:38:46 -05:00
void bch2_fs_move_init ( struct bch_fs * ) ;
2021-07-23 13:57:19 -06:00
2017-03-16 22:18:50 -08:00
# endif /* _BCACHEFS_MOVE_H */