Factor out a small helper for missing indirect extents, to be used by the new move.c support for reflinked data.
Signed-off-by: Kent Overstreet <[email protected]> --- fs/bcachefs/io_read.c | 25 +++++++------------------ fs/bcachefs/reflink.c | 13 +++++++++++++ fs/bcachefs/reflink.h | 2 ++ 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/fs/bcachefs/io_read.c b/fs/bcachefs/io_read.c index 13dc35cd6562..d070482ba533 100644 --- a/fs/bcachefs/io_read.c +++ b/fs/bcachefs/io_read.c @@ -21,6 +21,7 @@ #include "io_read.h" #include "io_misc.h" #include "io_write.h" +#include "reflink.h" #include "subvolume.h" #include "trace.h" @@ -753,31 +754,19 @@ int __bch2_read_indirect_extent(struct btree_trans *trans, unsigned *offset_into_extent, struct bkey_buf *orig_k) { - struct btree_iter iter; - struct bkey_s_c k; - u64 reflink_offset; - int ret; + struct bkey_s_c_reflink_p p = bkey_s_c_to_reflink_p(bkey_i_to_s_c(orig_k->k)); + u64 reflink_offset = le64_to_cpu(p.v->idx) + *offset_into_extent; - reflink_offset = le64_to_cpu(bkey_i_to_reflink_p(orig_k->k)->v.idx) + - *offset_into_extent; - - k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_reflink, + struct btree_iter iter; + struct bkey_s_c k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_reflink, POS(0, reflink_offset), 0); - ret = bkey_err(k); + int ret = bkey_err(k); if (ret) goto err; if (k.k->type != KEY_TYPE_reflink_v && k.k->type != KEY_TYPE_indirect_inline_data) { - bch_err_inum_offset_ratelimited(trans->c, - orig_k->k->k.p.inode, - orig_k->k->k.p.offset << 9, - "%llu len %u points to nonexistent indirect extent %llu", - orig_k->k->k.p.offset, - orig_k->k->k.size, - reflink_offset); - bch2_inconsistent_error(trans->c); - ret = -BCH_ERR_missing_indirect_extent; + ret = bch2_indirect_extent_error(trans, p); goto err; } diff --git a/fs/bcachefs/reflink.c b/fs/bcachefs/reflink.c index 8a36ebd9dd9c..61cc67f8636a 100644 --- a/fs/bcachefs/reflink.c +++ b/fs/bcachefs/reflink.c @@ -27,6 +27,19 @@ static inline unsigned bkey_type_to_indirect(const struct bkey *k) } } +int bch2_indirect_extent_error(struct btree_trans *trans, struct bkey_s_c_reflink_p k) +{ + bch_err_inum_offset_ratelimited(trans->c, + k.k->p.inode, + k.k->p.offset << 9, + "%llu len %u points to nonexistent indirect extent %llu", + k.k->p.offset, + k.k->size, + le64_to_cpu(k.v->idx)); + bch2_inconsistent_error(trans->c); + return -BCH_ERR_missing_indirect_extent; +} + /* reflink pointers */ int bch2_reflink_p_validate(struct bch_fs *c, struct bkey_s_c k, diff --git a/fs/bcachefs/reflink.h b/fs/bcachefs/reflink.h index 51afe11d8ed6..a4da4bfc2785 100644 --- a/fs/bcachefs/reflink.h +++ b/fs/bcachefs/reflink.h @@ -4,6 +4,8 @@ enum bch_validate_flags; +int bch2_indirect_extent_error(struct btree_trans *, struct bkey_s_c_reflink_p); + int bch2_reflink_p_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags); void bch2_reflink_p_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c); bool bch2_reflink_p_merge(struct bch_fs *, struct bkey_s, struct bkey_s_c); -- 2.45.2
