Skip to content

Commit

Permalink
btrfs: add boilerplate code for directly including the crypto framework
Browse files Browse the repository at this point in the history
Add boilerplate code for directly including the crypto framework.  This
helps us flipping the switch for new algorithms.

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>
  • Loading branch information
Johannes Thumshirn authored and David Sterba committed Jul 1, 2019
1 parent 51bce6c commit 6d97c6e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 7 deletions.
8 changes: 8 additions & 0 deletions fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ struct btrfs_ref;

/* four bytes for CRC32 */
static const int btrfs_csum_sizes[] = { 4 };
static const char *btrfs_csum_names[] = { "crc32c" };

#define BTRFS_EMPTY_DIR_SIZE 0

Expand Down Expand Up @@ -1163,6 +1164,8 @@ struct btrfs_fs_info {
spinlock_t swapfile_pins_lock;
struct rb_root swapfile_pins;

struct crypto_shash *csum_shash;

#ifdef CONFIG_BTRFS_FS_REF_VERIFY
spinlock_t ref_verify_lock;
struct rb_root block_tree;
Expand Down Expand Up @@ -2454,6 +2457,11 @@ static inline int btrfs_super_csum_size(const struct btrfs_super_block *s)
return btrfs_csum_sizes[t];
}

static inline const char *btrfs_super_csum_name(u16 csum_type)
{
/* csum type is validated at mount time */
return btrfs_csum_names[csum_type];
}

/*
* The leaf data grows from end-to-front in the node.
Expand Down
46 changes: 39 additions & 7 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/crc32c.h>
#include <linux/sched/mm.h>
#include <asm/unaligned.h>
#include <crypto/hash.h>
#include "ctree.h"
#include "disk-io.h"
#include "transaction.h"
Expand Down Expand Up @@ -2256,6 +2257,29 @@ static int btrfs_init_workqueues(struct btrfs_fs_info *fs_info,
return 0;
}

static int btrfs_init_csum_hash(struct btrfs_fs_info *fs_info, u16 csum_type)
{
struct crypto_shash *csum_shash;
const char *csum_name = btrfs_super_csum_name(csum_type);

csum_shash = crypto_alloc_shash(csum_name, 0, 0);

if (IS_ERR(csum_shash)) {
btrfs_err(fs_info, "error allocating %s hash for checksum",
csum_name);
return PTR_ERR(csum_shash);
}

fs_info->csum_shash = csum_shash;

return 0;
}

static void btrfs_free_csum_hash(struct btrfs_fs_info *fs_info)
{
crypto_free_shash(fs_info->csum_shash);
}

static int btrfs_replay_log(struct btrfs_fs_info *fs_info,
struct btrfs_fs_devices *fs_devices)
{
Expand Down Expand Up @@ -2820,6 +2844,12 @@ int open_ctree(struct super_block *sb,
goto fail_alloc;
}

ret = btrfs_init_csum_hash(fs_info, csum_type);
if (ret) {
err = ret;
goto fail_alloc;
}

/*
* We want to check superblock checksum, the type is stored inside.
* Pass the whole disk block of size BTRFS_SUPER_INFO_SIZE (4k).
Expand All @@ -2828,7 +2858,7 @@ int open_ctree(struct super_block *sb,
btrfs_err(fs_info, "superblock checksum mismatch");
err = -EINVAL;
brelse(bh);
goto fail_alloc;
goto fail_csum;
}

/*
Expand Down Expand Up @@ -2865,11 +2895,11 @@ int open_ctree(struct super_block *sb,
if (ret) {
btrfs_err(fs_info, "superblock contains fatal errors");
err = -EINVAL;
goto fail_alloc;
goto fail_csum;
}

if (!btrfs_super_root(disk_super))
goto fail_alloc;
goto fail_csum;

/* check FS state, whether FS is broken. */
if (btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_ERROR)
Expand All @@ -2891,7 +2921,7 @@ int open_ctree(struct super_block *sb,
ret = btrfs_parse_options(fs_info, options, sb->s_flags);
if (ret) {
err = ret;
goto fail_alloc;
goto fail_csum;
}

features = btrfs_super_incompat_flags(disk_super) &
Expand All @@ -2901,7 +2931,7 @@ int open_ctree(struct super_block *sb,
"cannot mount because of unsupported optional features (%llx)",
features);
err = -EINVAL;
goto fail_alloc;
goto fail_csum;
}

features = btrfs_super_incompat_flags(disk_super);
Expand Down Expand Up @@ -2945,7 +2975,7 @@ int open_ctree(struct super_block *sb,
btrfs_err(fs_info,
"unequal nodesize/sectorsize (%u != %u) are not allowed for mixed block groups",
nodesize, sectorsize);
goto fail_alloc;
goto fail_csum;
}

/*
Expand All @@ -2961,7 +2991,7 @@ int open_ctree(struct super_block *sb,
"cannot mount read-write because of unsupported optional features (%llx)",
features);
err = -EINVAL;
goto fail_alloc;
goto fail_csum;
}

ret = btrfs_init_workqueues(fs_info, fs_devices);
Expand Down Expand Up @@ -3339,6 +3369,8 @@ int open_ctree(struct super_block *sb,
fail_sb_buffer:
btrfs_stop_all_workers(fs_info);
btrfs_free_block_groups(fs_info);
fail_csum:
btrfs_free_csum_hash(fs_info);
fail_alloc:
fail_iput:
btrfs_mapping_tree_free(&fs_info->mapping_tree);
Expand Down

0 comments on commit 6d97c6e

Please sign in to comment.