* [PATCH v2] btrfs-progs: mkfs use same stripe/chunk size as kernel when fs > 50G
@ 2022-08-24 12:39 Wang Yugui
0 siblings, 0 replies; only message in thread
From: Wang Yugui @ 2022-08-24 12:39 UTC (permalink / raw)
To: linux-btrfs; +Cc: Wang Yugui
When mkfs.btrfs a 1TB device, the allocated chunks are
Data: single 8.00MiB
Metadata: DUP 1.00GiB
System: DUP 8.00MiB
After 'btrfs balance start -f', the allocated chunks are
Data: single 1.00GiB
Metadata: DUP 1.00GiB
System: DUP 32.00MiB
So here we sync stripe/chunk size with kernel for the most common case that
fs size > 50G, although there are still some cases to sync.
Signed-off-by: Wang Yugui <wangyugui@e16-tech.com>
---
changes since v1
import BTRFS_MAX_DATA_CHUNK_SIZE from kernel
kernel-shared/volumes.c | 30 +++++++++++++++++++++++-------
kernel-shared/volumes.h | 2 ++
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/kernel-shared/volumes.c b/kernel-shared/volumes.c
index 40032a4b..ac82e767 100644
--- a/kernel-shared/volumes.c
+++ b/kernel-shared/volumes.c
@@ -1189,6 +1189,11 @@ error:
static void init_alloc_chunk_ctl_policy_regular(struct btrfs_fs_info *info,
struct alloc_chunk_ctl *ctl)
{
+ /*
+ * kernel: calc_chunk_size() init_alloc_chunk_ctl_policy_regular()
+ * sync stripe/chunk size with kernel when fs size > 50G
+ * and keep min btrfs file system size unchanged.
+ */
u64 type = ctl->type;
u64 percent_max;
@@ -1200,23 +1205,34 @@ static void init_alloc_chunk_ctl_policy_regular(struct btrfs_fs_info *info,
ctl->max_stripes = BTRFS_MAX_DEVS_SYS_CHUNK;
} else if (type & BTRFS_BLOCK_GROUP_DATA) {
ctl->stripe_size = SZ_1G;
- ctl->max_chunk_size = 10 * ctl->stripe_size;
+ ctl->max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE;
ctl->min_stripe_size = SZ_64M;
ctl->max_stripes = BTRFS_MAX_DEVS(info);
} else if (type & BTRFS_BLOCK_GROUP_METADATA) {
- /* For larger filesystems, use larger metadata chunks */
- if (info->fs_devices->total_rw_bytes > 50ULL * SZ_1G)
- ctl->max_chunk_size = SZ_1G;
- else
- ctl->max_chunk_size = SZ_256M;
+ ctl->max_chunk_size = SZ_256M;
ctl->stripe_size = ctl->max_chunk_size;
ctl->min_stripe_size = SZ_32M;
ctl->max_stripes = BTRFS_MAX_DEVS(info);
}
}
+ /* sync stripe/chunk size with kernel when fs size > 50G */
+ if (info->fs_devices->total_rw_bytes > 50ULL * SZ_1G){
+ if (type & BTRFS_BLOCK_GROUP_SYSTEM) {
+ ctl->stripe_size = SZ_32M;
+ ctl->max_chunk_size = ctl->stripe_size * 2;
+ } else if (type & BTRFS_BLOCK_GROUP_DATA) {
+ ctl->stripe_size = SZ_1G;
+ ctl->max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE;
+ } else if (type & BTRFS_BLOCK_GROUP_METADATA) {
+ ctl->max_chunk_size = SZ_1G;
+ ctl->stripe_size = ctl->max_chunk_size;
+ }
+ }
+
/* We don't want a chunk larger than 10% of the FS */
- percent_max = div_factor(btrfs_super_total_bytes(info->super_copy), 1);
+ ASSERT(btrfs_super_total_bytes(info->super_copy) == info->fs_devices->total_rw_bytes);
+ percent_max = div_factor(info->fs_devices->total_rw_bytes, 1);
ctl->max_chunk_size = min(percent_max, ctl->max_chunk_size);
}
diff --git a/kernel-shared/volumes.h b/kernel-shared/volumes.h
index 6e9103a9..f5b6245a 100644
--- a/kernel-shared/volumes.h
+++ b/kernel-shared/volumes.h
@@ -23,6 +23,8 @@
#include "kernel-shared/ctree.h"
#include "kernel-lib/sizes.h"
+#define BTRFS_MAX_DATA_CHUNK_SIZE (10ULL * SZ_1G)
+
#define BTRFS_STRIPE_LEN SZ_64K
struct btrfs_device {
--
2.36.2
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2022-08-24 12:39 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-24 12:39 [PATCH v2] btrfs-progs: mkfs use same stripe/chunk size as kernel when fs > 50G Wang Yugui
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.