a34eef6dd1
We had a bug report where the data update path was creating an extent that failed to validate because it had too many pointers; almost all of them were cached. To fix this, we have: - want_cached_ptr(), a new helper that checks if we even want a cached pointer (is on appropriate target, device is readable). - bch2_extent_set_ptr_cached() now only sets a pointer cached if we want it. - bch2_extent_normalize_by_opts() now ensures that we only have a single cached pointer that we want. While working on this, it was noticed that this doesn't work well with reflinked data and per-file options. Another patch series is coming that plumbs through additional io path options through bch_extent_rebalance, with improved option handling. Reported-by: Reed Riley <reed@riley.engineer> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
56 lines
1.5 KiB
C
56 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _BCACHEFS_DATA_UPDATE_H
|
|
#define _BCACHEFS_DATA_UPDATE_H
|
|
|
|
#include "bkey_buf.h"
|
|
#include "io_write_types.h"
|
|
|
|
struct moving_context;
|
|
|
|
struct data_update_opts {
|
|
unsigned rewrite_ptrs;
|
|
unsigned kill_ptrs;
|
|
u16 target;
|
|
u8 extra_replicas;
|
|
unsigned btree_insert_flags;
|
|
unsigned write_flags;
|
|
};
|
|
|
|
void bch2_data_update_opts_to_text(struct printbuf *, struct bch_fs *,
|
|
struct bch_io_opts *, struct data_update_opts *);
|
|
|
|
struct data_update {
|
|
/* extent being updated: */
|
|
enum btree_id btree_id;
|
|
struct bkey_buf k;
|
|
struct data_update_opts data_opts;
|
|
struct moving_context *ctxt;
|
|
struct bch_move_stats *stats;
|
|
struct bch_write_op op;
|
|
};
|
|
|
|
void bch2_data_update_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_extent_crc_unpacked);
|
|
|
|
int bch2_extent_drop_ptrs(struct btree_trans *,
|
|
struct btree_iter *,
|
|
struct bkey_s_c,
|
|
struct bch_io_opts *,
|
|
struct data_update_opts *);
|
|
|
|
void bch2_data_update_exit(struct data_update *);
|
|
int bch2_data_update_init(struct btree_trans *, struct btree_iter *,
|
|
struct moving_context *,
|
|
struct data_update *,
|
|
struct write_point_specifier,
|
|
struct bch_io_opts, struct data_update_opts,
|
|
enum btree_id, struct bkey_s_c);
|
|
void bch2_data_update_opts_normalize(struct bkey_s_c, struct data_update_opts *);
|
|
|
|
#endif /* _BCACHEFS_DATA_UPDATE_H */
|