On 1/15/20 12:12 PM, Filipe Manana wrote:
On Tue, Jan 7, 2020 at 7:43 PM Josef Bacik <josef@xxxxxxxxxxxxxx> wrote:We want to use this everywhere we modify the file extent items permanently. These include 1) Inserting new file extents for writes and prealloc extents. 2) Truncating inode items. 3) btrfs_cont_expand(). 4) Insert inline extents. 5) Insert new extents from log replay. 6) Insert a new extent for clone, as it could be past isize. We do not however call the clear helper for hole punching because it simply swaps out an existing file extent for a hole, so there's effectively no change as far as the i_size is concerned. Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx> --- fs/btrfs/delayed-inode.c | 4 +++ fs/btrfs/file.c | 6 ++++ fs/btrfs/inode.c | 59 +++++++++++++++++++++++++++++++++++++++- fs/btrfs/tree-log.c | 5 ++++ 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index d3e15e1d4a91..8b4dcf4f6b3e 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -1762,6 +1762,7 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev) { struct btrfs_delayed_node *delayed_node; struct btrfs_inode_item *inode_item; + struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; delayed_node = btrfs_get_delayed_node(BTRFS_I(inode)); if (!delayed_node) @@ -1779,6 +1780,9 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev) i_uid_write(inode, btrfs_stack_inode_uid(inode_item)); i_gid_write(inode, btrfs_stack_inode_gid(inode_item)); btrfs_i_size_write(BTRFS_I(inode), btrfs_stack_inode_size(inode_item)); + btrfs_inode_set_file_extent_range(BTRFS_I(inode), 0, + round_up(i_size_read(inode), + fs_info->sectorsize));Why set it here when we have already done it at btrfs_read_locked_inode()? This seems duplicated.
Because if btrfs_fill_inode() returns true it means we had a delayed inode in memory still and we skip the reading of the inode off of disk, so it's an either or case, not a duplicate. Thanks,
Josef
