• Eric Biggers's avatar
    f2fs: call unlock_new_inode() before d_instantiate() · ab3835aa
    Eric Biggers authored
    xfstest generic/429 sometimes hangs on f2fs, caused by a thread being
    unable to take a directory's i_rwsem for write in vfs_rmdir().  In the
    test, one thread repeatedly creates and removes a directory, and other
    threads repeatedly look up a file in the directory.  The bug is that
    f2fs_mkdir() calls d_instantiate() before unlock_new_inode(), resulting
    in the directory inode being exposed to lookups before it has been fully
    initialized.  And with CONFIG_DEBUG_LOCK_ALLOC, unlock_new_inode()
    reinitializes ->i_rwsem, corrupting its state when it is already held.
    
    Fix it by calling unlock_new_inode() before d_instantiate().  This
    matches what other filesystems do.
    
    Fixes: 57397d86 ("f2fs: add inode operations for special inodes")
    Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
    Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    ab3835aa
namei.c 28.3 KB