156 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _BCACHEFS_MOVE_H3#define _BCACHEFS_MOVE_H4 5#include "bbpos.h"6#include "bcachefs_ioctl.h"7#include "btree_iter.h"8#include "buckets.h"9#include "data_update.h"10#include "move_types.h"11 12struct bch_read_bio;13 14struct moving_context {15 struct btree_trans *trans;16 struct list_head list;17 void *fn;18 19 struct bch_ratelimit *rate;20 struct bch_move_stats *stats;21 struct write_point_specifier wp;22 bool wait_on_copygc;23 bool write_error;24 25 /* For waiting on outstanding reads and writes: */26 struct closure cl;27 28 struct mutex lock;29 struct list_head reads;30 struct list_head ios;31 32 /* in flight sectors: */33 atomic_t read_sectors;34 atomic_t write_sectors;35 atomic_t read_ios;36 atomic_t write_ios;37 38 wait_queue_head_t wait;39};40 41#define move_ctxt_wait_event_timeout(_ctxt, _cond, _timeout) \42({ \43 int _ret = 0; \44 while (true) { \45 bool cond_finished = false; \46 bch2_moving_ctxt_do_pending_writes(_ctxt); \47 \48 if (_cond) \49 break; \50 bch2_trans_unlock_long((_ctxt)->trans); \51 _ret = __wait_event_timeout((_ctxt)->wait, \52 bch2_moving_ctxt_next_pending_write(_ctxt) || \53 (cond_finished = (_cond)), _timeout); \54 if (_ret || ( cond_finished)) \55 break; \56 } \57 _ret; \58})59 60#define move_ctxt_wait_event(_ctxt, _cond) \61do { \62 bool cond_finished = false; \63 bch2_moving_ctxt_do_pending_writes(_ctxt); \64 \65 if (_cond) \66 break; \67 bch2_trans_unlock_long((_ctxt)->trans); \68 __wait_event((_ctxt)->wait, \69 bch2_moving_ctxt_next_pending_write(_ctxt) || \70 (cond_finished = (_cond))); \71 if (cond_finished) \72 break; \73} while (1)74 75typedef bool (*move_pred_fn)(struct bch_fs *, void *, struct bkey_s_c,76 struct bch_io_opts *, struct data_update_opts *);77 78extern const char * const bch2_data_ops_strs[];79 80void bch2_moving_ctxt_exit(struct moving_context *);81void bch2_moving_ctxt_init(struct moving_context *, struct bch_fs *,82 struct bch_ratelimit *, struct bch_move_stats *,83 struct write_point_specifier, bool);84struct moving_io *bch2_moving_ctxt_next_pending_write(struct moving_context *);85void bch2_moving_ctxt_do_pending_writes(struct moving_context *);86void bch2_moving_ctxt_flush_all(struct moving_context *);87void bch2_move_ctxt_wait_for_io(struct moving_context *);88int bch2_move_ratelimit(struct moving_context *);89 90/* Inodes in different snapshots may have different IO options: */91struct snapshot_io_opts_entry {92 u32 snapshot;93 struct bch_io_opts io_opts;94};95 96struct per_snapshot_io_opts {97 u64 cur_inum;98 struct bch_io_opts fs_io_opts;99 DARRAY(struct snapshot_io_opts_entry) d;100};101 102static inline void per_snapshot_io_opts_init(struct per_snapshot_io_opts *io_opts, struct bch_fs *c)103{104 memset(io_opts, 0, sizeof(*io_opts));105 io_opts->fs_io_opts = bch2_opts_to_inode_opts(c->opts);106}107 108static inline void per_snapshot_io_opts_exit(struct per_snapshot_io_opts *io_opts)109{110 darray_exit(&io_opts->d);111}112 113struct bch_io_opts *bch2_move_get_io_opts(struct btree_trans *,114 struct per_snapshot_io_opts *, struct bkey_s_c);115int bch2_move_get_io_opts_one(struct btree_trans *, struct bch_io_opts *, struct bkey_s_c);116 117int bch2_scan_old_btree_nodes(struct bch_fs *, struct bch_move_stats *);118 119int bch2_move_extent(struct moving_context *,120 struct move_bucket_in_flight *,121 struct btree_iter *,122 struct bkey_s_c,123 struct bch_io_opts,124 struct data_update_opts);125 126int __bch2_move_data(struct moving_context *,127 struct bbpos,128 struct bbpos,129 move_pred_fn, void *);130int bch2_move_data(struct bch_fs *,131 struct bbpos start,132 struct bbpos end,133 struct bch_ratelimit *,134 struct bch_move_stats *,135 struct write_point_specifier,136 bool,137 move_pred_fn, void *);138 139int bch2_evacuate_bucket(struct moving_context *,140 struct move_bucket_in_flight *,141 struct bpos, int,142 struct data_update_opts);143int bch2_data_job(struct bch_fs *,144 struct bch_move_stats *,145 struct bch_ioctl_data);146 147void bch2_move_stats_to_text(struct printbuf *, struct bch_move_stats *);148void bch2_move_stats_exit(struct bch_move_stats *, struct bch_fs *);149void bch2_move_stats_init(struct bch_move_stats *, const char *);150 151void bch2_fs_moving_ctxts_to_text(struct printbuf *, struct bch_fs *);152 153void bch2_fs_move_init(struct bch_fs *);154 155#endif /* _BCACHEFS_MOVE_H */156