diff mbox series

[2/7] btrfs: fix the qgroup data free range for inline data extents

Message ID ee3f2825c85a104f23fb3703052383340fb676ce.1740354271.git.wqu@suse.com (mailing list archive)
State New
Headers show
Series btrfs: make subpage handling be feature full | expand

Commit Message

Qu Wenruo Feb. 23, 2025, 11:46 p.m. UTC
Inside function __cow_file_range_inline() since the inlined data no
longer takes any data space, we need to free up the reserved space.

However the code is still using the old page size == sector size
assumption, and will not handle subpage case well.

Thankfully it is not going to cause any problems because we have two extra
safe nets:

- Inline data extents creation is disable for sector size < page size
  cases for now
  But it won't stay that for long.

- btrfs_qgroup_free_data() will only clear ranges which are already
  reserved
  So even if we pass a range larger than what we need, it should still
  be fine, especially there is only reserved space for a single block at
  file offset 0 for an inline data extent.

But just for the sake of consistentcy, fix the call site to use
sectorsize instead of page size.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 fs/btrfs/inode.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Filipe Manana Feb. 25, 2025, 3:11 p.m. UTC | #1
On Sun, Feb 23, 2025 at 11:47 PM Qu Wenruo <wqu@suse.com> wrote:
>
> Inside function __cow_file_range_inline() since the inlined data no
> longer takes any data space, we need to free up the reserved space.
>
> However the code is still using the old page size == sector size
> assumption, and will not handle subpage case well.
>
> Thankfully it is not going to cause any problems because we have two extra
> safe nets:
>
> - Inline data extents creation is disable for sector size < page size
>   cases for now
>   But it won't stay that for long.
>
> - btrfs_qgroup_free_data() will only clear ranges which are already
>   reserved
>   So even if we pass a range larger than what we need, it should still
>   be fine, especially there is only reserved space for a single block at
>   file offset 0 for an inline data extent.
>
> But just for the sake of consistentcy, fix the call site to use
> sectorsize instead of page size.
>
> Signed-off-by: Qu Wenruo <wqu@suse.com>

Reviewed-by: Filipe Manana <fdmanana@suse.com>

Looks good, thanks.

> ---
>  fs/btrfs/inode.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index fe2c6038064a..0efe9f005149 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -672,7 +672,7 @@ static noinline int __cow_file_range_inline(struct btrfs_inode *inode,
>          * And at reserve time, it's always aligned to page size, so
>          * just free one page here.
>          */
> -       btrfs_qgroup_free_data(inode, NULL, 0, PAGE_SIZE, NULL);
> +       btrfs_qgroup_free_data(inode, NULL, 0, fs_info->sectorsize, NULL);
>         btrfs_free_path(path);
>         btrfs_end_transaction(trans);
>         return ret;
> --
> 2.48.1
>
>
diff mbox series

Patch

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index fe2c6038064a..0efe9f005149 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -672,7 +672,7 @@  static noinline int __cow_file_range_inline(struct btrfs_inode *inode,
 	 * And at reserve time, it's always aligned to page size, so
 	 * just free one page here.
 	 */
-	btrfs_qgroup_free_data(inode, NULL, 0, PAGE_SIZE, NULL);
+	btrfs_qgroup_free_data(inode, NULL, 0, fs_info->sectorsize, NULL);
 	btrfs_free_path(path);
 	btrfs_end_transaction(trans);
 	return ret;