btrfs: Simplify btrfs_check_super_csum() and get rid of size assumptions
authorJohannes Thumshirn <jthumshirn@suse.de>
Mon, 3 Jun 2019 14:58:55 +0000 (16:58 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 1 Jul 2019 11:35:01 +0000 (13:35 +0200)
Now that we have already checked for a valid checksum type before
calling btrfs_check_super_csum(), it can be simplified even further.

While at it get rid of the implicit size assumption of the resulting
checksum as well.

This is a preparation for changing all checksum functionality to use the
crypto layer later.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c

index ce6dc95effaec471fa90147063fc46ed7a01abf2..c9ce0b0020084e336a1f99b8e623a5bfe9f8404f 100644 (file)
@@ -371,30 +371,20 @@ static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info,
 {
        struct btrfs_super_block *disk_sb =
                (struct btrfs_super_block *)raw_disk_sb;
-       u16 csum_type = btrfs_super_csum_type(disk_sb);
-
-       if (!btrfs_supported_super_csum(csum_type)) {
-               btrfs_err(fs_info, "unsupported checksum algorithm %u",
-                         csum_type);
-               return 1;
-       }
-
-       if (csum_type == BTRFS_CSUM_TYPE_CRC32) {
-               u32 crc = ~(u32)0;
-               char result[sizeof(crc)];
+       u32 crc = ~(u32)0;
+       char result[BTRFS_CSUM_SIZE];
 
-               /*
-                * The super_block structure does not span the whole
-                * BTRFS_SUPER_INFO_SIZE range, we expect that the unused space
-                * is filled with zeros and is included in the checksum.
-                */
-               crc = btrfs_csum_data(raw_disk_sb + BTRFS_CSUM_SIZE,
-                               crc, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
-               btrfs_csum_final(crc, result);
+       /*
+        * The super_block structure does not span the whole
+        * BTRFS_SUPER_INFO_SIZE range, we expect that the unused space is
+        * filled with zeros and is included in the checksum.
+        */
+       crc = btrfs_csum_data(raw_disk_sb + BTRFS_CSUM_SIZE,
+                             crc, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
+       btrfs_csum_final(crc, result);
 
-               if (memcmp(raw_disk_sb, result, sizeof(result)))
-                       return 1;
-       }
+       if (memcmp(disk_sb->csum, result, btrfs_super_csum_size(disk_sb)))
+               return 1;
 
        return 0;
 }
@@ -2611,6 +2601,7 @@ int open_ctree(struct super_block *sb,
        u32 stripesize;
        u64 generation;
        u64 features;
+       u16 csum_type;
        struct btrfs_key location;
        struct buffer_head *bh;
        struct btrfs_super_block *disk_super;
@@ -2820,11 +2811,10 @@ int open_ctree(struct super_block *sb,
         * Verify the type first, if that or the the checksum value are
         * corrupted, we'll find out
         */
-       if (!btrfs_supported_super_csum(btrfs_super_csum_type(
-                                (struct btrfs_super_block *) bh->b_data))) {
+       csum_type = btrfs_super_csum_type((struct btrfs_super_block *)bh->b_data);
+       if (!btrfs_supported_super_csum(csum_type)) {
                btrfs_err(fs_info, "unsupported checksum algorithm: %u",
-                         btrfs_super_csum_type((struct btrfs_super_block *)
-                                               bh->b_data));
+                         csum_type);
                err = -EINVAL;
                brelse(bh);
                goto fail_alloc;