Message ID | ee3f2825c85a104f23fb3703052383340fb676ce.1740354271.git.wqu@suse.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | btrfs: make subpage handling be feature full | expand |
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 --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;
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(-)