Message ID | 20190516084803.9774-8-jthumshirn@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add support for SHA-256 checksums | expand |
On Thu, May 16, 2019 at 10:47:57AM +0200, Johannes Thumshirn wrote: > Currently btrfs is only supporting CRC32C as checksumming algorithm. As > this is about to change provide a function to validate the checksum type in > the superblock against all possible algorithms. > > This makes adding new algorithms easier as there are fewer places to adjust > when adding new algorithms. > > Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> > Reviewed-by: Nikolay Borisov <nborisov@suse.com> > --- > fs/btrfs/disk-io.c | 24 +++++++++++++++++------- > 1 file changed, 17 insertions(+), 7 deletions(-) > > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index 663efce22d98..ab13282d91d2 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -356,6 +356,16 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, > return ret; > } > > +static bool btrfs_supported_super_csum(struct btrfs_super_block *sb) > +{ > + switch (btrfs_super_csum_type(sb)) { > + case BTRFS_CSUM_TYPE_CRC32: > + return true; > + default: > + return false; > + } > +} > + > /* > * Return 0 if the superblock checksum type matches the checksum value of that > * algorithm. Pass the raw disk superblock data. > @@ -368,6 +378,12 @@ static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info, > u16 csum_type = btrfs_super_csum_type(disk_sb); > int ret = 0; > > + if (!btrfs_supported_super_csum(disk_sb)) { > + btrfs_err(fs_info, "unsupported checksum algorithm %u", > + csum_type); > + ret = 1; This can be direct 'return 1;', otherwise ok. Reviewed-by: David Sterba <dsterba@suse.com>
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 663efce22d98..ab13282d91d2 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -356,6 +356,16 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, return ret; } +static bool btrfs_supported_super_csum(struct btrfs_super_block *sb) +{ + switch (btrfs_super_csum_type(sb)) { + case BTRFS_CSUM_TYPE_CRC32: + return true; + default: + return false; + } +} + /* * Return 0 if the superblock checksum type matches the checksum value of that * algorithm. Pass the raw disk superblock data. @@ -368,6 +378,12 @@ static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info, u16 csum_type = btrfs_super_csum_type(disk_sb); int ret = 0; + if (!btrfs_supported_super_csum(disk_sb)) { + btrfs_err(fs_info, "unsupported checksum algorithm %u", + csum_type); + ret = 1; + } + if (csum_type == BTRFS_CSUM_TYPE_CRC32) { u32 crc = ~(u32)0; char result[sizeof(crc)]; @@ -385,12 +401,6 @@ static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info, ret = 1; } - if (csum_type >= ARRAY_SIZE(btrfs_csum_sizes)) { - btrfs_err(fs_info, "unsupported checksum algorithm %u", - csum_type); - ret = 1; - } - return ret; } @@ -2577,7 +2587,7 @@ static int btrfs_validate_write_super(struct btrfs_fs_info *fs_info, ret = validate_super(fs_info, sb, -1); if (ret < 0) goto out; - if (btrfs_super_csum_type(sb) != BTRFS_CSUM_TYPE_CRC32) { + if (!btrfs_supported_super_csum(sb)) { ret = -EUCLEAN; btrfs_err(fs_info, "invalid csum type, has %u want %u", btrfs_super_csum_type(sb), BTRFS_CSUM_TYPE_CRC32);