Skip to content

Commit 5e3e4c3

Browse files
austin880625synokdave
authored andcommitted
btrfs: initialize 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 at btrfs_read_locked_inode(). Fixes: 3d7db6e ("btrfs: don't allocate file extent tree for non regular files") Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: austinchang <austinchang@synology.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 04a7090 commit 5e3e4c3

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

fs/btrfs/inode.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3909,10 +3909,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
39093909
bool filled = false;
39103910
int first_xattr_slot;
39113911

3912-
ret = btrfs_init_file_extent_tree(inode);
3913-
if (ret)
3914-
goto out;
3915-
39163912
ret = btrfs_fill_inode(inode, &rdev);
39173913
if (!ret)
39183914
filled = true;
@@ -3943,6 +3939,11 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
39433939
set_nlink(vfs_inode, btrfs_inode_nlink(leaf, inode_item));
39443940
i_uid_write(vfs_inode, btrfs_inode_uid(leaf, inode_item));
39453941
i_gid_write(vfs_inode, btrfs_inode_gid(leaf, inode_item));
3942+
3943+
ret = btrfs_init_file_extent_tree(inode);
3944+
if (ret)
3945+
goto out;
3946+
39463947
btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item));
39473948
btrfs_inode_set_file_extent_range(inode, 0,
39483949
round_up(i_size_read(vfs_inode), fs_info->sectorsize));

0 commit comments

Comments
 (0)