jbd2: Fix endian mixing problems in the checksumming code
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 28 Aug 2013 18:59:58 +0000 (14:59 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 28 Aug 2013 18:59:58 +0000 (14:59 -0400)
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: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/jbd2/commit.c
fs/jbd2/journal.c
fs/jbd2/recovery.c

index 559bec1..cf2fc05 100644 (file)
@@ -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;
        __u8 *addr;
        __u32 csum32;
+       __be32 seq;
 
        if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
                return;
 
-       sequence = cpu_to_be32(sequence);
+       seq = cpu_to_be32(sequence);
        addr = kmap_atomic(page);
-       csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&sequence,
-                            sizeof(sequence));
+       csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
        csum32 = jbd2_chksum(j, csum32, addr + offset_in_page(bh->b_data),
                             bh->b_size);
        kunmap_atomic(addr);
index 02c7ad9..5203264 100644 (file)
@@ -130,9 +130,10 @@ int jbd2_verify_csum_type(journal_t *j, journal_superblock_t *sb)
        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;
        sb->s_checksum = 0;
index d485146..3929c50 100644 (file)
@@ -178,7 +178,8 @@ static int jbd2_descr_block_csum_verify(journal_t *j,
                                        void *buf)
 {
        struct jbd2_journal_block_tail *tail;
-       __u32 provided, calculated;
+       __be32 provided;
+       __u32 calculated;
 
        if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
                return 1;
@@ -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);
        tail->t_checksum = provided;
 
-       provided = be32_to_cpu(provided);
-       return provided == calculated;
+       return provided == cpu_to_be32(calculated);
 }
 
 /*
@@ -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)
 {
        struct commit_header *h;
-       __u32 provided, calculated;
+       __be32 provided;
+       __u32 calculated;
 
        if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
                return 1;
@@ -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);
        h->h_chksum[0] = provided;
 
-       provided = be32_to_cpu(provided);
-       return provided == calculated;
+       return provided == cpu_to_be32(calculated);
 }
 
 static int jbd2_block_tag_csum_verify(journal_t *j, journal_block_tag_t *tag,
                                      void *buf, __u32 sequence)
 {
        __u32 csum32;
+       __be32 seq;
 
        if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
                return 1;
 
-       sequence = cpu_to_be32(sequence);
-       csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&sequence,
-                            sizeof(sequence));
+       seq = cpu_to_be32(sequence);
+       csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
        csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize);
 
        return tag->t_checksum == cpu_to_be16(csum32);
@@ -808,7 +808,8 @@ static int jbd2_revoke_block_csum_verify(journal_t *j,
                                         void *buf)
 {
        struct jbd2_journal_revoke_tail *tail;
-       __u32 provided, calculated;
+       __be32 provided;
+       __u32 calculated;
 
        if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
                return 1;
@@ -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);
        tail->r_checksum = provided;
 
-       provided = be32_to_cpu(provided);
-       return provided == calculated;
+       return provided == cpu_to_be32(calculated);
 }
 
 /* Scan a revoke record, marking all blocks mentioned as revoked. */