Commit 18a6ea1e authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Theodore Ts'o

jbd2: Fix endian mixing problems in the checksumming code

In the jbd2 checksumming code, explicitly declare separate variables with
endianness information so that we don't get confused and screw things up again.
Also fixes sparse warnings.
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent d7b2a00c
...@@ -343,14 +343,14 @@ static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag, ...@@ -343,14 +343,14 @@ static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag,
struct page *page = bh->b_page; struct page *page = bh->b_page;
__u8 *addr; __u8 *addr;
__u32 csum32; __u32 csum32;
__be32 seq;
if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
return; return;
sequence = cpu_to_be32(sequence); seq = cpu_to_be32(sequence);
addr = kmap_atomic(page); addr = kmap_atomic(page);
csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&sequence, csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
sizeof(sequence));
csum32 = jbd2_chksum(j, csum32, addr + offset_in_page(bh->b_data), csum32 = jbd2_chksum(j, csum32, addr + offset_in_page(bh->b_data),
bh->b_size); bh->b_size);
kunmap_atomic(addr); kunmap_atomic(addr);
......
...@@ -130,9 +130,10 @@ int jbd2_verify_csum_type(journal_t *j, journal_superblock_t *sb) ...@@ -130,9 +130,10 @@ int jbd2_verify_csum_type(journal_t *j, journal_superblock_t *sb)
return sb->s_checksum_type == JBD2_CRC32C_CHKSUM; return sb->s_checksum_type == JBD2_CRC32C_CHKSUM;
} }
static __u32 jbd2_superblock_csum(journal_t *j, journal_superblock_t *sb) static __be32 jbd2_superblock_csum(journal_t *j, journal_superblock_t *sb)
{ {
__u32 csum, old_csum; __u32 csum;
__be32 old_csum;
old_csum = sb->s_checksum; old_csum = sb->s_checksum;
sb->s_checksum = 0; sb->s_checksum = 0;
......
...@@ -178,7 +178,8 @@ static int jbd2_descr_block_csum_verify(journal_t *j, ...@@ -178,7 +178,8 @@ static int jbd2_descr_block_csum_verify(journal_t *j,
void *buf) void *buf)
{ {
struct jbd2_journal_block_tail *tail; struct jbd2_journal_block_tail *tail;
__u32 provided, calculated; __be32 provided;
__u32 calculated;
if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
return 1; return 1;
...@@ -190,8 +191,7 @@ static int jbd2_descr_block_csum_verify(journal_t *j, ...@@ -190,8 +191,7 @@ static int jbd2_descr_block_csum_verify(journal_t *j,
calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize);
tail->t_checksum = provided; tail->t_checksum = provided;
provided = be32_to_cpu(provided); return provided == cpu_to_be32(calculated);
return provided == calculated;
} }
/* /*
...@@ -381,7 +381,8 @@ static int calc_chksums(journal_t *journal, struct buffer_head *bh, ...@@ -381,7 +381,8 @@ static int calc_chksums(journal_t *journal, struct buffer_head *bh,
static int jbd2_commit_block_csum_verify(journal_t *j, void *buf) static int jbd2_commit_block_csum_verify(journal_t *j, void *buf)
{ {
struct commit_header *h; struct commit_header *h;
__u32 provided, calculated; __be32 provided;
__u32 calculated;
if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
return 1; return 1;
...@@ -392,21 +393,20 @@ static int jbd2_commit_block_csum_verify(journal_t *j, void *buf) ...@@ -392,21 +393,20 @@ static int jbd2_commit_block_csum_verify(journal_t *j, void *buf)
calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize);
h->h_chksum[0] = provided; h->h_chksum[0] = provided;
provided = be32_to_cpu(provided); return provided == cpu_to_be32(calculated);
return provided == calculated;
} }
static int jbd2_block_tag_csum_verify(journal_t *j, journal_block_tag_t *tag, static int jbd2_block_tag_csum_verify(journal_t *j, journal_block_tag_t *tag,
void *buf, __u32 sequence) void *buf, __u32 sequence)
{ {
__u32 csum32; __u32 csum32;
__be32 seq;
if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
return 1; return 1;
sequence = cpu_to_be32(sequence); seq = cpu_to_be32(sequence);
csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&sequence, csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
sizeof(sequence));
csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize); csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize);
return tag->t_checksum == cpu_to_be16(csum32); return tag->t_checksum == cpu_to_be16(csum32);
...@@ -808,7 +808,8 @@ static int jbd2_revoke_block_csum_verify(journal_t *j, ...@@ -808,7 +808,8 @@ static int jbd2_revoke_block_csum_verify(journal_t *j,
void *buf) void *buf)
{ {
struct jbd2_journal_revoke_tail *tail; struct jbd2_journal_revoke_tail *tail;
__u32 provided, calculated; __be32 provided;
__u32 calculated;
if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2)) if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
return 1; return 1;
...@@ -820,8 +821,7 @@ static int jbd2_revoke_block_csum_verify(journal_t *j, ...@@ -820,8 +821,7 @@ static int jbd2_revoke_block_csum_verify(journal_t *j,
calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize);
tail->r_checksum = provided; tail->r_checksum = provided;
provided = be32_to_cpu(provided); return provided == cpu_to_be32(calculated);
return provided == calculated;
} }
/* Scan a revoke record, marking all blocks mentioned as revoked. */ /* Scan a revoke record, marking all blocks mentioned as revoked. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment