Commit 02aef422 authored by Eric Biggers's avatar Eric Biggers

fscrypt: pass super_block to fscrypt_put_master_key_activeref()

As this code confused Linus [1], pass the super_block as an argument to
fscrypt_put_master_key_activeref().  This removes the need to have the
back-pointer ->mk_sb, so remove that.

[1] https://lore.kernel.org/linux-fscrypt/CAHk-=wgud4Bc_um+htgfagYpZAnOoCb3NUoW67hc9LhOKsMtJg@mail.gmail.comSigned-off-by: default avatarEric Biggers <ebiggers@google.com>
Link: https://lore.kernel.org/r/20221110082942.351615-1-ebiggers@kernel.org
parent f0c4d9fc
...@@ -439,13 +439,7 @@ struct fscrypt_master_key_secret { ...@@ -439,13 +439,7 @@ struct fscrypt_master_key_secret {
struct fscrypt_master_key { struct fscrypt_master_key {
/* /*
* Back-pointer to the super_block of the filesystem to which this * Link in ->s_master_keys->key_hashtable.
* master key has been added. Only valid if ->mk_active_refs > 0.
*/
struct super_block *mk_sb;
/*
* Link in ->mk_sb->s_master_keys->key_hashtable.
* Only valid if ->mk_active_refs > 0. * Only valid if ->mk_active_refs > 0.
*/ */
struct hlist_node mk_node; struct hlist_node mk_node;
...@@ -456,7 +450,7 @@ struct fscrypt_master_key { ...@@ -456,7 +450,7 @@ struct fscrypt_master_key {
/* /*
* Active and structural reference counts. An active ref guarantees * Active and structural reference counts. An active ref guarantees
* that the struct continues to exist, continues to be in the keyring * that the struct continues to exist, continues to be in the keyring
* ->mk_sb->s_master_keys, and that any embedded subkeys (e.g. * ->s_master_keys, and that any embedded subkeys (e.g.
* ->mk_direct_keys) that have been prepared continue to exist. * ->mk_direct_keys) that have been prepared continue to exist.
* A structural ref only guarantees that the struct continues to exist. * A structural ref only guarantees that the struct continues to exist.
* *
...@@ -569,7 +563,8 @@ static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec) ...@@ -569,7 +563,8 @@ static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec)
void fscrypt_put_master_key(struct fscrypt_master_key *mk); void fscrypt_put_master_key(struct fscrypt_master_key *mk);
void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk); void fscrypt_put_master_key_activeref(struct super_block *sb,
struct fscrypt_master_key *mk);
struct fscrypt_master_key * struct fscrypt_master_key *
fscrypt_find_master_key(struct super_block *sb, fscrypt_find_master_key(struct super_block *sb,
......
...@@ -79,10 +79,9 @@ void fscrypt_put_master_key(struct fscrypt_master_key *mk) ...@@ -79,10 +79,9 @@ void fscrypt_put_master_key(struct fscrypt_master_key *mk)
call_rcu(&mk->mk_rcu_head, fscrypt_free_master_key); call_rcu(&mk->mk_rcu_head, fscrypt_free_master_key);
} }
void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk) void fscrypt_put_master_key_activeref(struct super_block *sb,
struct fscrypt_master_key *mk)
{ {
struct super_block *sb = mk->mk_sb;
struct fscrypt_keyring *keyring = sb->s_master_keys;
size_t i; size_t i;
if (!refcount_dec_and_test(&mk->mk_active_refs)) if (!refcount_dec_and_test(&mk->mk_active_refs))
...@@ -93,9 +92,9 @@ void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk) ...@@ -93,9 +92,9 @@ void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk)
* destroying any subkeys embedded in it. * destroying any subkeys embedded in it.
*/ */
spin_lock(&keyring->lock); spin_lock(&sb->s_master_keys->lock);
hlist_del_rcu(&mk->mk_node); hlist_del_rcu(&mk->mk_node);
spin_unlock(&keyring->lock); spin_unlock(&sb->s_master_keys->lock);
/* /*
* ->mk_active_refs == 0 implies that ->mk_secret is not present and * ->mk_active_refs == 0 implies that ->mk_secret is not present and
...@@ -243,7 +242,7 @@ void fscrypt_destroy_keyring(struct super_block *sb) ...@@ -243,7 +242,7 @@ void fscrypt_destroy_keyring(struct super_block *sb)
WARN_ON(refcount_read(&mk->mk_struct_refs) != 1); WARN_ON(refcount_read(&mk->mk_struct_refs) != 1);
WARN_ON(!is_master_key_secret_present(&mk->mk_secret)); WARN_ON(!is_master_key_secret_present(&mk->mk_secret));
wipe_master_key_secret(&mk->mk_secret); wipe_master_key_secret(&mk->mk_secret);
fscrypt_put_master_key_activeref(mk); fscrypt_put_master_key_activeref(sb, mk);
} }
} }
kfree_sensitive(keyring); kfree_sensitive(keyring);
...@@ -424,7 +423,6 @@ static int add_new_master_key(struct super_block *sb, ...@@ -424,7 +423,6 @@ static int add_new_master_key(struct super_block *sb,
if (!mk) if (!mk)
return -ENOMEM; return -ENOMEM;
mk->mk_sb = sb;
init_rwsem(&mk->mk_sem); init_rwsem(&mk->mk_sem);
refcount_set(&mk->mk_struct_refs, 1); refcount_set(&mk->mk_struct_refs, 1);
mk->mk_spec = *mk_spec; mk->mk_spec = *mk_spec;
...@@ -1068,7 +1066,7 @@ static int do_remove_key(struct file *filp, void __user *_uarg, bool all_users) ...@@ -1068,7 +1066,7 @@ static int do_remove_key(struct file *filp, void __user *_uarg, bool all_users)
err = -ENOKEY; err = -ENOKEY;
if (is_master_key_secret_present(&mk->mk_secret)) { if (is_master_key_secret_present(&mk->mk_secret)) {
wipe_master_key_secret(&mk->mk_secret); wipe_master_key_secret(&mk->mk_secret);
fscrypt_put_master_key_activeref(mk); fscrypt_put_master_key_activeref(sb, mk);
err = 0; err = 0;
} }
inodes_remain = refcount_read(&mk->mk_active_refs) > 0; inodes_remain = refcount_read(&mk->mk_active_refs) > 0;
......
...@@ -509,7 +509,7 @@ static void put_crypt_info(struct fscrypt_info *ci) ...@@ -509,7 +509,7 @@ static void put_crypt_info(struct fscrypt_info *ci)
spin_lock(&mk->mk_decrypted_inodes_lock); spin_lock(&mk->mk_decrypted_inodes_lock);
list_del(&ci->ci_master_key_link); list_del(&ci->ci_master_key_link);
spin_unlock(&mk->mk_decrypted_inodes_lock); spin_unlock(&mk->mk_decrypted_inodes_lock);
fscrypt_put_master_key_activeref(mk); fscrypt_put_master_key_activeref(ci->ci_inode->i_sb, mk);
} }
memzero_explicit(ci, sizeof(*ci)); memzero_explicit(ci, sizeof(*ci));
kmem_cache_free(fscrypt_info_cachep, ci); kmem_cache_free(fscrypt_info_cachep, ci);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment