Instead of checking for I_WILL_FREE|I_FREEING simply use the refcount to make sure we have a live inode. Signed-off-by: Josef Bacik --- fs/crypto/keyring.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/crypto/keyring.c b/fs/crypto/keyring.c index 7557f6a88b8f..969db498149a 100644 --- a/fs/crypto/keyring.c +++ b/fs/crypto/keyring.c @@ -956,13 +956,16 @@ static void evict_dentries_for_decrypted_inodes(struct fscrypt_master_key *mk) list_for_each_entry(ci, &mk->mk_decrypted_inodes, ci_master_key_link) { inode = ci->ci_inode; + spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) { + if (inode->i_state & I_NEW) { spin_unlock(&inode->i_lock); continue; } - __iget(inode); spin_unlock(&inode->i_lock); + + if (!igrab(inode)) + continue; spin_unlock(&mk->mk_decrypted_inodes_lock); shrink_dcache_inode(inode); -- 2.49.0