summaryrefslogtreecommitdiff
path: root/fs/bcachefs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-02-06 20:15:15 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:35 -0400
commit1f49dafcd3191de1db9b6105983696b5bc7aedad (patch)
tree50c3a618e3ae2dffbef272a5cc5b72812851d060 /fs/bcachefs
parentc4a94ae3da7c666d5d5230897a3f6d1e9d8d8b55 (diff)
bcachefs: Fix bch2_ptr_swab for indirect extents
bch2_ptr_swab was never updated when the code for generic keys with pointers was added - it assumed the entire val was only used for pointers. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs')
-rw-r--r--fs/bcachefs/bkey_methods.c9
-rw-r--r--fs/bcachefs/bkey_methods.h4
-rw-r--r--fs/bcachefs/btree_io.c17
-rw-r--r--fs/bcachefs/ec.h1
-rw-r--r--fs/bcachefs/extents.c16
-rw-r--r--fs/bcachefs/extents.h2
-rw-r--r--fs/bcachefs/journal_io.c6
-rw-r--r--fs/bcachefs/reflink.h1
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,