diff options
-rw-r--r-- | fs/bcachefs/bkey_methods.c | 9 | ||||
-rw-r--r-- | fs/bcachefs/bkey_methods.h | 4 | ||||
-rw-r--r-- | fs/bcachefs/btree_io.c | 17 | ||||
-rw-r--r-- | fs/bcachefs/ec.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 16 | ||||
-rw-r--r-- | fs/bcachefs/extents.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/journal_io.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/reflink.h | 1 |
8 files changed, 31 insertions, 25 deletions
diff --git a/fs/bcachefs/bkey_methods.c b/fs/bcachefs/bkey_methods.c index 320e17d108d2..c064cf468a9b 100644 --- a/fs/bcachefs/bkey_methods.c +++ b/fs/bcachefs/bkey_methods.c @@ -202,15 +202,12 @@ void bch2_bkey_val_to_text(struct printbuf *out, struct bch_fs *c, bch2_val_to_text(out, c, k); } -void bch2_bkey_swab(const struct bkey_format *f, - struct bkey_packed *k) +void bch2_bkey_swab_val(struct bkey_s k) { - const struct bkey_ops *ops = &bch2_bkey_ops[k->type]; - - bch2_bkey_swab_key(f, k); + const struct bkey_ops *ops = &bch2_bkey_ops[k.k->type]; if (ops->swab) - ops->swab(f, k); + ops->swab(k); } bool bch2_bkey_normalize(struct bch_fs *c, struct bkey_s k) diff --git a/fs/bcachefs/bkey_methods.h b/fs/bcachefs/bkey_methods.h index 8568b65c1ed2..d36468b75223 100644 --- a/fs/bcachefs/bkey_methods.h +++ b/fs/bcachefs/bkey_methods.h @@ -29,7 +29,7 @@ struct bkey_ops { void (*key_debugcheck)(struct bch_fs *, struct bkey_s_c); void (*val_to_text)(struct printbuf *, struct bch_fs *, struct bkey_s_c); - void (*swab)(const struct bkey_format *, struct bkey_packed *); + void (*swab)(struct bkey_s); bool (*key_normalize)(struct bch_fs *, struct bkey_s); enum merge_result (*key_merge)(struct bch_fs *, struct bkey_s, struct bkey_s); @@ -51,7 +51,7 @@ void bch2_val_to_text(struct printbuf *, struct bch_fs *, void bch2_bkey_val_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c); -void bch2_bkey_swab(const struct bkey_format *, struct bkey_packed *); +void bch2_bkey_swab_val(struct bkey_s); bool bch2_bkey_normalize(struct bch_fs *, struct bkey_s); diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index c5b5143ada05..83f61443c8bb 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -783,7 +783,7 @@ static int validate_bset(struct bch_fs *c, struct btree *b, for (k = i->start; k != vstruct_last(i);) { - struct bkey_s_c u; + struct bkey_s u; struct bkey tmp; const char *invalid; @@ -804,21 +804,24 @@ static int validate_bset(struct bch_fs *c, struct btree *b, } if (BSET_BIG_ENDIAN(i) != CPU_BIG_ENDIAN) - bch2_bkey_swab(&b->format, k); + bch2_bkey_swab_key(&b->format, k); if (!write && version < bcachefs_metadata_version_bkey_renumber) bch2_bkey_renumber(btree_node_type(b), k, write); - u = bkey_disassemble(b, k, &tmp); + u = __bkey_disassemble(b, k, &tmp); - invalid = __bch2_bkey_invalid(c, u, btree_node_type(b)) ?: - bch2_bkey_in_btree_node(b, u) ?: - (write ? bch2_bkey_val_invalid(c, u) : NULL); + if (BSET_BIG_ENDIAN(i) != CPU_BIG_ENDIAN) + bch2_bkey_swab_val(u); + + invalid = __bch2_bkey_invalid(c, u.s_c, btree_node_type(b)) ?: + bch2_bkey_in_btree_node(b, u.s_c) ?: + (write ? bch2_bkey_val_invalid(c, u.s_c) : NULL); if (invalid) { char buf[160]; - bch2_bkey_val_to_text(&PBUF(buf), c, u); + bch2_bkey_val_to_text(&PBUF(buf), c, u.s_c); btree_err(BTREE_ERR_FIXABLE, c, b, i, "invalid bkey:\n%s\n%s", invalid, buf); diff --git a/fs/bcachefs/ec.h b/fs/bcachefs/ec.h index 8d9fbfd19f66..cf67abd48490 100644 --- a/fs/bcachefs/ec.h +++ b/fs/bcachefs/ec.h @@ -12,6 +12,7 @@ void bch2_stripe_to_text(struct printbuf *, struct bch_fs *, #define bch2_bkey_ops_stripe (struct bkey_ops) { \ .key_invalid = bch2_stripe_invalid, \ .val_to_text = bch2_stripe_to_text, \ + .swab = bch2_ptr_swab, \ } static inline unsigned stripe_csums_per_device(const struct bch_stripe *s) diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index f97fa9341c9f..10ca544317ba 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -1078,17 +1078,19 @@ const char *bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k) return NULL; } -void bch2_ptr_swab(const struct bkey_format *f, struct bkey_packed *k) +void bch2_ptr_swab(struct bkey_s k) { + struct bkey_ptrs ptrs = bch2_bkey_ptrs(k); union bch_extent_entry *entry; - u64 *d = (u64 *) bkeyp_val(f, k); - unsigned i; + u64 *d; - for (i = 0; i < bkeyp_val_u64s(f, k); i++) - d[i] = swab64(d[i]); + for (d = (u64 *) ptrs.start; + d != (u64 *) ptrs.end; + d++) + *d = swab64(*d); - for (entry = (union bch_extent_entry *) d; - entry < (union bch_extent_entry *) (d + bkeyp_val_u64s(f, k)); + for (entry = ptrs.start; + entry < ptrs.end; entry = extent_entry_next(entry)) { switch (extent_entry_type(entry)) { case BCH_EXTENT_ENTRY_ptr: diff --git a/fs/bcachefs/extents.h b/fs/bcachefs/extents.h index 0d8554172263..6e8119a8ad30 100644 --- a/fs/bcachefs/extents.h +++ b/fs/bcachefs/extents.h @@ -532,7 +532,7 @@ void bch2_bkey_ptrs_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c); const char *bch2_bkey_ptrs_invalid(const struct bch_fs *, struct bkey_s_c); -void bch2_ptr_swab(const struct bkey_format *, struct bkey_packed *); +void bch2_ptr_swab(struct bkey_s); /* Generic extent code: */ diff --git a/fs/bcachefs/journal_io.c b/fs/bcachefs/journal_io.c index 244e3faa6b16..1866ed30ce89 100644 --- a/fs/bcachefs/journal_io.c +++ b/fs/bcachefs/journal_io.c @@ -170,8 +170,10 @@ static int journal_validate_key(struct bch_fs *c, struct jset *jset, return 0; } - if (JSET_BIG_ENDIAN(jset) != CPU_BIG_ENDIAN) - bch2_bkey_swab(NULL, bkey_to_packed(k)); + if (JSET_BIG_ENDIAN(jset) != CPU_BIG_ENDIAN) { + bch2_bkey_swab_key(NULL, bkey_to_packed(k)); + bch2_bkey_swab_val(bkey_i_to_s(k)); + } if (!write && version < bcachefs_metadata_version_bkey_renumber) diff --git a/fs/bcachefs/reflink.h b/fs/bcachefs/reflink.h index ac23b855858c..5445c1cf0797 100644 --- a/fs/bcachefs/reflink.h +++ b/fs/bcachefs/reflink.h @@ -22,6 +22,7 @@ void bch2_reflink_v_to_text(struct printbuf *, struct bch_fs *, #define bch2_bkey_ops_reflink_v (struct bkey_ops) { \ .key_invalid = bch2_reflink_v_invalid, \ .val_to_text = bch2_reflink_v_to_text, \ + .swab = bch2_ptr_swab, \ } s64 bch2_remap_range(struct bch_fs *, struct bpos, struct bpos, |