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

fscrypt: use WARN_ON_ONCE instead of WARN_ON

As per Linus's suggestion
(https://lore.kernel.org/r/CAHk-=whefxRGyNGzCzG6BVeM=5vnvgb-XhSeFJVxJyAxAF8XRA@mail.gmail.com),
use WARN_ON_ONCE instead of WARN_ON. This barely adds any extra
overhead, and it makes it so that if any of these ever becomes reachable
(they shouldn't, but that's the point), the logs can't be flooded.

Link: https://lore.kernel.org/r/20230320233943.73600-1-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>

+25 -25
+3 -3
fs/crypto/bio.c
··· 69 69 pblk << (blockbits - SECTOR_SHIFT); 70 70 } 71 71 ret = bio_add_page(bio, ZERO_PAGE(0), bytes_this_page, 0); 72 - if (WARN_ON(ret != bytes_this_page)) { 72 + if (WARN_ON_ONCE(ret != bytes_this_page)) { 73 73 err = -EIO; 74 74 goto out; 75 75 } ··· 147 147 break; 148 148 } 149 149 nr_pages = i; 150 - if (WARN_ON(nr_pages <= 0)) 150 + if (WARN_ON_ONCE(nr_pages <= 0)) 151 151 return -EINVAL; 152 152 153 153 /* This always succeeds since __GFP_DIRECT_RECLAIM is set. */ ··· 170 170 offset += blocksize; 171 171 if (offset == PAGE_SIZE || len == 0) { 172 172 ret = bio_add_page(bio, pages[i++], offset, 0); 173 - if (WARN_ON(ret != offset)) { 173 + if (WARN_ON_ONCE(ret != offset)) { 174 174 err = -EIO; 175 175 goto out; 176 176 }
+2 -2
fs/crypto/fname.c
··· 110 110 * Copy the filename to the output buffer for encrypting in-place and 111 111 * pad it with the needed number of NUL bytes. 112 112 */ 113 - if (WARN_ON(olen < iname->len)) 113 + if (WARN_ON_ONCE(olen < iname->len)) 114 114 return -ENOBUFS; 115 115 memcpy(out, iname->name, iname->len); 116 116 memset(out + iname->len, 0, olen - iname->len); ··· 570 570 { 571 571 const struct fscrypt_info *ci = dir->i_crypt_info; 572 572 573 - WARN_ON(!ci->ci_dirhash_key_initialized); 573 + WARN_ON_ONCE(!ci->ci_dirhash_key_initialized); 574 574 575 575 return siphash(name->name, name->len, &ci->ci_dirhash_key); 576 576 }
+2 -2
fs/crypto/fscrypt_private.h
··· 101 101 case FSCRYPT_CONTEXT_V2: 102 102 return ctx->v2.nonce; 103 103 } 104 - WARN_ON(1); 104 + WARN_ON_ONCE(1); 105 105 return NULL; 106 106 } 107 107 ··· 386 386 const u8 *raw_key, 387 387 const struct fscrypt_info *ci) 388 388 { 389 - WARN_ON(1); 389 + WARN_ON_ONCE(1); 390 390 return -EOPNOTSUPP; 391 391 } 392 392
+2 -2
fs/crypto/hkdf.c
··· 79 79 return PTR_ERR(hmac_tfm); 80 80 } 81 81 82 - if (WARN_ON(crypto_shash_digestsize(hmac_tfm) != sizeof(prk))) { 82 + if (WARN_ON_ONCE(crypto_shash_digestsize(hmac_tfm) != sizeof(prk))) { 83 83 err = -EINVAL; 84 84 goto err_free_tfm; 85 85 } ··· 125 125 u8 counter = 1; 126 126 u8 tmp[HKDF_HASHLEN]; 127 127 128 - if (WARN_ON(okmlen > 255 * HKDF_HASHLEN)) 128 + if (WARN_ON_ONCE(okmlen > 255 * HKDF_HASHLEN)) 129 129 return -EINVAL; 130 130 131 131 desc->tfm = hkdf->hmac_tfm;
+1 -1
fs/crypto/hooks.c
··· 345 345 int err; 346 346 347 347 /* This is for encrypted symlinks only */ 348 - if (WARN_ON(!IS_ENCRYPTED(inode))) 348 + if (WARN_ON_ONCE(!IS_ENCRYPTED(inode))) 349 349 return ERR_PTR(-EINVAL); 350 350 351 351 /* If the decrypted target is already cached, just return it. */
+7 -7
fs/crypto/keyring.c
··· 73 73 * fscrypt_master_key struct itself after an RCU grace period ensures 74 74 * that concurrent keyring lookups can no longer find it. 75 75 */ 76 - WARN_ON(refcount_read(&mk->mk_active_refs) != 0); 76 + WARN_ON_ONCE(refcount_read(&mk->mk_active_refs) != 0); 77 77 key_put(mk->mk_users); 78 78 mk->mk_users = NULL; 79 79 call_rcu(&mk->mk_rcu_head, fscrypt_free_master_key); ··· 92 92 * destroying any subkeys embedded in it. 93 93 */ 94 94 95 - if (WARN_ON(!sb->s_master_keys)) 95 + if (WARN_ON_ONCE(!sb->s_master_keys)) 96 96 return; 97 97 spin_lock(&sb->s_master_keys->lock); 98 98 hlist_del_rcu(&mk->mk_node); ··· 102 102 * ->mk_active_refs == 0 implies that ->mk_secret is not present and 103 103 * that ->mk_decrypted_inodes is empty. 104 104 */ 105 - WARN_ON(is_master_key_secret_present(&mk->mk_secret)); 106 - WARN_ON(!list_empty(&mk->mk_decrypted_inodes)); 105 + WARN_ON_ONCE(is_master_key_secret_present(&mk->mk_secret)); 106 + WARN_ON_ONCE(!list_empty(&mk->mk_decrypted_inodes)); 107 107 108 108 for (i = 0; i <= FSCRYPT_MODE_MAX; i++) { 109 109 fscrypt_destroy_prepared_key( ··· 237 237 * with ->mk_secret. There should be no structural refs 238 238 * beyond the one associated with the active ref. 239 239 */ 240 - WARN_ON(refcount_read(&mk->mk_active_refs) != 1); 241 - WARN_ON(refcount_read(&mk->mk_struct_refs) != 1); 242 - WARN_ON(!is_master_key_secret_present(&mk->mk_secret)); 240 + WARN_ON_ONCE(refcount_read(&mk->mk_active_refs) != 1); 241 + WARN_ON_ONCE(refcount_read(&mk->mk_struct_refs) != 1); 242 + WARN_ON_ONCE(!is_master_key_secret_present(&mk->mk_secret)); 243 243 wipe_master_key_secret(&mk->mk_secret); 244 244 fscrypt_put_master_key_activeref(sb, mk); 245 245 }
+6 -6
fs/crypto/keysetup.c
··· 125 125 pr_info("fscrypt: %s using implementation \"%s\"\n", 126 126 mode->friendly_name, crypto_skcipher_driver_name(tfm)); 127 127 } 128 - if (WARN_ON(crypto_skcipher_ivsize(tfm) != mode->ivsize)) { 128 + if (WARN_ON_ONCE(crypto_skcipher_ivsize(tfm) != mode->ivsize)) { 129 129 err = -EINVAL; 130 130 goto err_free_tfm; 131 131 } ··· 199 199 unsigned int hkdf_infolen = 0; 200 200 int err; 201 201 202 - if (WARN_ON(mode_num > FSCRYPT_MODE_MAX)) 202 + if (WARN_ON_ONCE(mode_num > FSCRYPT_MODE_MAX)) 203 203 return -EINVAL; 204 204 205 205 prep_key = &keys[mode_num]; ··· 282 282 void fscrypt_hash_inode_number(struct fscrypt_info *ci, 283 283 const struct fscrypt_master_key *mk) 284 284 { 285 - WARN_ON(ci->ci_inode->i_ino == 0); 286 - WARN_ON(!mk->mk_ino_hash_key_initialized); 285 + WARN_ON_ONCE(ci->ci_inode->i_ino == 0); 286 + WARN_ON_ONCE(!mk->mk_ino_hash_key_initialized); 287 287 288 288 ci->ci_hashed_ino = (u32)siphash_1u64(ci->ci_inode->i_ino, 289 289 &mk->mk_ino_hash_key); ··· 503 503 err = fscrypt_setup_v2_file_key(ci, mk, need_dirhash_key); 504 504 break; 505 505 default: 506 - WARN_ON(1); 506 + WARN_ON_ONCE(1); 507 507 err = -EINVAL; 508 508 break; 509 509 } ··· 577 577 res = PTR_ERR(mode); 578 578 goto out; 579 579 } 580 - WARN_ON(mode->ivsize > FSCRYPT_MAX_IV_SIZE); 580 + WARN_ON_ONCE(mode->ivsize > FSCRYPT_MAX_IV_SIZE); 581 581 crypt_info->ci_mode = mode; 582 582 583 583 res = setup_file_encryption_key(crypt_info, need_dirhash_key, &mk);
+2 -2
fs/crypto/policy.c
··· 48 48 FSCRYPT_KEY_IDENTIFIER_SIZE); 49 49 return 0; 50 50 default: 51 - WARN_ON(1); 51 + WARN_ON_ONCE(1); 52 52 return -EINVAL; 53 53 } 54 54 } ··· 463 463 current->comm, current->pid); 464 464 break; 465 465 default: 466 - WARN_ON(1); 466 + WARN_ON_ONCE(1); 467 467 return -EINVAL; 468 468 } 469 469