mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 19:23:57 +08:00
btrfs: qgroup: Add quick exit for non-fs extents
Modify btrfs_qgroup_account_extent() to exit quicker for non-fs extents. The quick exit condition is: 1) The extent belongs to a non-fs tree Only fs-tree extents can affect qgroup numbers and is the only case where extent can be shared between different trees. Although strictly speaking extent in data-reloc or tree-reloc tree can be shared, data/tree-reloc root won't appear in the result of btrfs_find_all_roots(), so we can ignore such case. So we can check the first root in old_roots/new_roots ulist. - if we find the 1st root is a not a fs/subvol root, then we can skip the extent - if we find the 1st root is a fs/subvol root, then we must continue calculation OR 2) both 'nr_old_roots' and 'nr_new_roots' are 0 This means either such extent got allocated then freed in current transaction or it's a new reloc tree extent, whose nr_new_roots is 0. Either way it won't affect qgroup accounting and can be skipped safely. Such quick exit can make trace output more quite and less confusing: (example with fs uuid and time stamp removed) Before: ------ add_delayed_tree_ref: bytenr=29556736 num_bytes=16384 action=ADD_DELAYED_REF parent=0(-) ref_root=2(EXTENT_TREE) level=0 type=TREE_BLOCK_REF seq=0 btrfs_qgroup_account_extent: bytenr=29556736 num_bytes=16384 nr_old_roots=0 nr_new_roots=1 ------ Extent tree block will trigger btrfs_qgroup_account_extent() trace point while no qgroup number is changed, as extent tree won't affect qgroup accounting. After: ------ add_delayed_tree_ref: bytenr=29556736 num_bytes=16384 action=ADD_DELAYED_REF parent=0(-) ref_root=2(EXTENT_TREE) level=0 type=TREE_BLOCK_REF seq=0 ------ Now such unrelated extent won't trigger btrfs_qgroup_account_extent() trace point, making the trace less noisy. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> [ changelog and comment adjustments ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
d7eae3403f
commit
5edfd9fdc6
@ -1919,6 +1919,35 @@ static int qgroup_update_counters(struct btrfs_fs_info *fs_info,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the @roots potentially is a list of fs tree roots
|
||||
*
|
||||
* Return 0 for definitely not a fs/subvol tree roots ulist
|
||||
* Return 1 for possible fs/subvol tree roots in the list (considering an empty
|
||||
* one as well)
|
||||
*/
|
||||
static int maybe_fs_roots(struct ulist *roots)
|
||||
{
|
||||
struct ulist_node *unode;
|
||||
struct ulist_iterator uiter;
|
||||
|
||||
/* Empty one, still possible for fs roots */
|
||||
if (!roots || roots->nnodes == 0)
|
||||
return 1;
|
||||
|
||||
ULIST_ITER_INIT(&uiter);
|
||||
unode = ulist_next(roots, &uiter);
|
||||
if (!unode)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* If it contains fs tree roots, then it must belong to fs/subvol
|
||||
* trees.
|
||||
* If it contains a non-fs tree, it won't be shared with fs/subvol trees.
|
||||
*/
|
||||
return is_fstree(unode->val);
|
||||
}
|
||||
|
||||
int
|
||||
btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info,
|
||||
@ -1935,10 +1964,20 @@ btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
||||
return 0;
|
||||
|
||||
if (new_roots)
|
||||
if (new_roots) {
|
||||
if (!maybe_fs_roots(new_roots))
|
||||
goto out_free;
|
||||
nr_new_roots = new_roots->nnodes;
|
||||
if (old_roots)
|
||||
}
|
||||
if (old_roots) {
|
||||
if (!maybe_fs_roots(old_roots))
|
||||
goto out_free;
|
||||
nr_old_roots = old_roots->nnodes;
|
||||
}
|
||||
|
||||
/* Quick exit, either not fs tree roots, or won't affect any qgroup */
|
||||
if (nr_old_roots == 0 && nr_new_roots == 0)
|
||||
goto out_free;
|
||||
|
||||
BUG_ON(!fs_info->quota_root);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user