mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
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: 3d7db6e8bd ("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>
This commit is contained in:
committed by
David Sterba
parent
5b8d296475
commit
8679d2687c
@@ -1843,7 +1843,6 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans,
|
|||||||
|
|
||||||
int btrfs_fill_inode(struct btrfs_inode *inode, u32 *rdev)
|
int btrfs_fill_inode(struct btrfs_inode *inode, u32 *rdev)
|
||||||
{
|
{
|
||||||
struct btrfs_fs_info *fs_info = inode->root->fs_info;
|
|
||||||
struct btrfs_delayed_node *delayed_node;
|
struct btrfs_delayed_node *delayed_node;
|
||||||
struct btrfs_inode_item *inode_item;
|
struct btrfs_inode_item *inode_item;
|
||||||
struct inode *vfs_inode = &inode->vfs_inode;
|
struct inode *vfs_inode = &inode->vfs_inode;
|
||||||
@@ -1864,8 +1863,6 @@ int btrfs_fill_inode(struct btrfs_inode *inode, u32 *rdev)
|
|||||||
i_uid_write(vfs_inode, btrfs_stack_inode_uid(inode_item));
|
i_uid_write(vfs_inode, btrfs_stack_inode_uid(inode_item));
|
||||||
i_gid_write(vfs_inode, btrfs_stack_inode_gid(inode_item));
|
i_gid_write(vfs_inode, btrfs_stack_inode_gid(inode_item));
|
||||||
btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item));
|
btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item));
|
||||||
btrfs_inode_set_file_extent_range(inode, 0,
|
|
||||||
round_up(i_size_read(vfs_inode), fs_info->sectorsize));
|
|
||||||
vfs_inode->i_mode = btrfs_stack_inode_mode(inode_item);
|
vfs_inode->i_mode = btrfs_stack_inode_mode(inode_item);
|
||||||
set_nlink(vfs_inode, btrfs_stack_inode_nlink(inode_item));
|
set_nlink(vfs_inode, btrfs_stack_inode_nlink(inode_item));
|
||||||
inode_set_bytes(vfs_inode, btrfs_stack_inode_nbytes(inode_item));
|
inode_set_bytes(vfs_inode, btrfs_stack_inode_nbytes(inode_item));
|
||||||
|
|||||||
@@ -3885,10 +3885,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
|
|||||||
bool filled = false;
|
bool filled = false;
|
||||||
int first_xattr_slot;
|
int first_xattr_slot;
|
||||||
|
|
||||||
ret = btrfs_init_file_extent_tree(inode);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = btrfs_fill_inode(inode, &rdev);
|
ret = btrfs_fill_inode(inode, &rdev);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
filled = true;
|
filled = true;
|
||||||
@@ -3920,8 +3916,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
|
|||||||
i_uid_write(vfs_inode, btrfs_inode_uid(leaf, inode_item));
|
i_uid_write(vfs_inode, btrfs_inode_uid(leaf, inode_item));
|
||||||
i_gid_write(vfs_inode, btrfs_inode_gid(leaf, inode_item));
|
i_gid_write(vfs_inode, btrfs_inode_gid(leaf, inode_item));
|
||||||
btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item));
|
btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item));
|
||||||
btrfs_inode_set_file_extent_range(inode, 0,
|
|
||||||
round_up(i_size_read(vfs_inode), fs_info->sectorsize));
|
|
||||||
|
|
||||||
inode_set_atime(vfs_inode, btrfs_timespec_sec(leaf, &inode_item->atime),
|
inode_set_atime(vfs_inode, btrfs_timespec_sec(leaf, &inode_item->atime),
|
||||||
btrfs_timespec_nsec(leaf, &inode_item->atime));
|
btrfs_timespec_nsec(leaf, &inode_item->atime));
|
||||||
@@ -3953,6 +3947,11 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_path
|
|||||||
btrfs_set_inode_mapping_order(inode);
|
btrfs_set_inode_mapping_order(inode);
|
||||||
|
|
||||||
cache_index:
|
cache_index:
|
||||||
|
ret = btrfs_init_file_extent_tree(inode);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
btrfs_inode_set_file_extent_range(inode, 0,
|
||||||
|
round_up(i_size_read(vfs_inode), fs_info->sectorsize));
|
||||||
/*
|
/*
|
||||||
* If we were modified in the current generation and evicted from memory
|
* If we were modified in the current generation and evicted from memory
|
||||||
* and then re-read we need to do a full sync since we don't have any
|
* and then re-read we need to do a full sync since we don't have any
|
||||||
|
|||||||
Reference in New Issue
Block a user