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


Reply via email to