mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 21:53:44 +00:00
bcachefs: use swab40 for bch_backpointer.bucket_offset bitfield
The bucket_offset field of bch_backpointer is a 40-bit bitfield, but the bch2_backpointer_swab() helper uses swab32. This leads to inconsistency when an on-disk fs is accessed from an opposite endian machine. As it turns out, we already have an internal swab40() helper that is used from the bch_alloc_v4 swab callback. Lift it into the backpointers header file and use it consistently in both places. Signed-off-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
0996c72a0f
commit
7cb2a7895d
@ -297,15 +297,6 @@ int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline u64 swab40(u64 x)
|
||||
{
|
||||
return (((x & 0x00000000ffULL) << 32)|
|
||||
((x & 0x000000ff00ULL) << 16)|
|
||||
((x & 0x0000ff0000ULL) >> 0)|
|
||||
((x & 0x00ff000000ULL) >> 16)|
|
||||
((x & 0xff00000000ULL) >> 32));
|
||||
}
|
||||
|
||||
void bch2_alloc_v4_swab(struct bkey_s k)
|
||||
{
|
||||
struct bch_alloc_v4 *a = bkey_s_to_alloc_v4(k).v;
|
||||
|
@ -77,7 +77,7 @@ void bch2_backpointer_swab(struct bkey_s k)
|
||||
{
|
||||
struct bkey_s_backpointer bp = bkey_s_to_backpointer(k);
|
||||
|
||||
bp.v->bucket_offset = swab32(bp.v->bucket_offset);
|
||||
bp.v->bucket_offset = swab40(bp.v->bucket_offset);
|
||||
bp.v->bucket_len = swab32(bp.v->bucket_len);
|
||||
bch2_bpos_swab(&bp.v->pos);
|
||||
}
|
||||
|
@ -7,6 +7,15 @@
|
||||
#include "buckets.h"
|
||||
#include "super.h"
|
||||
|
||||
static inline u64 swab40(u64 x)
|
||||
{
|
||||
return (((x & 0x00000000ffULL) << 32)|
|
||||
((x & 0x000000ff00ULL) << 16)|
|
||||
((x & 0x0000ff0000ULL) >> 0)|
|
||||
((x & 0x00ff000000ULL) >> 16)|
|
||||
((x & 0xff00000000ULL) >> 32));
|
||||
}
|
||||
|
||||
int bch2_backpointer_invalid(struct bch_fs *, struct bkey_s_c k,
|
||||
enum bkey_invalid_flags, struct printbuf *);
|
||||
void bch2_backpointer_to_text(struct printbuf *, const struct bch_backpointer *);
|
||||
|
Loading…
Reference in New Issue
Block a user