Ensure that byte swapping occurs on big endian architectures when reading or writing the superblock. Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxx> --- drivers/md/bcache/bcache.h | 12 ++++++++++++ drivers/md/bcache/super.c | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 72b1ea4576d9..50ddc78596bf 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -784,6 +784,18 @@ static inline bool ptr_available(struct cache_set *c, const struct bkey *k, bch_crc64(p, q - p); \ }) +/* + * Variant of csum_set() for data structures in which (i)->keys has type + * __le16. + */ +#define csum_set_le(i) ({ \ + const void *p = (void *)(i) + sizeof(uint64_t); \ + const void *q = bkey_idx((struct bkey *)(i)->d, \ + le16_to_cpu((i)->keys)); \ + \ + bch_crc64(p, q - p); \ +}) + /* Error handling macros */ #define btree_bug(b, ...) \ diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 39bec137f636..31d700aecd56 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -110,7 +110,7 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev, goto err; err = "Bad checksum"; - if (s->csum != csum_set(s)) + if (s->csum != csum_set_le(s)) goto err; err = "Bad UUID"; @@ -236,7 +236,7 @@ static void __write_super(struct cache_sb *sb, struct bio *bio) for (i = 0; i < sb->keys; i++) out->d[i] = cpu_to_le64(sb->d[i]); - out->csum = csum_set(out); + out->csum = csum_set_le(out); pr_debug("ver %llu, flags %llu, seq %llu", sb->version, sb->flags, sb->seq); -- 2.16.2