Now that we never drop the i_count to 0 for valid objects, rework the logic in the find_inode* helpers to use inode_tryget() to see if they have a live inode. If this fails we can wait for the inode to be freed as we know it's currently being evicted. Signed-off-by: Josef Bacik --- fs/inode.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 66402786cf8f..4ed2e8ff5334 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1093,6 +1093,7 @@ long prune_icache_sb(struct super_block *sb, struct shrink_control *sc) } static void __wait_on_freeing_inode(struct inode *inode, bool is_inode_hash_locked); + /* * Called with the inode lock held. */ @@ -1116,16 +1117,15 @@ static struct inode *find_inode(struct super_block *sb, if (!test(inode, data)) continue; spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE)) { - __wait_on_freeing_inode(inode, is_inode_hash_locked); - goto repeat; - } if (unlikely(inode->i_state & I_CREATING)) { spin_unlock(&inode->i_lock); rcu_read_unlock(); return ERR_PTR(-ESTALE); } - __iget(inode); + if (!inode_tryget(inode)) { + __wait_on_freeing_inode(inode, is_inode_hash_locked); + goto repeat; + } inode_lru_list_del(inode); spin_unlock(&inode->i_lock); rcu_read_unlock(); @@ -1158,16 +1158,15 @@ static struct inode *find_inode_fast(struct super_block *sb, if (inode->i_sb != sb) continue; spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE)) { - __wait_on_freeing_inode(inode, is_inode_hash_locked); - goto repeat; - } if (unlikely(inode->i_state & I_CREATING)) { spin_unlock(&inode->i_lock); rcu_read_unlock(); return ERR_PTR(-ESTALE); } - __iget(inode); + if (!inode_tryget(inode)) { + __wait_on_freeing_inode(inode, is_inode_hash_locked); + goto repeat; + } inode_lru_list_del(inode); spin_unlock(&inode->i_lock); rcu_read_unlock(); -- 2.49.0