@@ -234,10 +234,9 @@ struct fscrypt_info {
struct list_head ci_master_key_link;
/*
- * If non-NULL, then encryption is done using the master key directly
- * and ci_enc_key will equal ci_direct_key->dk_key.
+ * If true, then encryption is done using the master key directly.
*/
- struct fscrypt_direct_key *ci_direct_key;
+ bool ci_direct_key;
/*
* This inode's hash key for filenames. This is a 128-bit SipHash-2-4
@@ -641,7 +640,7 @@ static inline int fscrypt_require_key(struct inode *inode)
/* keysetup_v1.c */
-void fscrypt_put_direct_key(struct fscrypt_direct_key *dk);
+void fscrypt_put_direct_key(struct fscrypt_prepared_key *prep_key);
int fscrypt_setup_v1_file_key(struct fscrypt_info *ci,
const u8 *raw_master_key);
@@ -578,7 +578,7 @@ static void put_crypt_info(struct fscrypt_info *ci)
return;
if (ci->ci_direct_key)
- fscrypt_put_direct_key(ci->ci_direct_key);
+ fscrypt_put_direct_key(ci->ci_enc_key);
else if (ci->ci_owns_key) {
fscrypt_destroy_prepared_key(ci->ci_inode->i_sb,
ci->ci_enc_key);
@@ -160,8 +160,11 @@ static void free_direct_key(struct fscrypt_direct_key *dk)
}
}
-void fscrypt_put_direct_key(struct fscrypt_direct_key *dk)
+void fscrypt_put_direct_key(struct fscrypt_prepared_key *prep_key)
{
+ struct fscrypt_direct_key *dk =
+ container_of(prep_key, struct fscrypt_direct_key, dk_key);
+
if (!refcount_dec_and_lock(&dk->dk_refcount, &fscrypt_direct_keys_lock))
return;
hash_del(&dk->dk_node);
@@ -258,7 +261,7 @@ static int setup_v1_file_key_direct(struct fscrypt_info *ci,
dk = fscrypt_get_direct_key(ci, raw_master_key);
if (IS_ERR(dk))
return PTR_ERR(dk);
- ci->ci_direct_key = dk;
+ ci->ci_direct_key = true;
ci->ci_enc_key = &dk->dk_key;
return 0;
}
The ci_direct_key field is only used for v1 direct key policies, recording the direct key that needs to have its refcount reduced when the crypt_info is freed. However, now that crypt_info->ci_enc_key is a pointer to the authoritative prepared key -- embedded in the direct key, in this case, we no longer need to keep a full pointer to the direct key -- we can use container_of() to go from the prepared key to its surrounding direct key. Thus we can make ci_direct_key a bool instead of a pointer, saving a few bytes. Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me> --- fs/crypto/fscrypt_private.h | 7 +++---- fs/crypto/keysetup.c | 2 +- fs/crypto/keysetup_v1.c | 7 +++++-- 3 files changed, 9 insertions(+), 7 deletions(-)