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.com Signed-off-by: Eric Biggers <ebiggers@google.com> Link: https://lore.kernel.org/r/20221110082942.351615-1-ebiggers@kernel.org
This commit is contained in:
committed by
Jaegeuk Kim
parent
7f15b5cd0c
commit
6e7ee70704
@@ -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 {
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user