69 lines
2.5 KiB
Diff
69 lines
2.5 KiB
Diff
|
From 81baeb2a67d8245ac5b61299e54dd65defd4ac72 Mon Sep 17 00:00:00 2001
|
||
|
From: Qu Wenruo <wqu@suse.com>
|
||
|
Date: Tue, 10 Sep 2024 15:21:04 +0930
|
||
|
Subject: btrfs: qgroup: set a more sane default value for subtree drop
|
||
|
threshold
|
||
|
|
||
|
Since commit 011b46c30476 ("btrfs: skip subtree scan if it's too high to
|
||
|
avoid low stall in btrfs_commit_transaction()"), btrfs qgroup can
|
||
|
automatically skip large subtree scan at the cost of marking qgroup
|
||
|
inconsistent.
|
||
|
|
||
|
It's designed to address the final performance problem of snapshot drop
|
||
|
with qgroup enabled, but to be safe the default value is
|
||
|
BTRFS_MAX_LEVEL, requiring a user space daemon to set a different value
|
||
|
to make it work.
|
||
|
|
||
|
I'd say it's not a good idea to rely on user space tool to set this
|
||
|
default value, especially when some operations (snapshot dropping) can
|
||
|
be triggered immediately after mount, leaving a very small window to
|
||
|
that that sysfs interface.
|
||
|
|
||
|
So instead of disabling this new feature by default, enable it with a
|
||
|
low threshold (3), so that large subvolume tree drop at mount time won't
|
||
|
cause huge qgroup workload.
|
||
|
|
||
|
CC: stable@vger.kernel.org # 6.1
|
||
|
Signed-off-by: Qu Wenruo <wqu@suse.com>
|
||
|
Reviewed-by: David Sterba <dsterba@suse.com>
|
||
|
Signed-off-by: David Sterba <dsterba@suse.com>
|
||
|
---
|
||
|
fs/btrfs/disk-io.c | 2 +-
|
||
|
fs/btrfs/qgroup.c | 2 +-
|
||
|
fs/btrfs/qgroup.h | 2 ++
|
||
|
3 files changed, 4 insertions(+), 2 deletions(-)
|
||
|
|
||
|
--- a/fs/btrfs/disk-io.c
|
||
|
+++ b/fs/btrfs/disk-io.c
|
||
|
@@ -1960,7 +1960,7 @@ static void btrfs_init_qgroup(struct btr
|
||
|
fs_info->qgroup_seq = 1;
|
||
|
fs_info->qgroup_ulist = NULL;
|
||
|
fs_info->qgroup_rescan_running = false;
|
||
|
- fs_info->qgroup_drop_subtree_thres = BTRFS_MAX_LEVEL;
|
||
|
+ fs_info->qgroup_drop_subtree_thres = BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT;
|
||
|
mutex_init(&fs_info->qgroup_rescan_lock);
|
||
|
}
|
||
|
|
||
|
--- a/fs/btrfs/qgroup.c
|
||
|
+++ b/fs/btrfs/qgroup.c
|
||
|
@@ -1407,7 +1407,7 @@ int btrfs_quota_disable(struct btrfs_fs_
|
||
|
fs_info->quota_root = NULL;
|
||
|
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON;
|
||
|
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_SIMPLE_MODE;
|
||
|
- fs_info->qgroup_drop_subtree_thres = BTRFS_MAX_LEVEL;
|
||
|
+ fs_info->qgroup_drop_subtree_thres = BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT;
|
||
|
spin_unlock(&fs_info->qgroup_lock);
|
||
|
|
||
|
btrfs_free_qgroup_config(fs_info);
|
||
|
--- a/fs/btrfs/qgroup.h
|
||
|
+++ b/fs/btrfs/qgroup.h
|
||
|
@@ -121,6 +121,8 @@ struct btrfs_inode;
|
||
|
#define BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN (1ULL << 63)
|
||
|
#define BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING (1ULL << 62)
|
||
|
|
||
|
+#define BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT (3)
|
||
|
+
|
||
|
/*
|
||
|
* Record a dirty extent, and info qgroup to update quota on it
|
||
|
*/
|