btrfs: initialize inode::file_extent_tree after i_mode has been set
authoraustinchang <austinchang@synology.com>
Thu, 11 Sep 2025 06:06:29 +0000 (06:06 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 15 Sep 2025 03:25:40 +0000 (05:25 +0200)
commit8679d2687c351824d08cf1f0e86f3b65f22a00fe
tree889f0080de275f4846d53ceba15c318ad2e2915b
parent5b8d2964754102323ca24495ba94892426284e3a
btrfs: initialize inode::file_extent_tree after i_mode has been set

btrfs_init_file_extent_tree() uses S_ISREG() to determine if the file is
a regular file. In the beginning of btrfs_read_locked_inode(), the i_mode
hasn't been read from inode item, then file_extent_tree won't be used at
all in volumes without NO_HOLES.

Fix this by calling btrfs_init_file_extent_tree() after i_mode is
initialized in btrfs_read_locked_inode().

Fixes: 3d7db6e8bd22e6 ("btrfs: don't allocate file extent tree for non regular files")
CC: stable@vger.kernel.org # 6.12+
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: austinchang <austinchang@synology.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c
fs/btrfs/inode.c