Messages in this thread Patch in this message | | | From | Mark Harmstone <> | Subject | [RFC PATCH 05/19] btrfs: add key list | Date | Wed, 9 Jan 2019 01:26:47 +0000 |
| |
Signed-off-by: Mark Harmstone <mark@harmstone.com> --- fs/btrfs/ctree.h | 5 +++++ fs/btrfs/disk-io.c | 18 ++++++++++++++++++ fs/btrfs/encryption.h | 13 +++++++++++++ 3 files changed, 36 insertions(+)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 723e9b38e0aa..3f3356a2d145 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -1116,6 +1116,9 @@ struct btrfs_fs_info { u32 sectorsize; u32 stripesize; + struct list_head key_list; + struct rw_semaphore key_sem; + #ifdef CONFIG_BTRFS_FS_REF_VERIFY spinlock_t ref_verify_lock; struct rb_root block_tree; @@ -2413,6 +2416,8 @@ BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item, BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item, other_encoding, 16); +#define BTRFS_ENCRYPTION_KEY_ID_LENGTH 64 + /* * this returns the number of bytes used by the item on disk, minus the * size of any extent headers. If a file is compressed on disk, this is diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index a533c00855be..a1964b768750 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -18,6 +18,7 @@ #include <linux/error-injection.h> #include <linux/crc32c.h> #include <asm/unaligned.h> +#include <crypto/rng.h> #include "ctree.h" #include "disk-io.h" #include "transaction.h" @@ -38,6 +39,7 @@ #include "compression.h" #include "tree-checker.h" #include "ref-verify.h" +#include "encryption.h" #ifdef CONFIG_X86 #include <asm/cpufeature.h> @@ -2751,6 +2753,9 @@ int open_ctree(struct super_block *sb, INIT_LIST_HEAD(&fs_info->pinned_chunks); + INIT_LIST_HEAD(&fs_info->key_list); + init_rwsem(&fs_info->key_sem); + /* Usable values until the real ones are cached from the superblock */ fs_info->nodesize = 4096; fs_info->sectorsize = 4096; @@ -4013,6 +4018,19 @@ void close_ctree(struct btrfs_fs_info *fs_info) list_del_init(&em->list); free_extent_map(em); } + + while (!list_empty(&fs_info->key_list)) { + struct btrfs_enc_key *key; + + key = list_first_entry(&fs_info->key_list, + struct btrfs_enc_key, key_list); + + if (key->loaded) + crypto_free_skcipher(key->skcipher); + + list_del_init(&key->key_list); + kfree(key); + } } int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, diff --git a/fs/btrfs/encryption.h b/fs/btrfs/encryption.h index b9a37e76e4a6..77914d7797c6 100644 --- a/fs/btrfs/encryption.h +++ b/fs/btrfs/encryption.h @@ -6,6 +6,8 @@ #ifndef BTRFS_ENCRYPTION_H #define BTRFS_ENCRYPTION_H +#include <crypto/skcipher.h> + enum btrfs_encryption_type { BTRFS_ENCRYPTION_NONE = 0, BTRFS_ENCRYPTION_AES256CTR = 1, @@ -17,4 +19,15 @@ struct btrfs_encryption_header { u8 iv[BTRFS_ENCRYPTION_BLOCK_LENGTH]; }; +struct btrfs_enc_key { + struct list_head key_list; + u8 key_id[BTRFS_ENCRYPTION_KEY_ID_LENGTH]; + u64 key_number; + bool loaded; + bool added; + bool used; + struct crypto_skcipher *skcipher; + struct mutex lock; +}; + #endif -- 2.19.2
| |