linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features
@ 2023-04-11  2:31 Qu Wenruo
  2023-04-11  2:31 ` [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated Qu Wenruo
                   ` (2 more replies)
  0 siblings, 3 replies; 17+ messages in thread
From: Qu Wenruo @ 2023-04-11  2:31 UTC (permalink / raw)
  To: linux-btrfs

People are complaining block-group-tree features are not accessible for
non-experimental builds.

So let's make it a stable feature.

Since we're here, it's also a good time to deprecate
-R|--runtime-features option.

Qu Wenruo (2):
  btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  btrfs-progs: move block-group-tree out of experimental features

 Documentation/btrfs-man5.rst |  6 ++++++
 Documentation/btrfstune.rst  |  4 ++--
 Documentation/mkfs.btrfs.rst | 30 +++++++++---------------------
 common/fsfeatures.c          |  8 --------
 mkfs/main.c                  |  3 ++-
 tune/main.c                  | 18 ++++++++----------
 6 files changed, 27 insertions(+), 42 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  2023-04-11  2:31 [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
@ 2023-04-11  2:31 ` Qu Wenruo
  2023-04-12  1:51   ` Neal Gompa
  2023-04-13 12:04   ` Anand Jain
  2023-04-11  2:31 ` [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
  2023-04-13 16:20 ` [PATCH 0/2] " David Sterba
  2 siblings, 2 replies; 17+ messages in thread
From: Qu Wenruo @ 2023-04-11  2:31 UTC (permalink / raw)
  To: linux-btrfs

The option -R|--runtime-features is introduced to support features that
doesn't result a full incompat flag change, thus things like
free-space-tree and quota features are put here.

But to end users, such separation of features is not helpful and can be
sometimes confusing.

Thus we're already migrating those runtime features into -O|--features
option under experimental builds.

I believe this is the proper time to move those runtime features into
-O|--features option, and mark the -R|--runtime-features option
deprecated.

For now we still keep the old option as for compatibility purposes.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 Documentation/mkfs.btrfs.rst | 25 ++++---------------------
 common/fsfeatures.c          |  6 ------
 mkfs/main.c                  |  3 ++-
 3 files changed, 6 insertions(+), 28 deletions(-)

diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
index ba7227b31f72..e80f4c5c83ee 100644
--- a/Documentation/mkfs.btrfs.rst
+++ b/Documentation/mkfs.btrfs.rst
@@ -161,18 +161,6 @@ OPTIONS
 
                 $ mkfs.btrfs -O list-all
 
--R|--runtime-features <feature1>[,<feature2>...]
-        A list of features that be can enabled at mkfs time, otherwise would have
-        to be turned on on a mounted filesystem.
-        To disable a feature, prefix it with *^*.
-
-        See section *RUNTIME FEATURES* for more details.  To see all available
-        runtime features that **mkfs.btrfs** supports run:
-
-        .. code-block:: bash
-
-                $ mkfs.btrfs -R list-all
-
 -f|--force
         Forcibly overwrite the block devices when an existing filesystem is detected.
         By default, **mkfs.btrfs** will utilize *libblkid* to check for any known
@@ -199,6 +187,10 @@ OPTIONS
 -l|--leafsize <size>
         Removed in 6.0, used to be alias for *--nodesize*.
 
+-R|--runtime-features <feature1>[,<feature2>...]
+        Removed in 6.4, used to specify features not affecting on-disk format.
+        Now all such features are merged into `-O|--features` option.
+
 SIZE UNITS
 ----------
 
@@ -279,15 +271,6 @@ zoned
         see *ZONED MODE* in :doc:`btrfs(5)<btrfs-man5>`, the mode is automatically selected when
         a zoned device is detected
 
-
-RUNTIME FEATURES
-----------------
-
-Features that are typically enabled on a mounted filesystem, e.g. by a mount
-option or by an ioctl. Some of them can be enabled early, at mkfs time.  This
-applies to features that need to be enabled once and then the status is
-permanent, this does not replace mount options.
-
 quota
         (kernel support since 3.4)
 
diff --git a/common/fsfeatures.c b/common/fsfeatures.c
index 169e47e92582..4aca96f6e4fe 100644
--- a/common/fsfeatures.c
+++ b/common/fsfeatures.c
@@ -99,7 +99,6 @@ static const struct btrfs_feature mkfs_features[] = {
 		VERSION_NULL(default),
 		.desc		= "mixed data and metadata block groups"
 	},
-#if EXPERIMENTAL
 	{
 		.name		= "quota",
 		.runtime_flag	= BTRFS_FEATURE_RUNTIME_QUOTA,
@@ -109,7 +108,6 @@ static const struct btrfs_feature mkfs_features[] = {
 		VERSION_NULL(default),
 		.desc		= "quota support (qgroups)"
 	},
-#endif
 	{
 		.name		= "extref",
 		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF,
@@ -143,7 +141,6 @@ static const struct btrfs_feature mkfs_features[] = {
 		VERSION_TO_STRING2(default, 5,15),
 		.desc		= "no explicit hole extents for files"
 	},
-#if EXPERIMENTAL
 	{
 		.name		= "free-space-tree",
 		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |
@@ -154,7 +151,6 @@ static const struct btrfs_feature mkfs_features[] = {
 		VERSION_TO_STRING2(default, 5,15),
 		.desc		= "free space tree (space_cache=v2)"
 	},
-#endif
 	{
 		.name		= "raid1c34",
 		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_RAID1C34,
@@ -185,8 +181,6 @@ static const struct btrfs_feature mkfs_features[] = {
 		VERSION_NULL(default),
 		.desc		= "block group tree to reduce mount time"
 	},
-#endif
-#if EXPERIMENTAL
 	{
 		.name		= "extent-tree-v2",
 		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
diff --git a/mkfs/main.c b/mkfs/main.c
index f5e34cbda612..78cc2b598b25 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -424,7 +424,6 @@ static const char * const mkfs_usage[] = {
 	OPTLINE("-n|--nodesize SIZE", "size of btree nodes"),
 	OPTLINE("-s|--sectorsize SIZE", "data block size (may not be mountable by current kernel)"),
 	OPTLINE("-O|--features LIST", "comma separated list of filesystem features (use '-O list-all' to list features)"),
-	OPTLINE("-R|--runtime-features LIST", "comma separated list of runtime features (use '-R list-all' to list runtime features)"),
 	OPTLINE("-L|--label LABEL", "set the filesystem label"),
 	OPTLINE("-U|--uuid UUID", "specify the filesystem UUID (must be unique)"),
 	"Creation:",
@@ -440,6 +439,7 @@ static const char * const mkfs_usage[] = {
 	OPTLINE("--help", "print this help and exit"),
 	"Deprecated:",
 	OPTLINE("-l|--leafsize SIZE", "removed in 6.0, use --nodesize"),
+	OPTLINE("-R|--runtime-features LIST", "removed in 6.4, use -O|--features"),
 	NULL
 };
 
@@ -1140,6 +1140,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
 				char *orig = strdup(optarg);
 				char *tmp = orig;
 
+				warning("runtime features are deprecated, use -O|--features instead.");
 				tmp = btrfs_parse_runtime_features(tmp,
 						&features);
 				if (tmp) {
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-11  2:31 [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
  2023-04-11  2:31 ` [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated Qu Wenruo
@ 2023-04-11  2:31 ` Qu Wenruo
  2023-04-12  1:49   ` Neal Gompa
                     ` (2 more replies)
  2023-04-13 16:20 ` [PATCH 0/2] " David Sterba
  2 siblings, 3 replies; 17+ messages in thread
From: Qu Wenruo @ 2023-04-11  2:31 UTC (permalink / raw)
  To: linux-btrfs

The feedback from the community on block group tree is very positive,
the only complain is, end users need to recompile btrfs-progs with
experimental features to enjoy the new feature.

So let's move it out of experimental features and let more people enjoy
faster mount speed.

Also change the option of btrfstune, from `-b` to
`--enable-block-group-tree` to avoid short option.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 Documentation/btrfs-man5.rst |  6 ++++++
 Documentation/btrfstune.rst  |  4 ++--
 Documentation/mkfs.btrfs.rst |  5 +++++
 common/fsfeatures.c          |  4 +---
 tune/main.c                  | 18 ++++++++----------
 5 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/Documentation/btrfs-man5.rst b/Documentation/btrfs-man5.rst
index b50064fe9931..c625a9585457 100644
--- a/Documentation/btrfs-man5.rst
+++ b/Documentation/btrfs-man5.rst
@@ -66,6 +66,12 @@ big_metadata
         the filesystem uses *nodesize* for metadata blocks, this can be bigger than the
         page size
 
+block_group_tree
+        (since: 6.1)
+
+        block group item representation using a dedicated b-tree, this can greatly
+        reduce mount time for large filesystems.
+
 compress_lzo
         (since: 2.6.38)
 
diff --git a/Documentation/btrfstune.rst b/Documentation/btrfstune.rst
index f4400f1f527a..c84c1e7e7092 100644
--- a/Documentation/btrfstune.rst
+++ b/Documentation/btrfstune.rst
@@ -24,8 +24,8 @@ means.  Please refer to the *FILESYSTEM FEATURES* in :doc:`btrfs(5)<btrfs-man5>`
 OPTIONS
 -------
 
--b
-        (since kernel 6.1, needs experimental build of btrfs-progs)
+--enable-block-group-tree
+        (since kernel 6.1)
         Enable block group tree feature (greatly reduce mount time),
         enabled by mkfs feature *block-group-tree*.
 
diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
index e80f4c5c83ee..fe52f4406bf2 100644
--- a/Documentation/mkfs.btrfs.rst
+++ b/Documentation/mkfs.btrfs.rst
@@ -283,6 +283,11 @@ free-space-tree
         Enable the free space tree (mount option *space_cache=v2*) for persisting the
         free space cache.
 
+block-group-tree
+        (kernel support since 6.1)
+
+        Enable the block group tree to greatly reduce mount time for large filesystems.
+
 BLOCK GROUPS, CHUNKS, RAID
 --------------------------
 
diff --git a/common/fsfeatures.c b/common/fsfeatures.c
index 4aca96f6e4fe..50500c652265 100644
--- a/common/fsfeatures.c
+++ b/common/fsfeatures.c
@@ -171,7 +171,6 @@ static const struct btrfs_feature mkfs_features[] = {
 		.desc		= "support zoned devices"
 	},
 #endif
-#if EXPERIMENTAL
 	{
 		.name		= "block-group-tree",
 		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
@@ -181,6 +180,7 @@ static const struct btrfs_feature mkfs_features[] = {
 		VERSION_NULL(default),
 		.desc		= "block group tree to reduce mount time"
 	},
+#if EXPERIMENTAL
 	{
 		.name		= "extent-tree-v2",
 		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
@@ -222,7 +222,6 @@ static const struct btrfs_feature runtime_features[] = {
 		VERSION_TO_STRING2(default, 5,15),
 		.desc		= "free space tree (space_cache=v2)"
 	},
-#if EXPERIMENTAL
 	{
 		.name		= "block-group-tree",
 		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
@@ -232,7 +231,6 @@ static const struct btrfs_feature runtime_features[] = {
 		VERSION_NULL(default),
 		.desc		= "block group tree to reduce mount time"
 	},
-#endif
 	/* Keep this one last */
 	{
 		.name		= "list-all",
diff --git a/tune/main.c b/tune/main.c
index c5d2e37aef3d..f5a94cdbdb5f 100644
--- a/tune/main.c
+++ b/tune/main.c
@@ -70,6 +70,7 @@ static const char * const tune_usage[] = {
 	OPTLINE("-x", "enable skinny metadata extent refs (mkfs: skinny-metadata)"),
 	OPTLINE("-n", "enable no-holes feature (mkfs: no-holes, more efficient sparse file representation)"),
 	OPTLINE("-S <0|1>", "set/unset seeding status of a device"),
+	OPTLINE("--enable-block-group-tree", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
 	"",
 	"UUID changes:",
 	OPTLINE("-u", "rewrite fsid, use a random one"),
@@ -84,7 +85,6 @@ static const char * const tune_usage[] = {
 	"",
 	"EXPERIMENTAL FEATURES:",
 	OPTLINE("--csum CSUM", "switch checksum for data and metadata to CSUM"),
-	OPTLINE("-b", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
 #endif
 	NULL
 };
@@ -113,27 +113,22 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
 	btrfs_config_init();
 
 	while(1) {
-		enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST };
+		enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST,
+		       GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE };
 		static const struct option long_options[] = {
 			{ "help", no_argument, NULL, GETOPT_VAL_HELP},
+			{ "enable-block-group-tree", no_argument, NULL,
+				GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE},
 #if EXPERIMENTAL
 			{ "csum", required_argument, NULL, GETOPT_VAL_CSUM },
 #endif
 			{ NULL, 0, NULL, 0 }
 		};
-#if EXPERIMENTAL
-		int c = getopt_long(argc, argv, "S:rxfuU:nmM:b", long_options, NULL);
-#else
 		int c = getopt_long(argc, argv, "S:rxfuU:nmM:", long_options, NULL);
-#endif
 
 		if (c < 0)
 			break;
 		switch(c) {
-		case 'b':
-			btrfs_warn_experimental("Feature: conversion to block-group-tree");
-			to_bg_tree = true;
-			break;
 		case 'S':
 			seeding_flag = 1;
 			seeding_value = arg_strtou64(optarg);
@@ -167,6 +162,9 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
 			ctree_flags |= OPEN_CTREE_IGNORE_FSID_MISMATCH;
 			change_metadata_uuid = 1;
 			break;
+		case GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE:
+			to_bg_tree = true;
+			break;
 #if EXPERIMENTAL
 		case GETOPT_VAL_CSUM:
 			btrfs_warn_experimental(
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-11  2:31 ` [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
@ 2023-04-12  1:49   ` Neal Gompa
  2023-04-12  2:12     ` Qu Wenruo
  2023-04-13 12:24   ` Anand Jain
  2023-04-14  5:10   ` Anand Jain
  2 siblings, 1 reply; 17+ messages in thread
From: Neal Gompa @ 2023-04-12  1:49 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs

On Mon, Apr 10, 2023 at 10:37 PM Qu Wenruo <wqu@suse.com> wrote:
>
> The feedback from the community on block group tree is very positive,
> the only complain is, end users need to recompile btrfs-progs with
> experimental features to enjoy the new feature.
>
> So let's move it out of experimental features and let more people enjoy
> faster mount speed.
>
> Also change the option of btrfstune, from `-b` to
> `--enable-block-group-tree` to avoid short option.
>
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>  Documentation/btrfs-man5.rst |  6 ++++++
>  Documentation/btrfstune.rst  |  4 ++--
>  Documentation/mkfs.btrfs.rst |  5 +++++
>  common/fsfeatures.c          |  4 +---
>  tune/main.c                  | 18 ++++++++----------
>  5 files changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/Documentation/btrfs-man5.rst b/Documentation/btrfs-man5.rst
> index b50064fe9931..c625a9585457 100644
> --- a/Documentation/btrfs-man5.rst
> +++ b/Documentation/btrfs-man5.rst
> @@ -66,6 +66,12 @@ big_metadata
>          the filesystem uses *nodesize* for metadata blocks, this can be bigger than the
>          page size
>
> +block_group_tree
> +        (since: 6.1)
> +
> +        block group item representation using a dedicated b-tree, this can greatly
> +        reduce mount time for large filesystems.
> +
>  compress_lzo
>          (since: 2.6.38)
>
> diff --git a/Documentation/btrfstune.rst b/Documentation/btrfstune.rst
> index f4400f1f527a..c84c1e7e7092 100644
> --- a/Documentation/btrfstune.rst
> +++ b/Documentation/btrfstune.rst
> @@ -24,8 +24,8 @@ means.  Please refer to the *FILESYSTEM FEATURES* in :doc:`btrfs(5)<btrfs-man5>`
>  OPTIONS
>  -------
>
> --b
> -        (since kernel 6.1, needs experimental build of btrfs-progs)
> +--enable-block-group-tree
> +        (since kernel 6.1)
>          Enable block group tree feature (greatly reduce mount time),
>          enabled by mkfs feature *block-group-tree*.
>

I think it would make more sense to declare version 6.3 as the version
here, since it would effectively be the first version where it's not
experimental anymore.

> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
> index e80f4c5c83ee..fe52f4406bf2 100644
> --- a/Documentation/mkfs.btrfs.rst
> +++ b/Documentation/mkfs.btrfs.rst
> @@ -283,6 +283,11 @@ free-space-tree
>          Enable the free space tree (mount option *space_cache=v2*) for persisting the
>          free space cache.
>
> +block-group-tree
> +        (kernel support since 6.1)
> +
> +        Enable the block group tree to greatly reduce mount time for large filesystems.
> +

Ditto.

>  BLOCK GROUPS, CHUNKS, RAID
>  --------------------------
>
> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
> index 4aca96f6e4fe..50500c652265 100644
> --- a/common/fsfeatures.c
> +++ b/common/fsfeatures.c
> @@ -171,7 +171,6 @@ static const struct btrfs_feature mkfs_features[] = {
>                 .desc           = "support zoned devices"
>         },
>  #endif
> -#if EXPERIMENTAL
>         {
>                 .name           = "block-group-tree",
>                 .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
> @@ -181,6 +180,7 @@ static const struct btrfs_feature mkfs_features[] = {
>                 VERSION_NULL(default),
>                 .desc           = "block group tree to reduce mount time"
>         },
> +#if EXPERIMENTAL
>         {
>                 .name           = "extent-tree-v2",
>                 .incompat_flag  = BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
> @@ -222,7 +222,6 @@ static const struct btrfs_feature runtime_features[] = {
>                 VERSION_TO_STRING2(default, 5,15),
>                 .desc           = "free space tree (space_cache=v2)"
>         },
> -#if EXPERIMENTAL
>         {
>                 .name           = "block-group-tree",
>                 .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
> @@ -232,7 +231,6 @@ static const struct btrfs_feature runtime_features[] = {
>                 VERSION_NULL(default),
>                 .desc           = "block group tree to reduce mount time"
>         },
> -#endif
>         /* Keep this one last */
>         {
>                 .name           = "list-all",
> diff --git a/tune/main.c b/tune/main.c
> index c5d2e37aef3d..f5a94cdbdb5f 100644
> --- a/tune/main.c
> +++ b/tune/main.c
> @@ -70,6 +70,7 @@ static const char * const tune_usage[] = {
>         OPTLINE("-x", "enable skinny metadata extent refs (mkfs: skinny-metadata)"),
>         OPTLINE("-n", "enable no-holes feature (mkfs: no-holes, more efficient sparse file representation)"),
>         OPTLINE("-S <0|1>", "set/unset seeding status of a device"),
> +       OPTLINE("--enable-block-group-tree", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>         "",
>         "UUID changes:",
>         OPTLINE("-u", "rewrite fsid, use a random one"),
> @@ -84,7 +85,6 @@ static const char * const tune_usage[] = {
>         "",
>         "EXPERIMENTAL FEATURES:",
>         OPTLINE("--csum CSUM", "switch checksum for data and metadata to CSUM"),
> -       OPTLINE("-b", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>  #endif
>         NULL
>  };
> @@ -113,27 +113,22 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>         btrfs_config_init();
>
>         while(1) {
> -               enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST };
> +               enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST,
> +                      GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE };
>                 static const struct option long_options[] = {
>                         { "help", no_argument, NULL, GETOPT_VAL_HELP},
> +                       { "enable-block-group-tree", no_argument, NULL,
> +                               GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE},
>  #if EXPERIMENTAL
>                         { "csum", required_argument, NULL, GETOPT_VAL_CSUM },
>  #endif
>                         { NULL, 0, NULL, 0 }
>                 };
> -#if EXPERIMENTAL
> -               int c = getopt_long(argc, argv, "S:rxfuU:nmM:b", long_options, NULL);
> -#else
>                 int c = getopt_long(argc, argv, "S:rxfuU:nmM:", long_options, NULL);
> -#endif
>
>                 if (c < 0)
>                         break;
>                 switch(c) {
> -               case 'b':
> -                       btrfs_warn_experimental("Feature: conversion to block-group-tree");
> -                       to_bg_tree = true;
> -                       break;
>                 case 'S':
>                         seeding_flag = 1;
>                         seeding_value = arg_strtou64(optarg);
> @@ -167,6 +162,9 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>                         ctree_flags |= OPEN_CTREE_IGNORE_FSID_MISMATCH;
>                         change_metadata_uuid = 1;
>                         break;
> +               case GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE:
> +                       to_bg_tree = true;
> +                       break;
>  #if EXPERIMENTAL
>                 case GETOPT_VAL_CSUM:
>                         btrfs_warn_experimental(
> --
> 2.39.2
>


-- 
真実はいつも一つ!/ Always, there's only one truth!

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  2023-04-11  2:31 ` [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated Qu Wenruo
@ 2023-04-12  1:51   ` Neal Gompa
  2023-04-12  2:15     ` Qu Wenruo
  2023-04-13 12:04   ` Anand Jain
  1 sibling, 1 reply; 17+ messages in thread
From: Neal Gompa @ 2023-04-12  1:51 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs

On Mon, Apr 10, 2023 at 10:42 PM Qu Wenruo <wqu@suse.com> wrote:
>
> The option -R|--runtime-features is introduced to support features that
> doesn't result a full incompat flag change, thus things like
> free-space-tree and quota features are put here.
>
> But to end users, such separation of features is not helpful and can be
> sometimes confusing.
>
> Thus we're already migrating those runtime features into -O|--features
> option under experimental builds.
>
> I believe this is the proper time to move those runtime features into
> -O|--features option, and mark the -R|--runtime-features option
> deprecated.
>
> For now we still keep the old option as for compatibility purposes.
>
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>  Documentation/mkfs.btrfs.rst | 25 ++++---------------------
>  common/fsfeatures.c          |  6 ------
>  mkfs/main.c                  |  3 ++-
>  3 files changed, 6 insertions(+), 28 deletions(-)
>
> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
> index ba7227b31f72..e80f4c5c83ee 100644
> --- a/Documentation/mkfs.btrfs.rst
> +++ b/Documentation/mkfs.btrfs.rst
> @@ -161,18 +161,6 @@ OPTIONS
>
>                  $ mkfs.btrfs -O list-all
>
> --R|--runtime-features <feature1>[,<feature2>...]
> -        A list of features that be can enabled at mkfs time, otherwise would have
> -        to be turned on on a mounted filesystem.
> -        To disable a feature, prefix it with *^*.
> -
> -        See section *RUNTIME FEATURES* for more details.  To see all available
> -        runtime features that **mkfs.btrfs** supports run:
> -
> -        .. code-block:: bash
> -
> -                $ mkfs.btrfs -R list-all
> -
>  -f|--force
>          Forcibly overwrite the block devices when an existing filesystem is detected.
>          By default, **mkfs.btrfs** will utilize *libblkid* to check for any known
> @@ -199,6 +187,10 @@ OPTIONS
>  -l|--leafsize <size>
>          Removed in 6.0, used to be alias for *--nodesize*.
>
> +-R|--runtime-features <feature1>[,<feature2>...]
> +        Removed in 6.4, used to specify features not affecting on-disk format.
> +        Now all such features are merged into `-O|--features` option.
> +
>  SIZE UNITS
>  ----------
>
> @@ -279,15 +271,6 @@ zoned
>          see *ZONED MODE* in :doc:`btrfs(5)<btrfs-man5>`, the mode is automatically selected when
>          a zoned device is detected
>
> -
> -RUNTIME FEATURES
> -----------------
> -
> -Features that are typically enabled on a mounted filesystem, e.g. by a mount
> -option or by an ioctl. Some of them can be enabled early, at mkfs time.  This
> -applies to features that need to be enabled once and then the status is
> -permanent, this does not replace mount options.
> -
>  quota
>          (kernel support since 3.4)
>
> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
> index 169e47e92582..4aca96f6e4fe 100644
> --- a/common/fsfeatures.c
> +++ b/common/fsfeatures.c
> @@ -99,7 +99,6 @@ static const struct btrfs_feature mkfs_features[] = {
>                 VERSION_NULL(default),
>                 .desc           = "mixed data and metadata block groups"
>         },
> -#if EXPERIMENTAL
>         {
>                 .name           = "quota",
>                 .runtime_flag   = BTRFS_FEATURE_RUNTIME_QUOTA,
> @@ -109,7 +108,6 @@ static const struct btrfs_feature mkfs_features[] = {
>                 VERSION_NULL(default),
>                 .desc           = "quota support (qgroups)"
>         },
> -#endif
>         {
>                 .name           = "extref",
>                 .incompat_flag  = BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF,
> @@ -143,7 +141,6 @@ static const struct btrfs_feature mkfs_features[] = {
>                 VERSION_TO_STRING2(default, 5,15),
>                 .desc           = "no explicit hole extents for files"
>         },
> -#if EXPERIMENTAL
>         {
>                 .name           = "free-space-tree",
>                 .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |
> @@ -154,7 +151,6 @@ static const struct btrfs_feature mkfs_features[] = {
>                 VERSION_TO_STRING2(default, 5,15),
>                 .desc           = "free space tree (space_cache=v2)"
>         },
> -#endif
>         {
>                 .name           = "raid1c34",
>                 .incompat_flag  = BTRFS_FEATURE_INCOMPAT_RAID1C34,
> @@ -185,8 +181,6 @@ static const struct btrfs_feature mkfs_features[] = {
>                 VERSION_NULL(default),
>                 .desc           = "block group tree to reduce mount time"
>         },
> -#endif
> -#if EXPERIMENTAL
>         {
>                 .name           = "extent-tree-v2",
>                 .incompat_flag  = BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,

Shouldn't the removal of the EXPERIMENTAL tags be a separate commit?
It seems unrelated and the commit message doesn't say anything about
this.

> diff --git a/mkfs/main.c b/mkfs/main.c
> index f5e34cbda612..78cc2b598b25 100644
> --- a/mkfs/main.c
> +++ b/mkfs/main.c
> @@ -424,7 +424,6 @@ static const char * const mkfs_usage[] = {
>         OPTLINE("-n|--nodesize SIZE", "size of btree nodes"),
>         OPTLINE("-s|--sectorsize SIZE", "data block size (may not be mountable by current kernel)"),
>         OPTLINE("-O|--features LIST", "comma separated list of filesystem features (use '-O list-all' to list features)"),
> -       OPTLINE("-R|--runtime-features LIST", "comma separated list of runtime features (use '-R list-all' to list runtime features)"),
>         OPTLINE("-L|--label LABEL", "set the filesystem label"),
>         OPTLINE("-U|--uuid UUID", "specify the filesystem UUID (must be unique)"),
>         "Creation:",
> @@ -440,6 +439,7 @@ static const char * const mkfs_usage[] = {
>         OPTLINE("--help", "print this help and exit"),
>         "Deprecated:",
>         OPTLINE("-l|--leafsize SIZE", "removed in 6.0, use --nodesize"),
> +       OPTLINE("-R|--runtime-features LIST", "removed in 6.4, use -O|--features"),
>         NULL
>  };
>
> @@ -1140,6 +1140,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
>                                 char *orig = strdup(optarg);
>                                 char *tmp = orig;
>
> +                               warning("runtime features are deprecated, use -O|--features instead.");
>                                 tmp = btrfs_parse_runtime_features(tmp,
>                                                 &features);
>                                 if (tmp) {
> --
> 2.39.2
>


-- 
真実はいつも一つ!/ Always, there's only one truth!

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-12  1:49   ` Neal Gompa
@ 2023-04-12  2:12     ` Qu Wenruo
  0 siblings, 0 replies; 17+ messages in thread
From: Qu Wenruo @ 2023-04-12  2:12 UTC (permalink / raw)
  To: Neal Gompa, Qu Wenruo; +Cc: linux-btrfs



On 2023/4/12 09:49, Neal Gompa wrote:
> On Mon, Apr 10, 2023 at 10:37 PM Qu Wenruo <wqu@suse.com> wrote:
>>
>> The feedback from the community on block group tree is very positive,
>> the only complain is, end users need to recompile btrfs-progs with
>> experimental features to enjoy the new feature.
>>
>> So let's move it out of experimental features and let more people enjoy
>> faster mount speed.
>>
>> Also change the option of btrfstune, from `-b` to
>> `--enable-block-group-tree` to avoid short option.
>>
>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>> ---
>>   Documentation/btrfs-man5.rst |  6 ++++++
>>   Documentation/btrfstune.rst  |  4 ++--
>>   Documentation/mkfs.btrfs.rst |  5 +++++
>>   common/fsfeatures.c          |  4 +---
>>   tune/main.c                  | 18 ++++++++----------
>>   5 files changed, 22 insertions(+), 15 deletions(-)
>>
>> diff --git a/Documentation/btrfs-man5.rst b/Documentation/btrfs-man5.rst
>> index b50064fe9931..c625a9585457 100644
>> --- a/Documentation/btrfs-man5.rst
>> +++ b/Documentation/btrfs-man5.rst
>> @@ -66,6 +66,12 @@ big_metadata
>>           the filesystem uses *nodesize* for metadata blocks, this can be bigger than the
>>           page size
>>
>> +block_group_tree
>> +        (since: 6.1)
>> +
>> +        block group item representation using a dedicated b-tree, this can greatly
>> +        reduce mount time for large filesystems.
>> +
>>   compress_lzo
>>           (since: 2.6.38)
>>
>> diff --git a/Documentation/btrfstune.rst b/Documentation/btrfstune.rst
>> index f4400f1f527a..c84c1e7e7092 100644
>> --- a/Documentation/btrfstune.rst
>> +++ b/Documentation/btrfstune.rst
>> @@ -24,8 +24,8 @@ means.  Please refer to the *FILESYSTEM FEATURES* in :doc:`btrfs(5)<btrfs-man5>`
>>   OPTIONS
>>   -------
>>
>> --b
>> -        (since kernel 6.1, needs experimental build of btrfs-progs)
>> +--enable-block-group-tree
>> +        (since kernel 6.1)
>>           Enable block group tree feature (greatly reduce mount time),
>>           enabled by mkfs feature *block-group-tree*.
>>
> 
> I think it would make more sense to declare version 6.3 as the version
> here, since it would effectively be the first version where it's not
> experimental anymore.

Here we're talking about kernel support, which is indeed 6.1.

For progs, it's much simpler, if it's not documented in man page, then 
it's not supported, thus we don't really bother mentioning the prog version.

Thanks,
Qu
> 
>> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
>> index e80f4c5c83ee..fe52f4406bf2 100644
>> --- a/Documentation/mkfs.btrfs.rst
>> +++ b/Documentation/mkfs.btrfs.rst
>> @@ -283,6 +283,11 @@ free-space-tree
>>           Enable the free space tree (mount option *space_cache=v2*) for persisting the
>>           free space cache.
>>
>> +block-group-tree
>> +        (kernel support since 6.1)
>> +
>> +        Enable the block group tree to greatly reduce mount time for large filesystems.
>> +
> 
> Ditto.
> 
>>   BLOCK GROUPS, CHUNKS, RAID
>>   --------------------------
>>
>> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
>> index 4aca96f6e4fe..50500c652265 100644
>> --- a/common/fsfeatures.c
>> +++ b/common/fsfeatures.c
>> @@ -171,7 +171,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  .desc           = "support zoned devices"
>>          },
>>   #endif
>> -#if EXPERIMENTAL
>>          {
>>                  .name           = "block-group-tree",
>>                  .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
>> @@ -181,6 +180,7 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  VERSION_NULL(default),
>>                  .desc           = "block group tree to reduce mount time"
>>          },
>> +#if EXPERIMENTAL
>>          {
>>                  .name           = "extent-tree-v2",
>>                  .incompat_flag  = BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
>> @@ -222,7 +222,6 @@ static const struct btrfs_feature runtime_features[] = {
>>                  VERSION_TO_STRING2(default, 5,15),
>>                  .desc           = "free space tree (space_cache=v2)"
>>          },
>> -#if EXPERIMENTAL
>>          {
>>                  .name           = "block-group-tree",
>>                  .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
>> @@ -232,7 +231,6 @@ static const struct btrfs_feature runtime_features[] = {
>>                  VERSION_NULL(default),
>>                  .desc           = "block group tree to reduce mount time"
>>          },
>> -#endif
>>          /* Keep this one last */
>>          {
>>                  .name           = "list-all",
>> diff --git a/tune/main.c b/tune/main.c
>> index c5d2e37aef3d..f5a94cdbdb5f 100644
>> --- a/tune/main.c
>> +++ b/tune/main.c
>> @@ -70,6 +70,7 @@ static const char * const tune_usage[] = {
>>          OPTLINE("-x", "enable skinny metadata extent refs (mkfs: skinny-metadata)"),
>>          OPTLINE("-n", "enable no-holes feature (mkfs: no-holes, more efficient sparse file representation)"),
>>          OPTLINE("-S <0|1>", "set/unset seeding status of a device"),
>> +       OPTLINE("--enable-block-group-tree", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>>          "",
>>          "UUID changes:",
>>          OPTLINE("-u", "rewrite fsid, use a random one"),
>> @@ -84,7 +85,6 @@ static const char * const tune_usage[] = {
>>          "",
>>          "EXPERIMENTAL FEATURES:",
>>          OPTLINE("--csum CSUM", "switch checksum for data and metadata to CSUM"),
>> -       OPTLINE("-b", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>>   #endif
>>          NULL
>>   };
>> @@ -113,27 +113,22 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>>          btrfs_config_init();
>>
>>          while(1) {
>> -               enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST };
>> +               enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST,
>> +                      GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE };
>>                  static const struct option long_options[] = {
>>                          { "help", no_argument, NULL, GETOPT_VAL_HELP},
>> +                       { "enable-block-group-tree", no_argument, NULL,
>> +                               GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE},
>>   #if EXPERIMENTAL
>>                          { "csum", required_argument, NULL, GETOPT_VAL_CSUM },
>>   #endif
>>                          { NULL, 0, NULL, 0 }
>>                  };
>> -#if EXPERIMENTAL
>> -               int c = getopt_long(argc, argv, "S:rxfuU:nmM:b", long_options, NULL);
>> -#else
>>                  int c = getopt_long(argc, argv, "S:rxfuU:nmM:", long_options, NULL);
>> -#endif
>>
>>                  if (c < 0)
>>                          break;
>>                  switch(c) {
>> -               case 'b':
>> -                       btrfs_warn_experimental("Feature: conversion to block-group-tree");
>> -                       to_bg_tree = true;
>> -                       break;
>>                  case 'S':
>>                          seeding_flag = 1;
>>                          seeding_value = arg_strtou64(optarg);
>> @@ -167,6 +162,9 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>>                          ctree_flags |= OPEN_CTREE_IGNORE_FSID_MISMATCH;
>>                          change_metadata_uuid = 1;
>>                          break;
>> +               case GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE:
>> +                       to_bg_tree = true;
>> +                       break;
>>   #if EXPERIMENTAL
>>                  case GETOPT_VAL_CSUM:
>>                          btrfs_warn_experimental(
>> --
>> 2.39.2
>>
> 
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  2023-04-12  1:51   ` Neal Gompa
@ 2023-04-12  2:15     ` Qu Wenruo
  0 siblings, 0 replies; 17+ messages in thread
From: Qu Wenruo @ 2023-04-12  2:15 UTC (permalink / raw)
  To: Neal Gompa, Qu Wenruo; +Cc: linux-btrfs



On 2023/4/12 09:51, Neal Gompa wrote:
> On Mon, Apr 10, 2023 at 10:42 PM Qu Wenruo <wqu@suse.com> wrote:
>>
>> The option -R|--runtime-features is introduced to support features that
>> doesn't result a full incompat flag change, thus things like
>> free-space-tree and quota features are put here.
>>
>> But to end users, such separation of features is not helpful and can be
>> sometimes confusing.
>>
>> Thus we're already migrating those runtime features into -O|--features
>> option under experimental builds.
>>
>> I believe this is the proper time to move those runtime features into
>> -O|--features option, and mark the -R|--runtime-features option
>> deprecated.
>>
>> For now we still keep the old option as for compatibility purposes.
>>
>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>> ---
>>   Documentation/mkfs.btrfs.rst | 25 ++++---------------------
>>   common/fsfeatures.c          |  6 ------
>>   mkfs/main.c                  |  3 ++-
>>   3 files changed, 6 insertions(+), 28 deletions(-)
>>
>> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
>> index ba7227b31f72..e80f4c5c83ee 100644
>> --- a/Documentation/mkfs.btrfs.rst
>> +++ b/Documentation/mkfs.btrfs.rst
>> @@ -161,18 +161,6 @@ OPTIONS
>>
>>                   $ mkfs.btrfs -O list-all
>>
>> --R|--runtime-features <feature1>[,<feature2>...]
>> -        A list of features that be can enabled at mkfs time, otherwise would have
>> -        to be turned on on a mounted filesystem.
>> -        To disable a feature, prefix it with *^*.
>> -
>> -        See section *RUNTIME FEATURES* for more details.  To see all available
>> -        runtime features that **mkfs.btrfs** supports run:
>> -
>> -        .. code-block:: bash
>> -
>> -                $ mkfs.btrfs -R list-all
>> -
>>   -f|--force
>>           Forcibly overwrite the block devices when an existing filesystem is detected.
>>           By default, **mkfs.btrfs** will utilize *libblkid* to check for any known
>> @@ -199,6 +187,10 @@ OPTIONS
>>   -l|--leafsize <size>
>>           Removed in 6.0, used to be alias for *--nodesize*.
>>
>> +-R|--runtime-features <feature1>[,<feature2>...]
>> +        Removed in 6.4, used to specify features not affecting on-disk format.
>> +        Now all such features are merged into `-O|--features` option.
>> +
>>   SIZE UNITS
>>   ----------
>>
>> @@ -279,15 +271,6 @@ zoned
>>           see *ZONED MODE* in :doc:`btrfs(5)<btrfs-man5>`, the mode is automatically selected when
>>           a zoned device is detected
>>
>> -
>> -RUNTIME FEATURES
>> -----------------
>> -
>> -Features that are typically enabled on a mounted filesystem, e.g. by a mount
>> -option or by an ioctl. Some of them can be enabled early, at mkfs time.  This
>> -applies to features that need to be enabled once and then the status is
>> -permanent, this does not replace mount options.
>> -
>>   quota
>>           (kernel support since 3.4)
>>
>> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
>> index 169e47e92582..4aca96f6e4fe 100644
>> --- a/common/fsfeatures.c
>> +++ b/common/fsfeatures.c
>> @@ -99,7 +99,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  VERSION_NULL(default),
>>                  .desc           = "mixed data and metadata block groups"
>>          },
>> -#if EXPERIMENTAL
>>          {
>>                  .name           = "quota",
>>                  .runtime_flag   = BTRFS_FEATURE_RUNTIME_QUOTA,
>> @@ -109,7 +108,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  VERSION_NULL(default),
>>                  .desc           = "quota support (qgroups)"
>>          },
>> -#endif
>>          {
>>                  .name           = "extref",
>>                  .incompat_flag  = BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF,
>> @@ -143,7 +141,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  VERSION_TO_STRING2(default, 5,15),
>>                  .desc           = "no explicit hole extents for files"
>>          },
>> -#if EXPERIMENTAL
>>          {
>>                  .name           = "free-space-tree",
>>                  .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |
>> @@ -154,7 +151,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  VERSION_TO_STRING2(default, 5,15),
>>                  .desc           = "free space tree (space_cache=v2)"
>>          },
>> -#endif
>>          {
>>                  .name           = "raid1c34",
>>                  .incompat_flag  = BTRFS_FEATURE_INCOMPAT_RAID1C34,
>> @@ -185,8 +181,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>                  VERSION_NULL(default),
>>                  .desc           = "block group tree to reduce mount time"
>>          },
>> -#endif
>> -#if EXPERIMENTAL
>>          {
>>                  .name           = "extent-tree-v2",
>>                  .incompat_flag  = BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
> 
> Shouldn't the removal of the EXPERIMENTAL tags be a separate commit?
> It seems unrelated and the commit message doesn't say anything about
> this.

Nope, this is just how the diff tool determine where the changes are.

The end result of that patch still keeps the extent-tree-v2 feature 
under experimental, it's covered by the same EXPERIMENTAL ifdef of 
block-group-tree.

Thus sometimes it's better to use difftool to review patches, as we can 
hit cases like this from time to time.

Thanks,
Qu
> 
>> diff --git a/mkfs/main.c b/mkfs/main.c
>> index f5e34cbda612..78cc2b598b25 100644
>> --- a/mkfs/main.c
>> +++ b/mkfs/main.c
>> @@ -424,7 +424,6 @@ static const char * const mkfs_usage[] = {
>>          OPTLINE("-n|--nodesize SIZE", "size of btree nodes"),
>>          OPTLINE("-s|--sectorsize SIZE", "data block size (may not be mountable by current kernel)"),
>>          OPTLINE("-O|--features LIST", "comma separated list of filesystem features (use '-O list-all' to list features)"),
>> -       OPTLINE("-R|--runtime-features LIST", "comma separated list of runtime features (use '-R list-all' to list runtime features)"),
>>          OPTLINE("-L|--label LABEL", "set the filesystem label"),
>>          OPTLINE("-U|--uuid UUID", "specify the filesystem UUID (must be unique)"),
>>          "Creation:",
>> @@ -440,6 +439,7 @@ static const char * const mkfs_usage[] = {
>>          OPTLINE("--help", "print this help and exit"),
>>          "Deprecated:",
>>          OPTLINE("-l|--leafsize SIZE", "removed in 6.0, use --nodesize"),
>> +       OPTLINE("-R|--runtime-features LIST", "removed in 6.4, use -O|--features"),
>>          NULL
>>   };
>>
>> @@ -1140,6 +1140,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
>>                                  char *orig = strdup(optarg);
>>                                  char *tmp = orig;
>>
>> +                               warning("runtime features are deprecated, use -O|--features instead.");
>>                                  tmp = btrfs_parse_runtime_features(tmp,
>>                                                  &features);
>>                                  if (tmp) {
>> --
>> 2.39.2
>>
> 
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  2023-04-11  2:31 ` [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated Qu Wenruo
  2023-04-12  1:51   ` Neal Gompa
@ 2023-04-13 12:04   ` Anand Jain
  2023-04-13 16:32     ` David Sterba
  1 sibling, 1 reply; 17+ messages in thread
From: Anand Jain @ 2023-04-13 12:04 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

On 4/11/23 08:01, Qu Wenruo wrote:
> The option -R|--runtime-features is introduced to support features that
> doesn't result a full incompat flag change, thus things like
> free-space-tree and quota features are put here.
> 
> But to end users, such separation of features is not helpful and can be

> sometimes confusing.

Indeed.

More below.


> 
> Thus we're already migrating those runtime features into -O|--features
> option under experimental builds.
> 
> I believe this is the proper time to move those runtime features into
> -O|--features option, and mark the -R|--runtime-features option
> deprecated.
> 
> For now we still keep the old option as for compatibility purposes.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>   Documentation/mkfs.btrfs.rst | 25 ++++---------------------
>   common/fsfeatures.c          |  6 ------
>   mkfs/main.c                  |  3 ++-
>   3 files changed, 6 insertions(+), 28 deletions(-)
> 
> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
> index ba7227b31f72..e80f4c5c83ee 100644
> --- a/Documentation/mkfs.btrfs.rst
> +++ b/Documentation/mkfs.btrfs.rst
> @@ -161,18 +161,6 @@ OPTIONS
>   
>                   $ mkfs.btrfs -O list-all
>   
> --R|--runtime-features <feature1>[,<feature2>...]
> -        A list of features that be can enabled at mkfs time,


> otherwise would have
> -        to be turned on on a mounted filesystem.

  --R option is useful, why not consider rename?

Such as:
  --mount-with

Thanks, Anand


> -        To disable a feature, prefix it with *^*.
> -
> -        See section *RUNTIME FEATURES* for more details.  To see all available
> -        runtime features that **mkfs.btrfs** supports run:
> -
> -        .. code-block:: bash
> -
> -                $ mkfs.btrfs -R list-all
> -
>   -f|--force
>           Forcibly overwrite the block devices when an existing filesystem is detected.
>           By default, **mkfs.btrfs** will utilize *libblkid* to check for any known
> @@ -199,6 +187,10 @@ OPTIONS
>   -l|--leafsize <size>
>           Removed in 6.0, used to be alias for *--nodesize*.
>   
> +-R|--runtime-features <feature1>[,<feature2>...]
> +        Removed in 6.4, used to specify features not affecting on-disk format.
> +        Now all such features are merged into `-O|--features` option.
> +
>   SIZE UNITS
>   ----------
>   
> @@ -279,15 +271,6 @@ zoned
>           see *ZONED MODE* in :doc:`btrfs(5)<btrfs-man5>`, the mode is automatically selected when
>           a zoned device is detected
>   
> -
> -RUNTIME FEATURES
> -----------------
> -
> -Features that are typically enabled on a mounted filesystem, e.g. by a mount
> -option or by an ioctl. Some of them can be enabled early, at mkfs time.  This
> -applies to features that need to be enabled once and then the status is
> -permanent, this does not replace mount options.
> -
>   quota
>           (kernel support since 3.4)
>   
> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
> index 169e47e92582..4aca96f6e4fe 100644
> --- a/common/fsfeatures.c
> +++ b/common/fsfeatures.c
> @@ -99,7 +99,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "mixed data and metadata block groups"
>   	},
> -#if EXPERIMENTAL
>   	{
>   		.name		= "quota",
>   		.runtime_flag	= BTRFS_FEATURE_RUNTIME_QUOTA,
> @@ -109,7 +108,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "quota support (qgroups)"
>   	},
> -#endif
>   	{
>   		.name		= "extref",
>   		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF,
> @@ -143,7 +141,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_TO_STRING2(default, 5,15),
>   		.desc		= "no explicit hole extents for files"
>   	},
> -#if EXPERIMENTAL
>   	{
>   		.name		= "free-space-tree",
>   		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |
> @@ -154,7 +151,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_TO_STRING2(default, 5,15),
>   		.desc		= "free space tree (space_cache=v2)"
>   	},
> -#endif
>   	{
>   		.name		= "raid1c34",
>   		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_RAID1C34,
> @@ -185,8 +181,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "block group tree to reduce mount time"
>   	},
> -#endif
> -#if EXPERIMENTAL
>   	{
>   		.name		= "extent-tree-v2",
>   		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
> diff --git a/mkfs/main.c b/mkfs/main.c
> index f5e34cbda612..78cc2b598b25 100644
> --- a/mkfs/main.c
> +++ b/mkfs/main.c
> @@ -424,7 +424,6 @@ static const char * const mkfs_usage[] = {
>   	OPTLINE("-n|--nodesize SIZE", "size of btree nodes"),
>   	OPTLINE("-s|--sectorsize SIZE", "data block size (may not be mountable by current kernel)"),
>   	OPTLINE("-O|--features LIST", "comma separated list of filesystem features (use '-O list-all' to list features)"),
> -	OPTLINE("-R|--runtime-features LIST", "comma separated list of runtime features (use '-R list-all' to list runtime features)"),
>   	OPTLINE("-L|--label LABEL", "set the filesystem label"),
>   	OPTLINE("-U|--uuid UUID", "specify the filesystem UUID (must be unique)"),
>   	"Creation:",
> @@ -440,6 +439,7 @@ static const char * const mkfs_usage[] = {
>   	OPTLINE("--help", "print this help and exit"),
>   	"Deprecated:",
>   	OPTLINE("-l|--leafsize SIZE", "removed in 6.0, use --nodesize"),
> +	OPTLINE("-R|--runtime-features LIST", "removed in 6.4, use -O|--features"),
>   	NULL
>   };
>   
> @@ -1140,6 +1140,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
>   				char *orig = strdup(optarg);
>   				char *tmp = orig;
>   
> +				warning("runtime features are deprecated, use -O|--features instead.");
>   				tmp = btrfs_parse_runtime_features(tmp,
>   						&features);
>   				if (tmp) {


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-11  2:31 ` [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
  2023-04-12  1:49   ` Neal Gompa
@ 2023-04-13 12:24   ` Anand Jain
  2023-04-13 16:38     ` David Sterba
  2023-04-13 22:53     ` Qu Wenruo
  2023-04-14  5:10   ` Anand Jain
  2 siblings, 2 replies; 17+ messages in thread
From: Anand Jain @ 2023-04-13 12:24 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

On 4/11/23 08:01, Qu Wenruo wrote:
> The feedback from the community on block group tree is very positive,
> the only complain is, end users need to recompile btrfs-progs with
> experimental features to enjoy the new feature.
> 
> So let's move it out of experimental features and let more people enjoy
> faster mount speed.
> 


> Also change the option of btrfstune, from `-b` to
> `--enable-block-group-tree` to avoid short option.

What is the tradeoff for the desktop use case (lets say 1TB disksize)
if the block-group-tree is made the default option? And add btrfstune
--disable-bg instead.

Thanks, Anand


> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>   Documentation/btrfs-man5.rst |  6 ++++++
>   Documentation/btrfstune.rst  |  4 ++--
>   Documentation/mkfs.btrfs.rst |  5 +++++
>   common/fsfeatures.c          |  4 +---
>   tune/main.c                  | 18 ++++++++----------
>   5 files changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/Documentation/btrfs-man5.rst b/Documentation/btrfs-man5.rst
> index b50064fe9931..c625a9585457 100644
> --- a/Documentation/btrfs-man5.rst
> +++ b/Documentation/btrfs-man5.rst
> @@ -66,6 +66,12 @@ big_metadata
>           the filesystem uses *nodesize* for metadata blocks, this can be bigger than the
>           page size
>   
> +block_group_tree
> +        (since: 6.1)
> +
> +        block group item representation using a dedicated b-tree, this can greatly
> +        reduce mount time for large filesystems.
> +
>   compress_lzo
>           (since: 2.6.38)
>   
> diff --git a/Documentation/btrfstune.rst b/Documentation/btrfstune.rst
> index f4400f1f527a..c84c1e7e7092 100644
> --- a/Documentation/btrfstune.rst
> +++ b/Documentation/btrfstune.rst
> @@ -24,8 +24,8 @@ means.  Please refer to the *FILESYSTEM FEATURES* in :doc:`btrfs(5)<btrfs-man5>`
>   OPTIONS
>   -------
>   
> --b
> -        (since kernel 6.1, needs experimental build of btrfs-progs)
> +--enable-block-group-tree
> +        (since kernel 6.1)
>           Enable block group tree feature (greatly reduce mount time),
>           enabled by mkfs feature *block-group-tree*.
>   
> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
> index e80f4c5c83ee..fe52f4406bf2 100644
> --- a/Documentation/mkfs.btrfs.rst
> +++ b/Documentation/mkfs.btrfs.rst
> @@ -283,6 +283,11 @@ free-space-tree
>           Enable the free space tree (mount option *space_cache=v2*) for persisting the
>           free space cache.
>   
> +block-group-tree
> +        (kernel support since 6.1)
> +
> +        Enable the block group tree to greatly reduce mount time for large filesystems.
> +
>   BLOCK GROUPS, CHUNKS, RAID
>   --------------------------
>   
> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
> index 4aca96f6e4fe..50500c652265 100644
> --- a/common/fsfeatures.c
> +++ b/common/fsfeatures.c
> @@ -171,7 +171,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		.desc		= "support zoned devices"
>   	},
>   #endif
> -#if EXPERIMENTAL
>   	{
>   		.name		= "block-group-tree",
>   		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
> @@ -181,6 +180,7 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "block group tree to reduce mount time"
>   	},
> +#if EXPERIMENTAL
>   	{
>   		.name		= "extent-tree-v2",
>   		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
> @@ -222,7 +222,6 @@ static const struct btrfs_feature runtime_features[] = {
>   		VERSION_TO_STRING2(default, 5,15),
>   		.desc		= "free space tree (space_cache=v2)"
>   	},
> -#if EXPERIMENTAL
>   	{
>   		.name		= "block-group-tree",
>   		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
> @@ -232,7 +231,6 @@ static const struct btrfs_feature runtime_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "block group tree to reduce mount time"
>   	},
> -#endif
>   	/* Keep this one last */
>   	{
>   		.name		= "list-all",
> diff --git a/tune/main.c b/tune/main.c
> index c5d2e37aef3d..f5a94cdbdb5f 100644
> --- a/tune/main.c
> +++ b/tune/main.c
> @@ -70,6 +70,7 @@ static const char * const tune_usage[] = {
>   	OPTLINE("-x", "enable skinny metadata extent refs (mkfs: skinny-metadata)"),
>   	OPTLINE("-n", "enable no-holes feature (mkfs: no-holes, more efficient sparse file representation)"),
>   	OPTLINE("-S <0|1>", "set/unset seeding status of a device"),
> +	OPTLINE("--enable-block-group-tree", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>   	"",
>   	"UUID changes:",
>   	OPTLINE("-u", "rewrite fsid, use a random one"),
> @@ -84,7 +85,6 @@ static const char * const tune_usage[] = {
>   	"",
>   	"EXPERIMENTAL FEATURES:",
>   	OPTLINE("--csum CSUM", "switch checksum for data and metadata to CSUM"),
> -	OPTLINE("-b", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>   #endif
>   	NULL
>   };
> @@ -113,27 +113,22 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>   	btrfs_config_init();
>   
>   	while(1) {
> -		enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST };
> +		enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST,
> +		       GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE };
>   		static const struct option long_options[] = {
>   			{ "help", no_argument, NULL, GETOPT_VAL_HELP},
> +			{ "enable-block-group-tree", no_argument, NULL,
> +				GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE},
>   #if EXPERIMENTAL
>   			{ "csum", required_argument, NULL, GETOPT_VAL_CSUM },
>   #endif
>   			{ NULL, 0, NULL, 0 }
>   		};
> -#if EXPERIMENTAL
> -		int c = getopt_long(argc, argv, "S:rxfuU:nmM:b", long_options, NULL);
> -#else
>   		int c = getopt_long(argc, argv, "S:rxfuU:nmM:", long_options, NULL);
> -#endif
>   
>   		if (c < 0)
>   			break;
>   		switch(c) {
> -		case 'b':
> -			btrfs_warn_experimental("Feature: conversion to block-group-tree");
> -			to_bg_tree = true;
> -			break;
>   		case 'S':
>   			seeding_flag = 1;
>   			seeding_value = arg_strtou64(optarg);
> @@ -167,6 +162,9 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>   			ctree_flags |= OPEN_CTREE_IGNORE_FSID_MISMATCH;
>   			change_metadata_uuid = 1;
>   			break;
> +		case GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE:
> +			to_bg_tree = true;
> +			break;
>   #if EXPERIMENTAL
>   		case GETOPT_VAL_CSUM:
>   			btrfs_warn_experimental(


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-11  2:31 [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
  2023-04-11  2:31 ` [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated Qu Wenruo
  2023-04-11  2:31 ` [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
@ 2023-04-13 16:20 ` David Sterba
  2023-04-13 22:55   ` Qu Wenruo
  2 siblings, 1 reply; 17+ messages in thread
From: David Sterba @ 2023-04-13 16:20 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs

On Tue, Apr 11, 2023 at 10:31:04AM +0800, Qu Wenruo wrote:
> People are complaining block-group-tree features are not accessible for
> non-experimental builds.
> 
> So let's make it a stable feature.
> 
> Since we're here, it's also a good time to deprecate
> -R|--runtime-features option.

As a major release is near it's a good time to do such changes. Merging
-R back to -O is OK. I looked again how robust the conversion to bgt is
wrt to a crash in the middle. If the process is restarted it should be
fine, though I'm not sure what happens when the fs would be mounted and
written to with the ongoing conversion.

We don't have any test coverage of the feature, at least what is
possible from user space. Mount and other things need kernel 6.1 which
is not in CI.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  2023-04-13 12:04   ` Anand Jain
@ 2023-04-13 16:32     ` David Sterba
  2023-04-14  5:07       ` Anand Jain
  0 siblings, 1 reply; 17+ messages in thread
From: David Sterba @ 2023-04-13 16:32 UTC (permalink / raw)
  To: Anand Jain; +Cc: Qu Wenruo, linux-btrfs

On Thu, Apr 13, 2023 at 05:34:31PM +0530, Anand Jain wrote:
> On 4/11/23 08:01, Qu Wenruo wrote:
> > deprecated.
> > 
> > For now we still keep the old option as for compatibility purposes.
> > 
> > Signed-off-by: Qu Wenruo <wqu@suse.com>
> > ---
> >   Documentation/mkfs.btrfs.rst | 25 ++++---------------------
> >   common/fsfeatures.c          |  6 ------
> >   mkfs/main.c                  |  3 ++-
> >   3 files changed, 6 insertions(+), 28 deletions(-)
> > 
> > diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
> > index ba7227b31f72..e80f4c5c83ee 100644
> > --- a/Documentation/mkfs.btrfs.rst
> > +++ b/Documentation/mkfs.btrfs.rst
> > @@ -161,18 +161,6 @@ OPTIONS
> >   
> >                   $ mkfs.btrfs -O list-all
> >   
> > --R|--runtime-features <feature1>[,<feature2>...]
> > -        A list of features that be can enabled at mkfs time,
> 
> 
> > otherwise would have
> > -        to be turned on on a mounted filesystem.
> 
>   --R option is useful, why not consider rename?

For what use case is it useful? The reason it's getting dropped is
because from user perspective it's not that important what kind of
feature is it and it gets enabled from one place. It was my idea to have
two options because other mkfs utilities have that, but with a different
semantics than mkfs-time/mount-time, rather per object type (inode,
journal, ...), and it turned out to be wrong.

> Such as:
>   --mount-with

In the context of mkfs I'd find such option very confusing especially
when there's no mount option like that.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-13 12:24   ` Anand Jain
@ 2023-04-13 16:38     ` David Sterba
  2023-04-13 22:53     ` Qu Wenruo
  1 sibling, 0 replies; 17+ messages in thread
From: David Sterba @ 2023-04-13 16:38 UTC (permalink / raw)
  To: Anand Jain; +Cc: Qu Wenruo, linux-btrfs

On Thu, Apr 13, 2023 at 05:54:01PM +0530, Anand Jain wrote:
> On 4/11/23 08:01, Qu Wenruo wrote:
> > The feedback from the community on block group tree is very positive,
> > the only complain is, end users need to recompile btrfs-progs with
> > experimental features to enjoy the new feature.
> > 
> > So let's move it out of experimental features and let more people enjoy
> > faster mount speed.
> > 
> 
> 
> > Also change the option of btrfstune, from `-b` to
> > `--enable-block-group-tree` to avoid short option.
> 
> What is the tradeoff for the desktop use case (lets say 1TB disksize)
> if the block-group-tree is made the default option? And add btrfstune
> --disable-bg instead.

On a 1TB disk the difference is probably not that big, the long mount
times were reported on larger filesystems and bgt is advertisied as
help on many-terabyte filesystems. It's a vague statement because we
don't know the exact value but from 4T on it would probably make more
sense.

Another thing, block-group-tree is not going to be default yet, it's
being moved from experimental features, i.e. generally available by
default. When we're going to make it default is not known yet.

Conversion from bgt to extent tree is something I asked for but it's not
a priority in case bgt is not default so we don't have --disable-bg.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-13 12:24   ` Anand Jain
  2023-04-13 16:38     ` David Sterba
@ 2023-04-13 22:53     ` Qu Wenruo
  1 sibling, 0 replies; 17+ messages in thread
From: Qu Wenruo @ 2023-04-13 22:53 UTC (permalink / raw)
  To: Anand Jain, Qu Wenruo, linux-btrfs



On 2023/4/13 20:24, Anand Jain wrote:
> On 4/11/23 08:01, Qu Wenruo wrote:
>> The feedback from the community on block group tree is very positive,
>> the only complain is, end users need to recompile btrfs-progs with
>> experimental features to enjoy the new feature.
>>
>> So let's move it out of experimental features and let more people enjoy
>> faster mount speed.
>>
> 
> 
>> Also change the option of btrfstune, from `-b` to
>> `--enable-block-group-tree` to avoid short option.
> 
> What is the tradeoff for the desktop use case (lets say 1TB disksize)
> if the block-group-tree is made the default option? And add btrfstune
> --disable-bg instead.

No tradeoff except compatibility I can tell.

For --disable-bg, as far as I know everyone going bg tree is happy, thus 
never considered going back.

Furthermore, since it's compat_ro, older kernel can still mount with 
rescue=all to read out the data.

Thanks,
Qu

> 
> Thanks, Anand
> 
> 
>>
>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>> ---
>>   Documentation/btrfs-man5.rst |  6 ++++++
>>   Documentation/btrfstune.rst  |  4 ++--
>>   Documentation/mkfs.btrfs.rst |  5 +++++
>>   common/fsfeatures.c          |  4 +---
>>   tune/main.c                  | 18 ++++++++----------
>>   5 files changed, 22 insertions(+), 15 deletions(-)
>>
>> diff --git a/Documentation/btrfs-man5.rst b/Documentation/btrfs-man5.rst
>> index b50064fe9931..c625a9585457 100644
>> --- a/Documentation/btrfs-man5.rst
>> +++ b/Documentation/btrfs-man5.rst
>> @@ -66,6 +66,12 @@ big_metadata
>>           the filesystem uses *nodesize* for metadata blocks, this can 
>> be bigger than the
>>           page size
>> +block_group_tree
>> +        (since: 6.1)
>> +
>> +        block group item representation using a dedicated b-tree, 
>> this can greatly
>> +        reduce mount time for large filesystems.
>> +
>>   compress_lzo
>>           (since: 2.6.38)
>> diff --git a/Documentation/btrfstune.rst b/Documentation/btrfstune.rst
>> index f4400f1f527a..c84c1e7e7092 100644
>> --- a/Documentation/btrfstune.rst
>> +++ b/Documentation/btrfstune.rst
>> @@ -24,8 +24,8 @@ means.  Please refer to the *FILESYSTEM FEATURES* in 
>> :doc:`btrfs(5)<btrfs-man5>`
>>   OPTIONS
>>   -------
>> --b
>> -        (since kernel 6.1, needs experimental build of btrfs-progs)
>> +--enable-block-group-tree
>> +        (since kernel 6.1)
>>           Enable block group tree feature (greatly reduce mount time),
>>           enabled by mkfs feature *block-group-tree*.
>> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
>> index e80f4c5c83ee..fe52f4406bf2 100644
>> --- a/Documentation/mkfs.btrfs.rst
>> +++ b/Documentation/mkfs.btrfs.rst
>> @@ -283,6 +283,11 @@ free-space-tree
>>           Enable the free space tree (mount option *space_cache=v2*) 
>> for persisting the
>>           free space cache.
>> +block-group-tree
>> +        (kernel support since 6.1)
>> +
>> +        Enable the block group tree to greatly reduce mount time for 
>> large filesystems.
>> +
>>   BLOCK GROUPS, CHUNKS, RAID
>>   --------------------------
>> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
>> index 4aca96f6e4fe..50500c652265 100644
>> --- a/common/fsfeatures.c
>> +++ b/common/fsfeatures.c
>> @@ -171,7 +171,6 @@ static const struct btrfs_feature mkfs_features[] = {
>>           .desc        = "support zoned devices"
>>       },
>>   #endif
>> -#if EXPERIMENTAL
>>       {
>>           .name        = "block-group-tree",
>>           .compat_ro_flag    = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
>> @@ -181,6 +180,7 @@ static const struct btrfs_feature mkfs_features[] = {
>>           VERSION_NULL(default),
>>           .desc        = "block group tree to reduce mount time"
>>       },
>> +#if EXPERIMENTAL
>>       {
>>           .name        = "extent-tree-v2",
>>           .incompat_flag    = BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
>> @@ -222,7 +222,6 @@ static const struct btrfs_feature 
>> runtime_features[] = {
>>           VERSION_TO_STRING2(default, 5,15),
>>           .desc        = "free space tree (space_cache=v2)"
>>       },
>> -#if EXPERIMENTAL
>>       {
>>           .name        = "block-group-tree",
>>           .compat_ro_flag    = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
>> @@ -232,7 +231,6 @@ static const struct btrfs_feature 
>> runtime_features[] = {
>>           VERSION_NULL(default),
>>           .desc        = "block group tree to reduce mount time"
>>       },
>> -#endif
>>       /* Keep this one last */
>>       {
>>           .name        = "list-all",
>> diff --git a/tune/main.c b/tune/main.c
>> index c5d2e37aef3d..f5a94cdbdb5f 100644
>> --- a/tune/main.c
>> +++ b/tune/main.c
>> @@ -70,6 +70,7 @@ static const char * const tune_usage[] = {
>>       OPTLINE("-x", "enable skinny metadata extent refs (mkfs: 
>> skinny-metadata)"),
>>       OPTLINE("-n", "enable no-holes feature (mkfs: no-holes, more 
>> efficient sparse file representation)"),
>>       OPTLINE("-S <0|1>", "set/unset seeding status of a device"),
>> +    OPTLINE("--enable-block-group-tree", "enable block group tree 
>> (mkfs: block-group-tree, for less mount time)"),
>>       "",
>>       "UUID changes:",
>>       OPTLINE("-u", "rewrite fsid, use a random one"),
>> @@ -84,7 +85,6 @@ static const char * const tune_usage[] = {
>>       "",
>>       "EXPERIMENTAL FEATURES:",
>>       OPTLINE("--csum CSUM", "switch checksum for data and metadata to 
>> CSUM"),
>> -    OPTLINE("-b", "enable block group tree (mkfs: block-group-tree, 
>> for less mount time)"),
>>   #endif
>>       NULL
>>   };
>> @@ -113,27 +113,22 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>>       btrfs_config_init();
>>       while(1) {
>> -        enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST };
>> +        enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST,
>> +               GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE };
>>           static const struct option long_options[] = {
>>               { "help", no_argument, NULL, GETOPT_VAL_HELP},
>> +            { "enable-block-group-tree", no_argument, NULL,
>> +                GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE},
>>   #if EXPERIMENTAL
>>               { "csum", required_argument, NULL, GETOPT_VAL_CSUM },
>>   #endif
>>               { NULL, 0, NULL, 0 }
>>           };
>> -#if EXPERIMENTAL
>> -        int c = getopt_long(argc, argv, "S:rxfuU:nmM:b", 
>> long_options, NULL);
>> -#else
>>           int c = getopt_long(argc, argv, "S:rxfuU:nmM:", 
>> long_options, NULL);
>> -#endif
>>           if (c < 0)
>>               break;
>>           switch(c) {
>> -        case 'b':
>> -            btrfs_warn_experimental("Feature: conversion to 
>> block-group-tree");
>> -            to_bg_tree = true;
>> -            break;
>>           case 'S':
>>               seeding_flag = 1;
>>               seeding_value = arg_strtou64(optarg);
>> @@ -167,6 +162,9 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>>               ctree_flags |= OPEN_CTREE_IGNORE_FSID_MISMATCH;
>>               change_metadata_uuid = 1;
>>               break;
>> +        case GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE:
>> +            to_bg_tree = true;
>> +            break;
>>   #if EXPERIMENTAL
>>           case GETOPT_VAL_CSUM:
>>               btrfs_warn_experimental(
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-13 16:20 ` [PATCH 0/2] " David Sterba
@ 2023-04-13 22:55   ` Qu Wenruo
  2023-04-13 23:25     ` David Sterba
  0 siblings, 1 reply; 17+ messages in thread
From: Qu Wenruo @ 2023-04-13 22:55 UTC (permalink / raw)
  To: dsterba, Qu Wenruo; +Cc: linux-btrfs



On 2023/4/14 00:20, David Sterba wrote:
> On Tue, Apr 11, 2023 at 10:31:04AM +0800, Qu Wenruo wrote:
>> People are complaining block-group-tree features are not accessible for
>> non-experimental builds.
>>
>> So let's make it a stable feature.
>>
>> Since we're here, it's also a good time to deprecate
>> -R|--runtime-features option.
> 
> As a major release is near it's a good time to do such changes. Merging
> -R back to -O is OK. I looked again how robust the conversion to bgt is
> wrt to a crash in the middle. If the process is restarted it should be
> fine, though I'm not sure what happens when the fs would be mounted and
> written to with the ongoing conversion.

It would be rejected by kernel, as I intentionally introduced a super 
flag which kernel is not aware of (SUPER_FLAG_CHANGING_BG_TREE).

> 
> We don't have any test coverage of the feature, at least what is
> possible from user space. Mount and other things need kernel 6.1 which
> is not in CI.

Yeah, that's one of the problem unfortunately.

Thanks,
Qu

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-13 22:55   ` Qu Wenruo
@ 2023-04-13 23:25     ` David Sterba
  0 siblings, 0 replies; 17+ messages in thread
From: David Sterba @ 2023-04-13 23:25 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: dsterba, Qu Wenruo, linux-btrfs

On Fri, Apr 14, 2023 at 06:55:36AM +0800, Qu Wenruo wrote:
> 
> 
> On 2023/4/14 00:20, David Sterba wrote:
> > On Tue, Apr 11, 2023 at 10:31:04AM +0800, Qu Wenruo wrote:
> >> People are complaining block-group-tree features are not accessible for
> >> non-experimental builds.
> >>
> >> So let's make it a stable feature.
> >>
> >> Since we're here, it's also a good time to deprecate
> >> -R|--runtime-features option.
> > 
> > As a major release is near it's a good time to do such changes. Merging
> > -R back to -O is OK. I looked again how robust the conversion to bgt is
> > wrt to a crash in the middle. If the process is restarted it should be
> > fine, though I'm not sure what happens when the fs would be mounted and
> > written to with the ongoing conversion.
> 
> It would be rejected by kernel, as I intentionally introduced a super 
> flag which kernel is not aware of (SUPER_FLAG_CHANGING_BG_TREE).

Ah right, all the CHANGING bits are automatically rejected, we don't
need to define them in kernel.

> > We don't have any test coverage of the feature, at least what is
> > possible from user space. Mount and other things need kernel 6.1 which
> > is not in CI.
> 
> Yeah, that's one of the problem unfortunately.

I'm revisiting all tests due to the changes in CI, for example the
defaults from 5.15 are not reflected in mkfs tests so I'm going to
update that and will add the block-group-tree tests too.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated
  2023-04-13 16:32     ` David Sterba
@ 2023-04-14  5:07       ` Anand Jain
  0 siblings, 0 replies; 17+ messages in thread
From: Anand Jain @ 2023-04-14  5:07 UTC (permalink / raw)
  To: dsterba; +Cc: Qu Wenruo, linux-btrfs



On 14/4/23 00:32, David Sterba wrote:
> On Thu, Apr 13, 2023 at 05:34:31PM +0530, Anand Jain wrote:
>> On 4/11/23 08:01, Qu Wenruo wrote:
>>> deprecated.
>>>
>>> For now we still keep the old option as for compatibility purposes.
>>>
>>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>>> ---
>>>    Documentation/mkfs.btrfs.rst | 25 ++++---------------------
>>>    common/fsfeatures.c          |  6 ------
>>>    mkfs/main.c                  |  3 ++-
>>>    3 files changed, 6 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
>>> index ba7227b31f72..e80f4c5c83ee 100644
>>> --- a/Documentation/mkfs.btrfs.rst
>>> +++ b/Documentation/mkfs.btrfs.rst
>>> @@ -161,18 +161,6 @@ OPTIONS
>>>    
>>>                    $ mkfs.btrfs -O list-all
>>>    
>>> --R|--runtime-features <feature1>[,<feature2>...]
>>> -        A list of features that be can enabled at mkfs time,
>>
>>
>>> otherwise would have
>>> -        to be turned on on a mounted filesystem.
>>
>>    --R option is useful, why not consider rename?
> 
> For what use case is it useful? The reason it's getting dropped is
> because from user perspective it's not that important what kind of
> feature is it and it gets enabled from one place. It was my idea to have
> two options because other mkfs utilities have that, but with a different
> semantics than mkfs-time/mount-time, rather per object type (inode,
> journal, ...), and it turned out to be wrong.
> 
>> Such as:
>>    --mount-with
> 
> In the context of mkfs I'd find such option very confusing especially
> when there's no mount option like that.

Okay.

Reviewed-by: Anand Jain <anand.jain@oracle.com>



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features
  2023-04-11  2:31 ` [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
  2023-04-12  1:49   ` Neal Gompa
  2023-04-13 12:24   ` Anand Jain
@ 2023-04-14  5:10   ` Anand Jain
  2 siblings, 0 replies; 17+ messages in thread
From: Anand Jain @ 2023-04-14  5:10 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

On 11/4/23 10:31, Qu Wenruo wrote:
> The feedback from the community on block group tree is very positive,
> the only complain is, end users need to recompile btrfs-progs with
> experimental features to enjoy the new feature.
> 
> So let's move it out of experimental features and let more people enjoy
> faster mount speed.
> 
> Also change the option of btrfstune, from `-b` to
> `--enable-block-group-tree` to avoid short option.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>

Reviewed-by: Anand Jain <anand.jain@oracle.com>

Thanks, Anand

> ---
>   Documentation/btrfs-man5.rst |  6 ++++++
>   Documentation/btrfstune.rst  |  4 ++--
>   Documentation/mkfs.btrfs.rst |  5 +++++
>   common/fsfeatures.c          |  4 +---
>   tune/main.c                  | 18 ++++++++----------
>   5 files changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/Documentation/btrfs-man5.rst b/Documentation/btrfs-man5.rst
> index b50064fe9931..c625a9585457 100644
> --- a/Documentation/btrfs-man5.rst
> +++ b/Documentation/btrfs-man5.rst
> @@ -66,6 +66,12 @@ big_metadata
>           the filesystem uses *nodesize* for metadata blocks, this can be bigger than the
>           page size
>   
> +block_group_tree
> +        (since: 6.1)
> +
> +        block group item representation using a dedicated b-tree, this can greatly
> +        reduce mount time for large filesystems.
> +
>   compress_lzo
>           (since: 2.6.38)
>   
> diff --git a/Documentation/btrfstune.rst b/Documentation/btrfstune.rst
> index f4400f1f527a..c84c1e7e7092 100644
> --- a/Documentation/btrfstune.rst
> +++ b/Documentation/btrfstune.rst
> @@ -24,8 +24,8 @@ means.  Please refer to the *FILESYSTEM FEATURES* in :doc:`btrfs(5)<btrfs-man5>`
>   OPTIONS
>   -------
>   
> --b
> -        (since kernel 6.1, needs experimental build of btrfs-progs)
> +--enable-block-group-tree
> +        (since kernel 6.1)
>           Enable block group tree feature (greatly reduce mount time),
>           enabled by mkfs feature *block-group-tree*.
>   
> diff --git a/Documentation/mkfs.btrfs.rst b/Documentation/mkfs.btrfs.rst
> index e80f4c5c83ee..fe52f4406bf2 100644
> --- a/Documentation/mkfs.btrfs.rst
> +++ b/Documentation/mkfs.btrfs.rst
> @@ -283,6 +283,11 @@ free-space-tree
>           Enable the free space tree (mount option *space_cache=v2*) for persisting the
>           free space cache.
>   
> +block-group-tree
> +        (kernel support since 6.1)
> +
> +        Enable the block group tree to greatly reduce mount time for large filesystems.
> +
>   BLOCK GROUPS, CHUNKS, RAID
>   --------------------------
>   
> diff --git a/common/fsfeatures.c b/common/fsfeatures.c
> index 4aca96f6e4fe..50500c652265 100644
> --- a/common/fsfeatures.c
> +++ b/common/fsfeatures.c
> @@ -171,7 +171,6 @@ static const struct btrfs_feature mkfs_features[] = {
>   		.desc		= "support zoned devices"
>   	},
>   #endif
> -#if EXPERIMENTAL
>   	{
>   		.name		= "block-group-tree",
>   		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
> @@ -181,6 +180,7 @@ static const struct btrfs_feature mkfs_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "block group tree to reduce mount time"
>   	},
> +#if EXPERIMENTAL
>   	{
>   		.name		= "extent-tree-v2",
>   		.incompat_flag	= BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2,
> @@ -222,7 +222,6 @@ static const struct btrfs_feature runtime_features[] = {
>   		VERSION_TO_STRING2(default, 5,15),
>   		.desc		= "free space tree (space_cache=v2)"
>   	},
> -#if EXPERIMENTAL
>   	{
>   		.name		= "block-group-tree",
>   		.compat_ro_flag	= BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE,
> @@ -232,7 +231,6 @@ static const struct btrfs_feature runtime_features[] = {
>   		VERSION_NULL(default),
>   		.desc		= "block group tree to reduce mount time"
>   	},
> -#endif
>   	/* Keep this one last */
>   	{
>   		.name		= "list-all",
> diff --git a/tune/main.c b/tune/main.c
> index c5d2e37aef3d..f5a94cdbdb5f 100644
> --- a/tune/main.c
> +++ b/tune/main.c
> @@ -70,6 +70,7 @@ static const char * const tune_usage[] = {
>   	OPTLINE("-x", "enable skinny metadata extent refs (mkfs: skinny-metadata)"),
>   	OPTLINE("-n", "enable no-holes feature (mkfs: no-holes, more efficient sparse file representation)"),
>   	OPTLINE("-S <0|1>", "set/unset seeding status of a device"),
> +	OPTLINE("--enable-block-group-tree", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>   	"",
>   	"UUID changes:",
>   	OPTLINE("-u", "rewrite fsid, use a random one"),
> @@ -84,7 +85,6 @@ static const char * const tune_usage[] = {
>   	"",
>   	"EXPERIMENTAL FEATURES:",
>   	OPTLINE("--csum CSUM", "switch checksum for data and metadata to CSUM"),
> -	OPTLINE("-b", "enable block group tree (mkfs: block-group-tree, for less mount time)"),
>   #endif
>   	NULL
>   };
> @@ -113,27 +113,22 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>   	btrfs_config_init();
>   
>   	while(1) {
> -		enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST };
> +		enum { GETOPT_VAL_CSUM = GETOPT_VAL_FIRST,
> +		       GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE };
>   		static const struct option long_options[] = {
>   			{ "help", no_argument, NULL, GETOPT_VAL_HELP},
> +			{ "enable-block-group-tree", no_argument, NULL,
> +				GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE},
>   #if EXPERIMENTAL
>   			{ "csum", required_argument, NULL, GETOPT_VAL_CSUM },
>   #endif
>   			{ NULL, 0, NULL, 0 }
>   		};
> -#if EXPERIMENTAL
> -		int c = getopt_long(argc, argv, "S:rxfuU:nmM:b", long_options, NULL);
> -#else
>   		int c = getopt_long(argc, argv, "S:rxfuU:nmM:", long_options, NULL);
> -#endif
>   
>   		if (c < 0)
>   			break;
>   		switch(c) {
> -		case 'b':
> -			btrfs_warn_experimental("Feature: conversion to block-group-tree");
> -			to_bg_tree = true;
> -			break;
>   		case 'S':
>   			seeding_flag = 1;
>   			seeding_value = arg_strtou64(optarg);
> @@ -167,6 +162,9 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>   			ctree_flags |= OPEN_CTREE_IGNORE_FSID_MISMATCH;
>   			change_metadata_uuid = 1;
>   			break;
> +		case GETOPT_VAL_ENABLE_BLOCK_GROUP_TREE:
> +			to_bg_tree = true;
> +			break;
>   #if EXPERIMENTAL
>   		case GETOPT_VAL_CSUM:
>   			btrfs_warn_experimental(


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2023-04-14  5:17 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-11  2:31 [PATCH 0/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
2023-04-11  2:31 ` [PATCH 1/2] btrfs-progs: mkfs: make -R|--runtime-features option deprecated Qu Wenruo
2023-04-12  1:51   ` Neal Gompa
2023-04-12  2:15     ` Qu Wenruo
2023-04-13 12:04   ` Anand Jain
2023-04-13 16:32     ` David Sterba
2023-04-14  5:07       ` Anand Jain
2023-04-11  2:31 ` [PATCH 2/2] btrfs-progs: move block-group-tree out of experimental features Qu Wenruo
2023-04-12  1:49   ` Neal Gompa
2023-04-12  2:12     ` Qu Wenruo
2023-04-13 12:24   ` Anand Jain
2023-04-13 16:38     ` David Sterba
2023-04-13 22:53     ` Qu Wenruo
2023-04-14  5:10   ` Anand Jain
2023-04-13 16:20 ` [PATCH 0/2] " David Sterba
2023-04-13 22:55   ` Qu Wenruo
2023-04-13 23:25     ` David Sterba

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).