diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-06-13 19:17:45 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:34 -0400 |
commit | 7f5c5d20f01483ba53233e3e2c54848e0b2d9ecd (patch) | |
tree | a9c7e0a8c7c53933b961b8abe0c7f38569a1a049 /fs/bcachefs/data_update.h | |
parent | 47ab0c5f6a1e6ac1e9387181585fb39393fec4ea (diff) | |
download | linux-7f5c5d20f01483ba53233e3e2c54848e0b2d9ecd.tar.gz linux-7f5c5d20f01483ba53233e3e2c54848e0b2d9ecd.tar.bz2 linux-7f5c5d20f01483ba53233e3e2c54848e0b2d9ecd.zip |
bcachefs: Redo data_update interface
This patch significantly cleans up and simplifies the data_update
interface. Instead of only being able to specify a single pointer by
device to rewrite, we're now able to specify any or all of the pointers
in the original extent to be rewrited, as a bitmask.
data_cmd is no more: the various pred functions now just return true if
the extent should be moved/updated. All the data_update path does is
rewrite existing replicas, or add new ones.
This fixes a bug where with background compression on replicated
filesystems, where rebalance -> data_update would incorrectly drop the
wrong old replica, and keep trying to recompress an extent pointer and
each time failing to drop the right replica. Oops.
Now, the data update path doesn't look at the io options to decide which
pointers to keep and which to drop - it only goes off of the
data_update_options passed to it.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/data_update.h')
-rw-r--r-- | fs/bcachefs/data_update.h | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/fs/bcachefs/data_update.h b/fs/bcachefs/data_update.h index 03b4ca5a4ee8..ee38bd655af1 100644 --- a/fs/bcachefs/data_update.h +++ b/fs/bcachefs/data_update.h @@ -3,46 +3,37 @@ #ifndef _BCACHEFS_DATA_UPDATE_H #define _BCACHEFS_DATA_UPDATE_H +#include "bkey_buf.h" #include "io_types.h" -enum data_cmd { - DATA_SKIP, - DATA_SCRUB, - DATA_ADD_REPLICAS, - DATA_REWRITE, - DATA_PROMOTE, -}; +struct moving_context; -struct data_opts { +struct data_update_opts { + unsigned rewrite_ptrs; u16 target; - u8 rewrite_dev; - u8 nr_replicas; - int btree_insert_flags; + u8 extra_replicas; + unsigned btree_insert_flags; + unsigned write_flags; }; struct data_update { + /* extent being updated: */ enum btree_id btree_id; - enum data_cmd data_cmd; - struct data_opts data_opts; - - unsigned nr_ptrs_reserved; - + struct bkey_buf k; + struct data_update_opts data_opts; struct moving_context *ctxt; - - /* what we read: */ - struct bch_extent_ptr ptr; - u64 offset; - struct bch_write_op op; }; int bch2_data_update_index_update(struct bch_write_op *); -void bch2_data_update_read_done(struct data_update *, struct bch_read_bio *); +void bch2_data_update_read_done(struct data_update *, + struct bch_extent_crc_unpacked); + +void bch2_data_update_exit(struct data_update *); int bch2_data_update_init(struct bch_fs *, struct data_update *, struct write_point_specifier, - struct bch_io_opts, - enum data_cmd, struct data_opts, + struct bch_io_opts, struct data_update_opts, enum btree_id, struct bkey_s_c); #endif /* _BCACHEFS_DATA_UPDATE_H */ |