Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+11 -18
+4 -9
fs/crypto/fscrypt_private.h
··· 439 439 struct fscrypt_master_key { 440 440 441 441 /* 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. 449 443 * Only valid if ->mk_active_refs > 0. 450 444 */ 451 445 struct hlist_node mk_node; ··· 450 456 /* 451 457 * Active and structural reference counts. An active ref guarantees 452 458 * that the struct continues to exist, continues to be in the keyring 453 - * ->mk_sb->s_master_keys, and that any embedded subkeys (e.g. 459 + * ->s_master_keys, and that any embedded subkeys (e.g. 454 460 * ->mk_direct_keys) that have been prepared continue to exist. 455 461 * A structural ref only guarantees that the struct continues to exist. 456 462 * ··· 563 569 564 570 void fscrypt_put_master_key(struct fscrypt_master_key *mk); 565 571 566 - void fscrypt_put_master_key_activeref(struct fscrypt_master_key *mk); 572 + void fscrypt_put_master_key_activeref(struct super_block *sb, 573 + struct fscrypt_master_key *mk); 567 574 568 575 struct fscrypt_master_key * 569 576 fscrypt_find_master_key(struct super_block *sb,
+6 -8
fs/crypto/keyring.c
··· 79 79 call_rcu(&mk->mk_rcu_head, fscrypt_free_master_key); 80 80 } 81 81 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) 83 84 { 84 - struct super_block *sb = mk->mk_sb; 85 - struct fscrypt_keyring *keyring = sb->s_master_keys; 86 85 size_t i; 87 86 88 87 if (!refcount_dec_and_test(&mk->mk_active_refs)) ··· 92 93 * destroying any subkeys embedded in it. 93 94 */ 94 95 95 - spin_lock(&keyring->lock); 96 + spin_lock(&sb->s_master_keys->lock); 96 97 hlist_del_rcu(&mk->mk_node); 97 - spin_unlock(&keyring->lock); 98 + spin_unlock(&sb->s_master_keys->lock); 98 99 99 100 /* 100 101 * ->mk_active_refs == 0 implies that ->mk_secret is not present and ··· 242 243 WARN_ON(refcount_read(&mk->mk_struct_refs) != 1); 243 244 WARN_ON(!is_master_key_secret_present(&mk->mk_secret)); 244 245 wipe_master_key_secret(&mk->mk_secret); 245 - fscrypt_put_master_key_activeref(mk); 246 + fscrypt_put_master_key_activeref(sb, mk); 246 247 } 247 248 } 248 249 kfree_sensitive(keyring); ··· 423 424 if (!mk) 424 425 return -ENOMEM; 425 426 426 - mk->mk_sb = sb; 427 427 init_rwsem(&mk->mk_sem); 428 428 refcount_set(&mk->mk_struct_refs, 1); 429 429 mk->mk_spec = *mk_spec; ··· 1066 1068 err = -ENOKEY; 1067 1069 if (is_master_key_secret_present(&mk->mk_secret)) { 1068 1070 wipe_master_key_secret(&mk->mk_secret); 1069 - fscrypt_put_master_key_activeref(mk); 1071 + fscrypt_put_master_key_activeref(sb, mk); 1070 1072 err = 0; 1071 1073 } 1072 1074 inodes_remain = refcount_read(&mk->mk_active_refs) > 0;
+1 -1
fs/crypto/keysetup.c
··· 509 509 spin_lock(&mk->mk_decrypted_inodes_lock); 510 510 list_del(&ci->ci_master_key_link); 511 511 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); 513 513 } 514 514 memzero_explicit(ci, sizeof(*ci)); 515 515 kmem_cache_free(fscrypt_info_cachep, ci);