+/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _BCACHEFS_MOVE_H
#define _BCACHEFS_MOVE_H
#include "btree_iter.h"
#include "buckets.h"
-#include "io_types.h"
+#include "data_update.h"
+#include "move_types.h"
struct bch_read_bio;
-struct moving_context;
-struct migrate_write {
- struct moving_context *ctxt;
+struct moving_context {
+ struct bch_fs *c;
+ struct bch_ratelimit *rate;
+ struct bch_move_stats *stats;
+ struct write_point_specifier wp;
+ bool wait_on_copygc;
+ bool write_error;
- /* what we read: */
- struct bch_extent_ptr ptr;
- u64 offset;
+ /* For waiting on outstanding reads and writes: */
+ struct closure cl;
+ struct list_head reads;
- int move_dev;
- int btree_insert_flags;
- struct bch_write_op op;
-};
+ /* in flight sectors: */
+ atomic_t read_sectors;
+ atomic_t write_sectors;
+ atomic_t read_ios;
+ atomic_t write_ios;
-void bch2_migrate_write_init(struct migrate_write *, struct bch_read_bio *);
+ wait_queue_head_t wait;
+};
-#define SECTORS_IN_FLIGHT_PER_DEVICE 2048
+#define move_ctxt_wait_event(_ctxt, _trans, _cond) \
+do { \
+ bool cond_finished = false; \
+ bch2_moving_ctxt_do_pending_writes(_ctxt, _trans); \
+ \
+ if (_cond) \
+ break; \
+ __wait_event((_ctxt)->wait, \
+ bch2_moving_ctxt_next_pending_write(_ctxt) || \
+ (cond_finished = (_cond))); \
+ if (cond_finished) \
+ break; \
+} while (1)
-typedef bool (*move_pred_fn)(void *, struct bkey_s_c_extent);
+typedef bool (*move_pred_fn)(struct bch_fs *, void *, struct bkey_s_c,
+ struct bch_io_opts *, struct data_update_opts *);
-struct bch_move_stats {
- enum bch_data_type data_type;
- struct btree_iter iter;
+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);
+struct moving_io *bch2_moving_ctxt_next_pending_write(struct moving_context *);
+void bch2_moving_ctxt_do_pending_writes(struct moving_context *,
+ struct btree_trans *);
- atomic64_t keys_moved;
- atomic64_t sectors_moved;
- atomic64_t sectors_seen;
- atomic64_t sectors_raced;
-};
+int bch2_scan_old_btree_nodes(struct bch_fs *, struct bch_move_stats *);
-int bch2_move_data(struct bch_fs *, struct bch_ratelimit *,
- unsigned, struct bch_devs_mask *,
+int bch2_move_data(struct bch_fs *,
+ enum btree_id, struct bpos,
+ enum btree_id, struct bpos,
+ struct bch_ratelimit *,
+ struct bch_move_stats *,
struct write_point_specifier,
- int, int, struct bpos, struct bpos,
- move_pred_fn, void *,
- struct bch_move_stats *);
+ bool,
+ move_pred_fn, void *);
+int __bch2_evacuate_bucket(struct btree_trans *,
+ struct moving_context *,
+ struct bpos, int,
+ struct data_update_opts);
+int bch2_evacuate_bucket(struct bch_fs *, struct bpos, int,
+ struct data_update_opts,
+ struct bch_ratelimit *,
+ struct bch_move_stats *,
+ struct write_point_specifier,
+ bool);
int bch2_data_job(struct bch_fs *,
struct bch_move_stats *,
struct bch_ioctl_data);
+void bch2_move_stats_init(struct bch_move_stats *stats, char *name);
+
+
#endif /* _BCACHEFS_MOVE_H */