103 lines
2.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _BCACHEFS_DATA_UPDATE_H
#define _BCACHEFS_DATA_UPDATE_H
#include "btree/bkey_buf.h"
#include "btree/update.h"
#include "data/read.h"
#include "data/write_types.h"
struct moving_context;
#define BCH_DATA_UPDATE_TYPES() \
x(other) \
x(copygc) \
x(reconcile) \
x(promote) \
x(self_heal) \
x(scrub)
enum bch_data_update_types {
#define x(n) BCH_DATA_UPDATE_##n,
BCH_DATA_UPDATE_TYPES()
#undef x
};
struct data_update_opts {
enum bch_data_update_types type;
u8 ptrs_rewrite;
u8 ptrs_io_error;
u8 ptrs_kill;
u8 ptrs_kill_ec;
u8 extra_replicas;
u16 target;
int read_dev;
bool checksum_paranoia;
enum bch_write_flags write_flags;
enum bch_trans_commit_flags commit_flags;
};
struct data_update {
/* extent being updated: */
enum btree_id btree_id;
struct bkey_buf k;
struct data_update_opts opts;
bool read_done;
u8 ptrs_held;
/* associated with @ctxt */
struct list_head read_list;
struct list_head io_list;
struct move_bucket *b;
struct moving_context *ctxt;
struct bch_move_stats *stats;
struct bch_read_bio rbio;
struct bch_write_op op;
struct bio_vec *bvecs;
};
struct promote_op {
struct rcu_head rcu;
u64 start_time;
#ifdef CONFIG_BCACHEFS_ASYNC_OBJECT_LISTS
unsigned list_idx;
#endif
int cpu; /* for promote_limit */
struct rhash_head hash;
struct bpos pos;
struct work_struct work;
struct data_update write;
struct bio_vec bi_inline_vecs[]; /* must be last */
};
void bch2_data_update_opts_to_text(struct printbuf *, struct bch_fs *,
struct bch_inode_opts *, struct data_update_opts *);
void bch2_data_update_to_text(struct printbuf *, struct data_update *);
void bch2_data_update_inflight_to_text(struct printbuf *, struct data_update *);
int bch2_data_update_index_update(struct bch_write_op *);
void bch2_data_update_read_done(struct data_update *);
struct bch_devs_list bch2_data_update_devs_keeping(struct bch_fs *,
struct data_update_opts *,
struct bkey_s_c);
int bch2_can_do_write(struct bch_fs *, struct data_update_opts *,
struct bkey_s_c, struct bch_devs_list *);
void bch2_data_update_exit(struct data_update *, int);
int bch2_data_update_init(struct btree_trans *, struct btree_iter *,
struct moving_context *,
struct data_update *,
struct write_point_specifier,
struct bch_inode_opts *, struct data_update_opts,
enum btree_id, struct bkey_s_c);
#endif /* _BCACHEFS_DATA_UPDATE_H */