summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-03-17 16:14:53 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2017-03-17 19:49:28 -0800
commit6115d0bcf8fee40ab9a98ff8068ea4d3bce5dbdb (patch)
tree98d5e85e591e366f268c6862ea2d3280e99a9317
parent4399d160b1a688dfafdd3a470e16b34192bb70ee (diff)
bcachefs: don't allocate sha256 tfm at mod init time
fails now due to link order
-rw-r--r--fs/bcachefs/Kconfig1
-rw-r--r--fs/bcachefs/bcache.h1
-rw-r--r--fs/bcachefs/checksum.c6
-rw-r--r--fs/bcachefs/fs-gc.c6
-rw-r--r--fs/bcachefs/fs.c2
-rw-r--r--fs/bcachefs/str_hash.h9
-rw-r--r--fs/bcachefs/super.c7
-rw-r--r--fs/bcachefs/super.h1
8 files changed, 16 insertions, 17 deletions
diff --git a/fs/bcachefs/Kconfig b/fs/bcachefs/Kconfig
index c8404477c52e..cdd848f1e4a6 100644
--- a/fs/bcachefs/Kconfig
+++ b/fs/bcachefs/Kconfig
@@ -6,7 +6,6 @@ config BCACHE_FS
select EXPORTFS
select CLOSURES
select LIBCRC32C
- select CRYPTO_SHA1
select FS_POSIX_ACL
select LZ4_COMPRESS
select LZ4_DECOMPRESS
diff --git a/fs/bcachefs/bcache.h b/fs/bcachefs/bcache.h
index d32d092b459c..09e5de351dfb 100644
--- a/fs/bcachefs/bcache.h
+++ b/fs/bcachefs/bcache.h
@@ -717,6 +717,7 @@ struct bch_fs {
struct mutex zlib_workspace_lock;
mempool_t compression_bounce[2];
+ struct crypto_shash *sha256;
struct crypto_blkcipher *chacha20;
struct crypto_shash *poly1305;
diff --git a/fs/bcachefs/checksum.c b/fs/bcachefs/checksum.c
index b96050dbb381..30928ba1e252 100644
--- a/fs/bcachefs/checksum.c
+++ b/fs/bcachefs/checksum.c
@@ -562,6 +562,8 @@ void bch_fs_encryption_exit(struct bch_fs *c)
crypto_free_shash(c->poly1305);
if (!IS_ERR_OR_NULL(c->chacha20))
crypto_free_blkcipher(c->chacha20);
+ if (!IS_ERR_OR_NULL(c->sha256))
+ crypto_free_shash(c->sha256);
}
int bch_fs_encryption_init(struct bch_fs *c)
@@ -570,6 +572,10 @@ int bch_fs_encryption_init(struct bch_fs *c)
struct bch_key key;
int ret;
+ c->sha256 = crypto_alloc_shash("sha256", 0, 0);
+ if (IS_ERR(c->sha256))
+ return PTR_ERR(c->sha256);
+
crypt = bch_sb_get_crypt(c->disk_sb);
if (!crypt)
return 0;
diff --git a/fs/bcachefs/fs-gc.c b/fs/bcachefs/fs-gc.c
index 1f6a65ecee99..f718c3d6665a 100644
--- a/fs/bcachefs/fs-gc.c
+++ b/fs/bcachefs/fs-gc.c
@@ -39,7 +39,7 @@ static int remove_dirent(struct bch_fs *c, struct btree_iter *iter,
if (ret)
goto err;
- dir_hash_info = bch_hash_info_init(&dir_inode);
+ dir_hash_info = bch_hash_info_init(c, &dir_inode);
ret = bch_dirent_delete(c, dir_inum, &dir_hash_info, &name, NULL);
err:
@@ -52,7 +52,7 @@ static int reattach_inode(struct bch_fs *c,
u64 inum)
{
struct bch_hash_info lostfound_hash_info =
- bch_hash_info_init(lostfound_inode);
+ bch_hash_info_init(c, lostfound_inode);
struct bkey_inode_buf packed;
char name_buf[20];
struct qstr name;
@@ -308,7 +308,7 @@ static int check_lostfound(struct bch_fs *c,
{
struct qstr lostfound = QSTR("lost+found");
struct bch_hash_info root_hash_info =
- bch_hash_info_init(root_inode);
+ bch_hash_info_init(c, root_inode);
struct bkey_inode_buf packed;
u64 inum;
int ret;
diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index f1125a32239f..f45babd7fd2e 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -1051,7 +1051,7 @@ static void bch_vfs_inode_init(struct bch_fs *c,
inode->i_ctime = bch_time_to_timespec(c, bi->i_ctime);
bch_inode_flags_to_vfs(inode);
- ei->str_hash = bch_hash_info_init(bi);
+ ei->str_hash = bch_hash_info_init(c, bi);
inode->i_mapping->a_ops = &bch_address_space_operations;
diff --git a/fs/bcachefs/str_hash.h b/fs/bcachefs/str_hash.h
index 1173dfe8e554..69be5255a5de 100644
--- a/fs/bcachefs/str_hash.h
+++ b/fs/bcachefs/str_hash.h
@@ -19,7 +19,8 @@ struct bch_hash_info {
};
static inline struct bch_hash_info
-bch_hash_info_init(const struct bch_inode_unpacked *bi)
+bch_hash_info_init(struct bch_fs *c,
+ const struct bch_inode_unpacked *bi)
{
/* XXX ick */
struct bch_hash_info info = {
@@ -33,10 +34,10 @@ bch_hash_info_init(const struct bch_inode_unpacked *bi)
info.crc_key = bi->i_hash_seed;
break;
case BCH_STR_HASH_SIPHASH: {
- SHASH_DESC_ON_STACK(desc, bch_sha256);
- u8 digest[crypto_shash_digestsize(bch_sha256)];
+ SHASH_DESC_ON_STACK(desc, c->sha256);
+ u8 digest[crypto_shash_digestsize(c->sha256)];
- desc->tfm = bch_sha256;
+ desc->tfm = c->sha256;
desc->flags = 0;
crypto_shash_digest(desc, (void *) &bi->i_hash_seed,
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c
index 509a80eae474..8f2c6b3fb419 100644
--- a/fs/bcachefs/super.c
+++ b/fs/bcachefs/super.c
@@ -67,7 +67,6 @@ static DEFINE_MUTEX(bch_fs_list_lock);
static DECLARE_WAIT_QUEUE_HEAD(bch_read_only_wait);
struct workqueue_struct *bcache_io_wq;
-struct crypto_shash *bch_sha256;
static void bch_dev_free(struct bch_dev *);
static int bch_dev_alloc(struct bch_fs *, unsigned);
@@ -1999,8 +1998,6 @@ static void bcache_exit(void)
kset_unregister(bcache_kset);
if (bcache_io_wq)
destroy_workqueue(bcache_io_wq);
- if (!IS_ERR_OR_NULL(bch_sha256))
- crypto_free_shash(bch_sha256);
unregister_reboot_notifier(&reboot);
}
@@ -2016,10 +2013,6 @@ static int __init bcache_init(void)
register_reboot_notifier(&reboot);
bkey_pack_test();
- bch_sha256 = crypto_alloc_shash("sha256", 0, 0);
- if (IS_ERR(bch_sha256))
- goto err;
-
if (!(bcache_io_wq = create_freezable_workqueue("bcache_io")) ||
!(bcache_kset = kset_create_and_add("bcache", NULL, fs_kobj)) ||
sysfs_create_files(&bcache_kset->kobj, files) ||
diff --git a/fs/bcachefs/super.h b/fs/bcachefs/super.h
index 494e3c66ebdb..f676d2cb2e43 100644
--- a/fs/bcachefs/super.h
+++ b/fs/bcachefs/super.h
@@ -125,7 +125,6 @@ const char *bch_fs_open(char * const *, unsigned, struct bch_opts,
const char *bch_fs_open_incremental(const char *path);
extern struct workqueue_struct *bcache_io_wq;
-extern struct crypto_shash *bch_sha256;
extern struct kobj_type bch_fs_ktype;
extern struct kobj_type bch_fs_internal_ktype;