Skip to content

Commit 02aef42

Browse files
committed
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent f0c4d9f commit 02aef42

File tree

3 files changed

+11
-18
lines changed

3 files changed

+11
-18
lines changed

fs/crypto/fscrypt_private.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -439,13 +439,7 @@ struct fscrypt_master_key_secret {
439439
struct fscrypt_master_key {
440440

441441
/*
442-
* Back-pointer to the super_block of the filesystem to which this
443-
* master key has been added. Only valid if ->mk_active_refs > 0.
444-
*/
445-
struct super_block *mk_sb;
446-
447-
/*
448-
* Link in ->mk_sb->s_master_keys->key_hashtable.
442+
* Link in ->s_master_keys->key_hashtable.
449443
* Only valid if ->mk_active_refs > 0.
450444
*/
451445
struct hlist_node mk_node;
@@ -456,7 +450,7 @@ struct fscrypt_master_key {
456450
/*
457451
* Active and structural reference counts. An active ref guarantees
458452
* that the struct continues to exist, continues to be in the keyring
459-
* ->mk_sb->s_master_keys, and that any embedded subkeys (e.g.
453+
* ->s_master_keys, and that any embedded subkeys (e.g.
460454
* ->mk_direct_keys) that have been prepared continue to exist.
461455
* A structural ref only guarantees that the struct continues to exist.
462456
*
@@ -569,7 +563,8 @@ static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec)
569563

570564
void fscrypt_put_master_key(struct fscrypt_master_key *mk);
571565

572-
void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk);
566+
void fscrypt_put_master_key_activeref(struct super_block *sb,
567+
struct fscrypt_master_key *mk);
573568

574569
struct fscrypt_master_key *
575570
fscrypt_find_master_key(struct super_block *sb,

fs/crypto/keyring.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,9 @@ void fscrypt_put_master_key(struct fscrypt_master_key *mk)
7979
call_rcu(&mk->mk_rcu_head, fscrypt_free_master_key);
8080
}
8181

82-
void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk)
82+
void fscrypt_put_master_key_activeref(struct super_block *sb,
83+
struct fscrypt_master_key *mk)
8384
{
84-
struct super_block *sb = mk->mk_sb;
85-
struct fscrypt_keyring *keyring = sb->s_master_keys;
8685
size_t i;
8786

8887
if (!refcount_dec_and_test(&mk->mk_active_refs))
@@ -93,9 +92,9 @@ void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk)
9392
* destroying any subkeys embedded in it.
9493
*/
9594

96-
spin_lock(&keyring->lock);
95+
spin_lock(&sb->s_master_keys->lock);
9796
hlist_del_rcu(&mk->mk_node);
98-
spin_unlock(&keyring->lock);
97+
spin_unlock(&sb->s_master_keys->lock);
9998

10099
/*
101100
* ->mk_active_refs == 0 implies that ->mk_secret is not present and
@@ -243,7 +242,7 @@ void fscrypt_destroy_keyring(struct super_block *sb)
243242
WARN_ON(refcount_read(&mk->mk_struct_refs) != 1);
244243
WARN_ON(!is_master_key_secret_present(&mk->mk_secret));
245244
wipe_master_key_secret(&mk->mk_secret);
246-
fscrypt_put_master_key_activeref(mk);
245+
fscrypt_put_master_key_activeref(sb, mk);
247246
}
248247
}
249248
kfree_sensitive(keyring);
@@ -424,7 +423,6 @@ static int add_new_master_key(struct super_block *sb,
424423
if (!mk)
425424
return -ENOMEM;
426425

427-
mk->mk_sb = sb;
428426
init_rwsem(&mk->mk_sem);
429427
refcount_set(&mk->mk_struct_refs, 1);
430428
mk->mk_spec = *mk_spec;
@@ -1068,7 +1066,7 @@ static int do_remove_key(struct file *filp, void __user *_uarg, bool all_users)
10681066
err = -ENOKEY;
10691067
if (is_master_key_secret_present(&mk->mk_secret)) {
10701068
wipe_master_key_secret(&mk->mk_secret);
1071-
fscrypt_put_master_key_activeref(mk);
1069+
fscrypt_put_master_key_activeref(sb, mk);
10721070
err = 0;
10731071
}
10741072
inodes_remain = refcount_read(&mk->mk_active_refs) > 0;

fs/crypto/keysetup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ static void put_crypt_info(struct fscrypt_info *ci)
509509
spin_lock(&mk->mk_decrypted_inodes_lock);
510510
list_del(&ci->ci_master_key_link);
511511
spin_unlock(&mk->mk_decrypted_inodes_lock);
512-
fscrypt_put_master_key_activeref(mk);
512+
fscrypt_put_master_key_activeref(ci->ci_inode->i_sb, mk);
513513
}
514514
memzero_explicit(ci, sizeof(*ci));
515515
kmem_cache_free(fscrypt_info_cachep, ci);

0 commit comments

Comments
 (0)