Follow the same pattern in find_inode*. Instead of checking for I_WILL_FREE|I_FREEING simply call igrab() and if it succeeds we're done. Signed-off-by: Josef Bacik --- fs/inode.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 63ccd32fa221..6b772b9883ec 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1899,11 +1899,8 @@ int insert_inode_locked(struct inode *inode) continue; if (old->i_sb != sb) continue; - spin_lock(&old->i_lock); - if (old->i_state & (I_FREEING|I_WILL_FREE)) { - spin_unlock(&old->i_lock); + if (!igrab(old)) continue; - } break; } if (likely(!old)) { @@ -1915,12 +1912,13 @@ int insert_inode_locked(struct inode *inode) spin_unlock(&inode_hash_lock); return 0; } + spin_lock(&old->i_lock); if (unlikely(old->i_state & I_CREATING)) { spin_unlock(&old->i_lock); spin_unlock(&inode_hash_lock); + iput(old); return -EBUSY; } - __iget(old); spin_unlock(&old->i_lock); spin_unlock(&inode_hash_lock); wait_on_inode(old); -- 2.49.0