From patchwork Tue Sep 5 07:51:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374605 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3AF70C83F2C for ; Tue, 5 Sep 2023 16:03:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236619AbjIEQDR (ORCPT ); Tue, 5 Sep 2023 12:03:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57288 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353746AbjIEHwP (ORCPT ); Tue, 5 Sep 2023 03:52:15 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 16A13CCF for ; Tue, 5 Sep 2023 00:52:11 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id C03001F750 for ; Tue, 5 Sep 2023 07:52:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900329; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/K3fjCK5yXwCzIcV3hKbGtJiEHVdWbw1QKWgVF8Mqpw=; b=RXa2HGbj+ZWIaTfuCqaJZaVW03/Wo0zr7AI12AEa9b4bCurcHne4X3axXlNftTl2FBeybE PuEzXTkKdgj47VHIDdGr9ZltsP8eczUawjbo8Z7IXeFv5sKVFiq9ywAcJNEySeKH7HVOF6 NU7sKt4MLXf6V66gJ8/todgO7h7mo3E= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 140E713911 for ; Tue, 5 Sep 2023 07:52:08 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 6KusMije9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:08 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 1/7] btrfs-progs: export btrfs_feature structure Date: Tue, 5 Sep 2023 15:51:43 +0800 Message-ID: <512e1bb1572d5ffc3557a86a4ce3860420352214.1693900169.git.wqu@suse.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org For the incoming "btrfs tune" subcommand, we will have different features supported by that subcommand. Instead of bloating the runtime and mkfs features, here we just export btrfs_feature, so each subcommand can have their own definition of supported features. And since we're here, also add needed headers for future users of "fsfeatures.h". Signed-off-by: Qu Wenruo --- common/fsfeatures.c | 53 --------------------------------------------- common/fsfeatures.h | 50 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 53 deletions(-) diff --git a/common/fsfeatures.c b/common/fsfeatures.c index 9ee392d3a8a6..f8eeea7695c1 100644 --- a/common/fsfeatures.c +++ b/common/fsfeatures.c @@ -32,64 +32,11 @@ #include "common/sysfs-utils.h" #include "common/messages.h" -/* - * Insert a root item for temporary tree root - * - * Only used in make_btrfs_v2(). - */ -#define VERSION_TO_STRING3(name, a,b,c) \ - .name ## _str = #a "." #b "." #c, \ - .name ## _ver = KERNEL_VERSION(a,b,c) -#define VERSION_TO_STRING2(name, a,b) \ - .name ## _str = #a "." #b, \ - .name ## _ver = KERNEL_VERSION(a,b,0) -#define VERSION_NULL(name) \ - .name ## _str = NULL, \ - .name ## _ver = 0 - enum feature_source { FS_FEATURES, RUNTIME_FEATURES, }; -/* - * Feature stability status and versions: compat <= safe <= default - */ -struct btrfs_feature { - const char *name; - - /* - * At least one of the bit must be set in the following *_flag member. - * - * For features like list-all and quota which don't have any - * incompat/compat_ro bit set, it go to runtime_flag. - */ - u64 incompat_flag; - u64 compat_ro_flag; - u64 runtime_flag; - - const char *sysfs_name; - /* - * Compatibility with kernel of given version. Filesystem can be - * mounted. - */ - const char *compat_str; - u32 compat_ver; - /* - * Considered safe for use, but is not on by default, even if the - * kernel supports the feature. - */ - const char *safe_str; - u32 safe_ver; - /* - * Considered safe for use and will be turned on by default if - * supported by the running kernel. - */ - const char *default_str; - u32 default_ver; - const char *desc; -}; - static const struct btrfs_feature mkfs_features[] = { { .name = "mixed-bg", diff --git a/common/fsfeatures.h b/common/fsfeatures.h index c4ab704862cd..c9fb489d2d79 100644 --- a/common/fsfeatures.h +++ b/common/fsfeatures.h @@ -19,7 +19,9 @@ #include "kerncompat.h" #include +#include #include "kernel-lib/sizes.h" +#include "kernel-shared/uapi/btrfs.h" #define BTRFS_MKFS_DEFAULT_NODE_SIZE SZ_16K @@ -43,6 +45,54 @@ struct btrfs_mkfs_features { */ #define BTRFS_FEATURE_STRING_BUF_SIZE (160) +#define VERSION_TO_STRING3(name, a,b,c) \ + .name ## _str = #a "." #b "." #c, \ + .name ## _ver = KERNEL_VERSION(a,b,c) +#define VERSION_TO_STRING2(name, a,b) \ + .name ## _str = #a "." #b, \ + .name ## _ver = KERNEL_VERSION(a,b,0) +#define VERSION_NULL(name) \ + .name ## _str = NULL, \ + .name ## _ver = 0 + +/* + * Feature stability status and versions: compat <= safe <= default + */ +struct btrfs_feature { + const char *name; + + /* + * At least one of the bit must be set in the following *_flag member. + * + * For features like list-all and quota which don't have any + * incompat/compat_ro bit set, it go to runtime_flag. + */ + u64 incompat_flag; + u64 compat_ro_flag; + u64 runtime_flag; + + const char *sysfs_name; + /* + * Compatibility with kernel of given version. Filesystem can be + * mounted. + */ + const char *compat_str; + u32 compat_ver; + /* + * Considered safe for use, but is not on by default, even if the + * kernel supports the feature. + */ + const char *safe_str; + u32 safe_ver; + /* + * Considered safe for use and will be turned on by default if + * supported by the running kernel. + */ + const char *default_str; + u32 default_ver; + const char *desc; +}; + static const struct btrfs_mkfs_features btrfs_mkfs_default_features = { .compat_ro_flags = BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE | BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID, From patchwork Tue Sep 5 07:51:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374610 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CA808CA0FFB for ; Tue, 5 Sep 2023 16:03:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236954AbjIEQDk (ORCPT ); Tue, 5 Sep 2023 12:03:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57294 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353747AbjIEHwQ (ORCPT ); Tue, 5 Sep 2023 03:52:16 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 274CACD2 for ; Tue, 5 Sep 2023 00:52:12 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id E084121832 for ; Tue, 5 Sep 2023 07:52:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900330; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sGb+raeZtxI4N5w3xxi6a4RHWlxDqp69uNMLWcchL30=; b=HMrPxud65983PtzLJ2uDOXiqZySi7e+8g4oHFRcqJ8V+wISy+DDBiCgloxvtLkB4stBkR1 ey6btCZNZrhhn9+YtD5pIbsVFBr8eLdf0jnex1spGjhu65Tr8Uew8hm2Sr6xPVxi0Jr2wp sJst3AuI/hr8KT5u5+T2TJ4G1lOOR+4= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 3681D13911 for ; Tue, 5 Sep 2023 07:52:09 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 0D9fOyne9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:09 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 2/7] btrfs-progs: cmds: add "btrfs tune set" subcommand group Date: Tue, 5 Sep 2023 15:51:44 +0800 Message-ID: <1c294f739f028da499cf7f57deb334f419979097.1693900169.git.wqu@suse.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org As the first step to convert btrfstune into "btrfs tune" subcommand group, this patch would add the following subcommand group: btrfs tune set [] For now the following features are supported: - extref - skinny-metadata - no-holes All those are simple super block flags toggle. - list-all This acts the same way as "mkfs.btrfs -O list-all", the difference is it would only list the supported features. (In the future, there will be "btrfs tune clear" subcommand, which would support a different set of features). Signed-off-by: Qu Wenruo --- Documentation/btrfs-tune.rst | 40 ++++++ Documentation/btrfs.rst | 5 + Documentation/conf.py | 1 + Documentation/man-index.rst | 1 + Makefile | 2 +- btrfs.c | 1 + cmds/commands.h | 1 + cmds/tune.c | 227 +++++++++++++++++++++++++++++++++++ 8 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 Documentation/btrfs-tune.rst create mode 100644 cmds/tune.c diff --git a/Documentation/btrfs-tune.rst b/Documentation/btrfs-tune.rst new file mode 100644 index 000000000000..827c92eadb72 --- /dev/null +++ b/Documentation/btrfs-tune.rst @@ -0,0 +1,40 @@ +btrfs-tune(8) +================== + +SYNOPSIS +-------- + +**btrfs tune** [] + +DESCRIPTION +----------- + +:command:`btrfs tune` is used to tweak various btrfs features on a +unmounted filesystem. + +SUBCOMMAND +----------- + +set [] + Set/enable a feature. + + If *feature* is `list-all`, all supported features would be listed, and + no *device* parameter is needed. + +EXIT STATUS +----------- + +**btrfs tune** returns a zero exit status if it succeeds. A non-zero value is +returned in case of failure. + +AVAILABILITY +------------ + +**btrfs** is part of btrfs-progs. Please refer to the documentation at +`https://btrfs.readthedocs.io `_. + +SEE ALSO +-------- + +:doc:`mkfs.btrfs`, +``mount(8)`` diff --git a/Documentation/btrfs.rst b/Documentation/btrfs.rst index e878f158aaa1..5aea0d1a208c 100644 --- a/Documentation/btrfs.rst +++ b/Documentation/btrfs.rst @@ -134,6 +134,10 @@ subvolume Create/delete/list/manage btrfs subvolume. See :doc:`btrfs-subvolume` for details. +tune + Change various btrfs features. + See :doc:`btrfs-tune` for details. + .. _man-btrfs8-standalone-tools: STANDALONE TOOLS @@ -150,6 +154,7 @@ btrfs-convert in-place conversion from ext2/3/4 filesystems to btrfs btrfstune tweak some filesystem properties on a unmounted filesystem + (will be replaced by `btrfs-tune`) btrfs-select-super rescue tool to overwrite primary superblock from a spare copy btrfs-find-root diff --git a/Documentation/conf.py b/Documentation/conf.py index 1025e10d7206..e0801bca4686 100644 --- a/Documentation/conf.py +++ b/Documentation/conf.py @@ -66,6 +66,7 @@ man_pages = [ ('btrfs-check', 'btrfs-check', 'check or repair a btrfs filesystem', '', 8), ('btrfs-balance', 'btrfs-balance', 'balance block groups on a btrfs filesystem', '', 8), ('btrfs-subvolume', 'btrfs-subvolume', 'manage btrfs subvolumes', '', 8), + ('btrfs-tune', 'btrfs-tune', 'tweak btrfs features', '', 8), ('btrfs-map-logical', 'btrfs-map-logical', 'map btrfs logical extent to physical extent', '', 8), ('btrfs', 'btrfs', 'a toolbox to manage btrfs filesystems', '', 8), ('mkfs.btrfs', 'mkfs.btrfs', 'create a btrfs filesystem', '', 8), diff --git a/Documentation/man-index.rst b/Documentation/man-index.rst index 36d45d2903ea..5fcd4cbc4bee 100644 --- a/Documentation/man-index.rst +++ b/Documentation/man-index.rst @@ -28,6 +28,7 @@ Manual pages btrfs-select-super btrfs-send btrfs-subvolume + btrfs-tune btrfstune fsck.btrfs mkfs.btrfs diff --git a/Makefile b/Makefile index f4feb1fff8e1..9857daaa42ac 100644 --- a/Makefile +++ b/Makefile @@ -239,7 +239,7 @@ cmds_objects = cmds/subvolume.o cmds/subvolume-list.o \ cmds/rescue-super-recover.o \ cmds/property.o cmds/filesystem-usage.o cmds/inspect-dump-tree.o \ cmds/inspect-dump-super.o cmds/inspect-tree-stats.o cmds/filesystem-du.o \ - cmds/reflink.o \ + cmds/reflink.o cmds/tune.o \ mkfs/common.o check/mode-common.o check/mode-lowmem.o \ check/clear-cache.o diff --git a/btrfs.c b/btrfs.c index 751f193ee2e0..c2dae0303ffe 100644 --- a/btrfs.c +++ b/btrfs.c @@ -389,6 +389,7 @@ static const struct cmd_group btrfs_cmd_group = { &cmd_struct_scrub, &cmd_struct_send, &cmd_struct_subvolume, + &cmd_struct_tune, /* Help and version stay last */ &cmd_struct_help, diff --git a/cmds/commands.h b/cmds/commands.h index 5ab7c881f634..aebacd718a7b 100644 --- a/cmds/commands.h +++ b/cmds/commands.h @@ -151,5 +151,6 @@ DECLARE_COMMAND(qgroup); DECLARE_COMMAND(replace); DECLARE_COMMAND(restore); DECLARE_COMMAND(rescue); +DECLARE_COMMAND(tune); #endif diff --git a/cmds/tune.c b/cmds/tune.c new file mode 100644 index 000000000000..92c7b9f1502c --- /dev/null +++ b/cmds/tune.c @@ -0,0 +1,227 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +#include +#include "kerncompat.h" +#include "cmds/commands.h" +#include "common/help.h" +#include "common/fsfeatures.h" +#include "kernel-shared/messages.h" +#include "kernel-shared/disk-io.h" +#include "kernel-shared/transaction.h" + +static const char * const cmd_tune_set_usage[] = { + "btrfs tune set []", + "Set/enable specified feature for the unmounted filesystem", + "", + HELPINFO_INSERT_GLOBALS, + HELPINFO_INSERT_VERBOSE, + NULL, +}; + +static const struct btrfs_feature set_features[] = { + { + .name = "extref", + .incompat_flag = BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF, + .sysfs_name = "extended_iref", + VERSION_TO_STRING2(compat, 3,7), + VERSION_TO_STRING2(safe, 3,12), + VERSION_TO_STRING2(default, 3,12), + .desc = "increased hardlink limit per file to 65536" + }, { + .name = "skinny-metadata", + .incompat_flag = BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA, + .sysfs_name = "skinny_metadata", + VERSION_TO_STRING2(compat, 3,10), + VERSION_TO_STRING2(safe, 3,18), + VERSION_TO_STRING2(default, 3,18), + .desc = "reduced-size metadata extent refs" + }, { + .name = "no-holes", + .incompat_flag = BTRFS_FEATURE_INCOMPAT_NO_HOLES, + .sysfs_name = "no_holes", + VERSION_TO_STRING2(compat, 3,14), + VERSION_TO_STRING2(safe, 4,0), + VERSION_TO_STRING2(default, 5,15), + .desc = "no explicit hole extents for files" + }, + /* Keep this one last */ + { + .name = "list-all", + .runtime_flag = BTRFS_FEATURE_RUNTIME_LIST_ALL, + .sysfs_name = NULL, + VERSION_NULL(compat), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = NULL + } +}; + +static void list_all_features(const char *prefix, + const struct btrfs_feature *features, + int nr_features) +{ + /* We should have at least one empty feature. */ + ASSERT(nr_features > 1); + + printf("features available to %s:\n", prefix); + for (int i = 0; i < nr_features - 1; i++) { + const struct btrfs_feature *feat = features + i; + const char *sep = ""; + + fprintf(stderr, "%-20s- %s (", feat->name, feat->desc); + if (feat->compat_ver) { + fprintf(stderr, "compat=%s", feat->compat_str); + sep = ", "; + } + if (feat->safe_ver) { + fprintf(stderr, "%ssafe=%s", sep, feat->safe_str); + sep = ", "; + } + if (feat->default_ver) + fprintf(stderr, "%sdefault=%s", sep, feat->default_str); + fprintf(stderr, ")\n"); + } +} + +static int check_features(const char *name, const struct btrfs_feature *features, + int nr_features) +{ + bool found = false; + + for (int i = 0; i < nr_features; i++) { + const struct btrfs_feature *feat = features + i; + + if (!strcmp(feat->name, name)) { + found = true; + break; + } + } + if (found) + return 0; + return -EINVAL; +} + +static int set_super_incompat_flags(struct btrfs_fs_info *fs_info, u64 flags) +{ + struct btrfs_root *root = fs_info->tree_root; + struct btrfs_trans_handle *trans; + struct btrfs_super_block *disk_super; + u64 super_flags; + int ret; + + disk_super = fs_info->super_copy; + super_flags = btrfs_super_incompat_flags(disk_super); + super_flags |= flags; + trans = btrfs_start_transaction(root, 1); + BUG_ON(IS_ERR(trans)); + btrfs_set_super_incompat_flags(disk_super, super_flags); + ret = btrfs_commit_transaction(trans, root); + + return ret; +} + +static int cmd_tune_set(const struct cmd_struct *cmd, int argc, char **argv) +{ + struct btrfs_fs_info *fs_info; + struct open_ctree_args oca = { 0 }; + char *feature; + char *path; + int ret = 0; + + optind = 0; + while (1) { + int c = getopt(argc, argv, ""); + if (c < 0) + break; + + switch (c) { + default: + usage_unknown_option(cmd, argv); + } + } + + if (check_argc_min(argc - optind, 1)) + return 1; + + feature = argv[optind]; + + if (check_features(feature, set_features, ARRAY_SIZE(set_features))) { + error("Unknown feature to set: %s", feature); + return 1; + } + if (!strcmp(feature, "list-all")) { + list_all_features("set", set_features, ARRAY_SIZE(set_features)); + return 0; + } + + if (check_argc_exact(argc - optind, 2)) + return 1; + + path = argv[optind + 1]; + oca.flags = OPEN_CTREE_WRITES; + oca.filename = path; + fs_info = open_ctree_fs_info(&oca); + if (!fs_info) { + error("failed to open btrfs"); + ret = -EIO; + goto out; + } + /* + * For those 3 features, we only need to update the superblock to add + * the new feature flags. + */ + if (!strcmp(feature, "extref") || + !strcmp(feature, "skinny-metadata") || + !strcmp(feature, "no-holes")) { + u64 incompat_flags = 0; + + if (!strcmp(feature, "extref")) + incompat_flags |= BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF; + if (!strcmp(feature, "skinny-metadata")) + incompat_flags |= BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA; + if (!strcmp(feature, "no-holes")) + incompat_flags |= BTRFS_FEATURE_INCOMPAT_NO_HOLES; + ret = set_super_incompat_flags(fs_info, incompat_flags); + if (ret < 0) { + errno = -ret; + error("failed to set feature '%s': %m", feature); + } + goto out; + } + +out: + if (fs_info) + close_ctree_fs_info(fs_info); + return !!ret; +} + +static DEFINE_SIMPLE_COMMAND(tune_set, "set"); + +static const char * const tune_cmd_group_usage[] = { + "btrfs tune ", + NULL, +}; + +static const char tune_cmd_group_info[] = "change various btrfs features"; + +static const struct cmd_group tune_cmd_group = { + tune_cmd_group_usage, tune_cmd_group_info, { + &cmd_struct_tune_set, + NULL + } +}; +DEFINE_GROUP_COMMAND_TOKEN(tune); From patchwork Tue Sep 5 07:51:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374599 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78305C83F2C for ; Tue, 5 Sep 2023 16:02:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235958AbjIEQCo (ORCPT ); Tue, 5 Sep 2023 12:02:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353748AbjIEHwR (ORCPT ); Tue, 5 Sep 2023 03:52:17 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2EF4ACCB for ; Tue, 5 Sep 2023 00:52:14 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id E68C71F750 for ; Tue, 5 Sep 2023 07:52:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900332; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cXeiofhD6/uQWs8zTtqC1cqw4m7gtmDRadkYyuDODU0=; b=s+PDzae5HFgbx3ZWdkchKSKuueuCMvItcwbc9qwFBI8LhXajDclrKwv3DSiZIF7rj5QOGI zoXo1hymCd0QYyht4vz548ifFtakowjBHQCgVNoeC1A8gYY8hjLPu7dbjqRhCtvRri++c0 IvxdAOeaKceUq+1z/idoxOsT/AaeshU= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id C2A3513911 for ; Tue, 5 Sep 2023 07:52:11 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 0O/TByve9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:11 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 3/7] btrfs-progs: cmds/tune: add set support for free-space-tree feature Date: Tue, 5 Sep 2023 15:51:45 +0800 Message-ID: <5bee36f6d2bac339edb47d6c7dede061fa3a12f3.1693900169.git.wqu@suse.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This patch allows "btrfs tune set" to enable free-space-tree feature, using pretty much the same code from btrfstune. Signed-off-by: Qu Wenruo --- cmds/tune.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/cmds/tune.c b/cmds/tune.c index 92c7b9f1502c..9906cde393f4 100644 --- a/cmds/tune.c +++ b/cmds/tune.c @@ -17,11 +17,13 @@ #include #include "kerncompat.h" #include "cmds/commands.h" +#include "check/clear-cache.h" #include "common/help.h" #include "common/fsfeatures.h" #include "kernel-shared/messages.h" #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" +#include "kernel-shared/free-space-tree.h" static const char * const cmd_tune_set_usage[] = { "btrfs tune set []", @@ -57,6 +59,15 @@ static const struct btrfs_feature set_features[] = { VERSION_TO_STRING2(safe, 4,0), VERSION_TO_STRING2(default, 5,15), .desc = "no explicit hole extents for files" + }, { + .name = "free-space-tree", + .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE | + BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID, + .sysfs_name = "free_space_tree", + VERSION_TO_STRING2(compat, 4,5), + VERSION_TO_STRING2(safe, 4,9), + VERSION_TO_STRING2(default, 5,15), + .desc = "free space tree (space_cache=v2)" }, /* Keep this one last */ { @@ -134,6 +145,36 @@ static int set_super_incompat_flags(struct btrfs_fs_info *fs_info, u64 flags) return ret; } +static int convert_to_fst(struct btrfs_fs_info *fs_info) +{ + int ret; + + /* We may have invalid old v2 cache, clear them first. */ + if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { + ret = btrfs_clear_free_space_tree(fs_info); + if (ret < 0) { + errno = -ret; + error("failed to clear stale v2 free space cache: %m"); + return ret; + } + } + ret = btrfs_clear_v1_cache(fs_info); + if (ret < 0) { + errno = -ret; + error("failed to clear v1 free space cache: %m"); + return ret; + } + + ret = btrfs_create_free_space_tree(fs_info); + if (ret < 0) { + errno = -ret; + error("failed to create free space tree: %m"); + return ret; + } + pr_verbose(LOG_DEFAULT, "Converted to free space tree feature\n"); + return ret; +} + static int cmd_tune_set(const struct cmd_struct *cmd, int argc, char **argv) { struct btrfs_fs_info *fs_info; @@ -202,6 +243,17 @@ static int cmd_tune_set(const struct cmd_struct *cmd, int argc, char **argv) } goto out; } + if (!strcmp(feature, "free-space-tree")) { + if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID)) { + error("filesystem already has free-space-tree feature"); + ret = -EINVAL; + goto out; + } + ret = convert_to_fst(fs_info); + if (ret < 0) + error("failed to convert the filesystem to free-space-tree feature"); + goto out; + } out: if (fs_info) From patchwork Tue Sep 5 07:51:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374600 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF012CA0FFB for ; Tue, 5 Sep 2023 16:03:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236169AbjIEQCs (ORCPT ); Tue, 5 Sep 2023 12:02:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353749AbjIEHwS (ORCPT ); Tue, 5 Sep 2023 03:52:18 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BE3ACCF for ; Tue, 5 Sep 2023 00:52:15 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 10E7321832 for ; Tue, 5 Sep 2023 07:52:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900334; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0fDVBTEsm7FR57aEl2RYMUzC1tNIzw0LejU5BQx6NGY=; b=tGiUif+/Ofv7G7aTuxhuKC/oVvLvOUhg6eourtzXahXPNRpKoGmj8SRdZdAS0hyJhF03BD 4bw2eO2kVMa1WQTruzWMuX/eOTIGLDvXE4UIpwaIL/eNrrLLKZvMK/Ai+e41am8igwgqjh usr68LfPF6cgFVyh8giUrWkL/1p/Xhc= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 5C45113911 for ; Tue, 5 Sep 2023 07:52:13 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id GCIXCS3e9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:13 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 4/7] btrfs-progs: cmds/tune: add set support for block-group-tree feature Date: Tue, 5 Sep 2023 15:51:46 +0800 Message-ID: <663028b35ff393f8aa88126edba8aa2763a11a22.1693900169.git.wqu@suse.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Most of the code is reusing the existing code from btrfs-tune, only needs to add extra linkage dependency on tune/convert-bgt.o. Signed-off-by: Qu Wenruo --- Makefile | 2 +- cmds/tune.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9857daaa42ac..45d64129352c 100644 --- a/Makefile +++ b/Makefile @@ -241,7 +241,7 @@ cmds_objects = cmds/subvolume.o cmds/subvolume-list.o \ cmds/inspect-dump-super.o cmds/inspect-tree-stats.o cmds/filesystem-du.o \ cmds/reflink.o cmds/tune.o \ mkfs/common.o check/mode-common.o check/mode-lowmem.o \ - check/clear-cache.o + check/clear-cache.o tune/convert-bgt.o libbtrfs_objects = \ kernel-lib/rbtree.o \ diff --git a/cmds/tune.c b/cmds/tune.c index 9906cde393f4..76ad9ebfc39e 100644 --- a/cmds/tune.c +++ b/cmds/tune.c @@ -24,6 +24,7 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" #include "kernel-shared/free-space-tree.h" +#include "tune/tune.h" static const char * const cmd_tune_set_usage[] = { "btrfs tune set []", @@ -68,6 +69,14 @@ static const struct btrfs_feature set_features[] = { VERSION_TO_STRING2(safe, 4,9), VERSION_TO_STRING2(default, 5,15), .desc = "free space tree (space_cache=v2)" + }, { + .name = "block-group-tree", + .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE, + .sysfs_name = "block_group_tree", + VERSION_TO_STRING2(compat, 6,1), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = "block group tree to reduce mount time" }, /* Keep this one last */ { @@ -254,6 +263,22 @@ static int cmd_tune_set(const struct cmd_struct *cmd, int argc, char **argv) error("failed to convert the filesystem to free-space-tree feature"); goto out; } + if (!strcmp(feature, "block-group-tree")) { + if (btrfs_fs_compat_ro(fs_info, BLOCK_GROUP_TREE)) { + error("filesystem already has block-group-tree feature"); + ret = -EINVAL; + goto out; + } + if (!btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID)) { + error("the filesystem doesn't have free-space-tree feature, please enable it first"); + ret = -EINVAL; + goto out; + } + ret = convert_to_bg_tree(fs_info); + if (ret < 0) + error("failed to convert the filesystem to free-space-tree feature"); + goto out; + } out: if (fs_info) From patchwork Tue Sep 5 07:51:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374608 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7C9E1CA0FF3 for ; Tue, 5 Sep 2023 16:03:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235953AbjIEQDd (ORCPT ); Tue, 5 Sep 2023 12:03:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353750AbjIEHwT (ORCPT ); Tue, 5 Sep 2023 03:52:19 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6B1C4CCB for ; Tue, 5 Sep 2023 00:52:16 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 30B4F211B7 for ; Tue, 5 Sep 2023 07:52:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900335; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/i0Oqpqih/65E1Joi65FTQE0z70TQd5YJ+G4nDOq1Sg=; b=q//8CYt7In8mq+vLsjQnRVFdw78+906JEFT15/WIKJhKrtDK07N+49jJK4WsAnoH6vD3BL enCv/ohes+qgFI8pGElTIFcuzHW/OPSvAcWXHTvPjgIcG6IBeSEKJ/B9UDm/TvePBVZ3jT nuP/XbjfWhXdy6QQ5TO7FYSNGOrneBU= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7B66E13911 for ; Tue, 5 Sep 2023 07:52:14 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id SEehEC7e9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:14 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 5/7] btrfs-progs: cmds/tune: add set support for seeding device Date: Tue, 5 Sep 2023 15:51:47 +0800 Message-ID: <4b517844b96bab15e8c446da25fe24e6ec4cf2ce.1693900169.git.wqu@suse.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org With the new "btrfs tune set" command, seeding device support can be added just like all other features. Signed-off-by: Qu Wenruo --- Makefile | 2 +- cmds/tune.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 45d64129352c..b502336d7441 100644 --- a/Makefile +++ b/Makefile @@ -241,7 +241,7 @@ cmds_objects = cmds/subvolume.o cmds/subvolume-list.o \ cmds/inspect-dump-super.o cmds/inspect-tree-stats.o cmds/filesystem-du.o \ cmds/reflink.o cmds/tune.o \ mkfs/common.o check/mode-common.o check/mode-lowmem.o \ - check/clear-cache.o tune/convert-bgt.o + check/clear-cache.o tune/convert-bgt.o tune/seeding.o libbtrfs_objects = \ kernel-lib/rbtree.o \ diff --git a/cmds/tune.c b/cmds/tune.c index 76ad9ebfc39e..195d0a235fc8 100644 --- a/cmds/tune.c +++ b/cmds/tune.c @@ -19,6 +19,7 @@ #include "cmds/commands.h" #include "check/clear-cache.h" #include "common/help.h" +#include "common/utils.h" #include "common/fsfeatures.h" #include "kernel-shared/messages.h" #include "kernel-shared/disk-io.h" @@ -30,6 +31,7 @@ static const char * const cmd_tune_set_usage[] = { "btrfs tune set []", "Set/enable specified feature for the unmounted filesystem", "", + OPTLINE("-f", "force dangerous operations."), HELPINFO_INSERT_GLOBALS, HELPINFO_INSERT_VERBOSE, NULL, @@ -77,6 +79,13 @@ static const struct btrfs_feature set_features[] = { VERSION_NULL(safe), VERSION_NULL(default), .desc = "block group tree to reduce mount time" + }, { + .name = "seed", + .sysfs_name = NULL, + VERSION_TO_STRING3(compat, 2,6,29), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = "seeding device support" }, /* Keep this one last */ { @@ -190,15 +199,19 @@ static int cmd_tune_set(const struct cmd_struct *cmd, int argc, char **argv) struct open_ctree_args oca = { 0 }; char *feature; char *path; + bool force = false; int ret = 0; optind = 0; while (1) { - int c = getopt(argc, argv, ""); + int c = getopt(argc, argv, "f"); if (c < 0) break; switch (c) { + case 'f': + force = true; + break; default: usage_unknown_option(cmd, argv); } @@ -279,6 +292,26 @@ static int cmd_tune_set(const struct cmd_struct *cmd, int argc, char **argv) error("failed to convert the filesystem to free-space-tree feature"); goto out; } + if (!strcmp(feature, "seed")) { + if (btrfs_fs_incompat(fs_info, METADATA_UUID)) { + error("SEED flag cannot be changed on a metadata-uuid changed fs"); + ret = -EINVAL; + goto out; + } + if (!force) { + warning( +"this is dangerous, clearing the seeding flag may cause the derived device not to be mountable!"); + ret = ask_user("We are going to clear the seeding flag, are you sure?"); + if (!ret) { + error("clear seeding flag canceled"); + ret = -EINVAL; + goto out; + } + } + + ret = update_seeding_flag(fs_info->tree_root, path, 1, force); + goto out; + } out: if (fs_info) From patchwork Tue Sep 5 07:51:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374607 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1984FCA1001 for ; Tue, 5 Sep 2023 16:03:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236930AbjIEQDi (ORCPT ); Tue, 5 Sep 2023 12:03:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57346 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353751AbjIEHwV (ORCPT ); Tue, 5 Sep 2023 03:52:21 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D033CCB for ; Tue, 5 Sep 2023 00:52:18 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 5206C1F750 for ; Tue, 5 Sep 2023 07:52:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900336; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VcgjDA8p9OrjoteXCujfMYZVyk8q/PBXrDbhLk7dj1c=; b=SbCbSXH8ynU8xqZhy3krVMmdcahM+DDbd3HA1yE6urkg/5FXT7G+q/2eXpM3fe/Optet3A jxYseCDmmf4ZrDC8D4nrWTgIc9I8+D5RlTxSre3bu4I0MGNszp7tmamDZ/jqSoHRJtNwGi fmZwkN/o/oPHjO0OQDoba14wBQv02lQ= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 9ADE313911 for ; Tue, 5 Sep 2023 07:52:15 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id uEdgGC/e9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:15 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 6/7] btrfs-progs: cmds/tune: add "btrfs tune clear" subcommand Date: Tue, 5 Sep 2023 15:51:48 +0800 Message-ID: X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This new "btrfs tune clear" subcommand is mostly the same as "btrfs tune set", but with much less features supported: - seed - block-group-tree For the features in "btrfs tune set" but not in "btrfs tune clear", they are mostly default features now, and we won't support disabling those features anymore. Signed-off-by: Qu Wenruo --- Documentation/btrfs-tune.rst | 7 +++ cmds/tune.c | 111 +++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/Documentation/btrfs-tune.rst b/Documentation/btrfs-tune.rst index 827c92eadb72..4a556a197540 100644 --- a/Documentation/btrfs-tune.rst +++ b/Documentation/btrfs-tune.rst @@ -21,6 +21,13 @@ set [] If *feature* is `list-all`, all supported features would be listed, and no *device* parameter is needed. +clear [] + Set/enable a feature. + + If *feature* is `list-all`, all supported features would be listed, and + no *device* parameter is needed. And the listed features may be different + compared to the ones from `btrfs tune set list-all`. + EXIT STATUS ----------- diff --git a/cmds/tune.c b/cmds/tune.c index 195d0a235fc8..a85d017ba2e1 100644 --- a/cmds/tune.c +++ b/cmds/tune.c @@ -321,6 +321,116 @@ out: static DEFINE_SIMPLE_COMMAND(tune_set, "set"); +static const struct btrfs_feature clear_features[] = { + { + .name = "block-group-tree", + .compat_ro_flag = BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE, + .sysfs_name = "block_group_tree", + VERSION_TO_STRING2(compat, 6,1), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = "block group tree to reduce mount time" + }, { + .name = "seed", + .sysfs_name = NULL, + VERSION_TO_STRING3(compat, 2,6,29), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = "seeding device support" + }, + /* Keep this one last */ + { + .name = "list-all", + .runtime_flag = BTRFS_FEATURE_RUNTIME_LIST_ALL, + .sysfs_name = NULL, + VERSION_NULL(compat), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = NULL + } +}; + +static int cmd_tune_clear(const struct cmd_struct *cmd, int argc, char **argv) +{ + struct btrfs_fs_info *fs_info; + struct open_ctree_args oca = { 0 }; + char *feature; + char *path; + int ret = 0; + + optind = 0; + while (1) { + int c = getopt(argc, argv, "f"); + if (c < 0) + break; + + switch (c) { + default: + usage_unknown_option(cmd, argv); + } + } + + if (check_argc_min(argc - optind, 1)) + return 1; + + feature = argv[optind]; + + if (check_features(feature, clear_features, ARRAY_SIZE(clear_features))) { + error("Unknown feature to clear: %s", feature); + return 1; + } + + if (!strcmp(feature, "list-all")) { + list_all_features("set", set_features, ARRAY_SIZE(set_features)); + return 0; + } + + if (check_argc_exact(argc - optind, 2)) + return 1; + + path = argv[optind + 1]; + oca.flags = OPEN_CTREE_WRITES; + oca.filename = path; + fs_info = open_ctree_fs_info(&oca); + if (!fs_info) { + error("failed to open btrfs"); + ret = -EIO; + goto out; + } + if (!strcmp(feature, "seed")) { + ret = update_seeding_flag(fs_info->tree_root, path, 0, 0); + goto out; + } + if (!strcmp(feature, "block-group-tree")) { + if (!btrfs_fs_compat_ro(fs_info, BLOCK_GROUP_TREE)) { + error("filesystem doesn't have block-group-tree feature"); + ret = -EINVAL; + goto out; + } + ret = convert_to_extent_tree(fs_info); + if (ret < 0) { + error("failed to convert the filesystem from block group tree feature"); + goto out; + } + goto out; + } +out: + if (fs_info) + close_ctree_fs_info(fs_info); + return !!ret; +} + +static const char * const cmd_tune_clear_usage[] = { + "btrfs tune clear []", + "Clear/disable specified feature for the unmounted filesystem", + "", + HELPINFO_INSERT_GLOBALS, + HELPINFO_INSERT_VERBOSE, + NULL, +}; + +static DEFINE_SIMPLE_COMMAND(tune_clear, "clear"); + static const char * const tune_cmd_group_usage[] = { "btrfs tune ", NULL, @@ -331,6 +441,7 @@ static const char tune_cmd_group_info[] = "change various btrfs features"; static const struct cmd_group tune_cmd_group = { tune_cmd_group_usage, tune_cmd_group_info, { &cmd_struct_tune_set, + &cmd_struct_tune_clear, NULL } }; From patchwork Tue Sep 5 07:51:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 13374598 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0519CA0FE2 for ; Tue, 5 Sep 2023 16:02:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235899AbjIEQCh (ORCPT ); Tue, 5 Sep 2023 12:02:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353752AbjIEHwW (ORCPT ); Tue, 5 Sep 2023 03:52:22 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2519ACCF for ; Tue, 5 Sep 2023 00:52:19 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id DF994211B7 for ; Tue, 5 Sep 2023 07:52:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1693900337; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KCSLvN+tcKkTygFHC960HQbHr/tqA0kfYKDMQ2ZqvOM=; b=qFt0HiMGikaHKWj8/4y4aV/KK1Pe1b5caE5LlroIKqq9X7KSuBgUdtnj3mH46ghlYm1w3w bHsGYrVc8fgrtberBt7peL/A9rn/OiqSg7CP8q1CJEhqaiou4vNoFEoo+CPWRumS5woEhZ ZvIHo1lAePUGh0ZvHy+XYbkikWc7iHA= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 3294913911 for ; Tue, 5 Sep 2023 07:52:16 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id aJyJOjDe9mTFeQAAMHmgww (envelope-from ) for ; Tue, 05 Sep 2023 07:52:16 +0000 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH 7/7] btrfs-progs: tests/cli: add a test case for "btrfs tune" subcommand Date: Tue, 5 Sep 2023 15:51:49 +0800 Message-ID: X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The new test case would test all supported features of both set and clear subcommands. Also test the error handling of unknown features. Signed-off-by: Qu Wenruo --- tests/cli-tests/018-btrfs-tune/test.sh | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 tests/cli-tests/018-btrfs-tune/test.sh diff --git a/tests/cli-tests/018-btrfs-tune/test.sh b/tests/cli-tests/018-btrfs-tune/test.sh new file mode 100755 index 000000000000..3b2d1ebb3e59 --- /dev/null +++ b/tests/cli-tests/018-btrfs-tune/test.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# test all command line options of btrfstune + +source "$TEST_TOP/common" || exit + +check_prereq btrfstune + +setup_root_helper +prepare_test_dev + +run_mayfail "$TOP/btrfstune" || true +run_check "$TOP/btrfstune" --help + +run_mustfail "must not work on non-existent device" \ + "$TOP/btrfstune" -r file-does-not-exist + +run_check_mkfs_test_dev -O ^extref +run_check "$TOP/btrfs" tune set extref "$TEST_DEV" +run_check "$TOP/btrfs" check "$TEST_DEV" + +run_check_mkfs_test_dev -O ^skinny-metadata +run_check "$TOP/btrfs" tune set skinny-metadata "$TEST_DEV" +run_check "$TOP/btrfs" check "$TEST_DEV" + +run_check_mkfs_test_dev -O ^no-holes +run_check "$TOP/btrfs" tune set no-holes "$TEST_DEV" +run_check "$TOP/btrfs" check "$TEST_DEV" + +run_check_mkfs_test_dev -O ^block-group-tree +run_check "$TOP/btrfs" tune set block-group-tree "$TEST_DEV" +run_check "$TOP/btrfs" check "$TEST_DEV" +run_check "$TOP/btrfs" tune clear block-group-tree "$TEST_DEV" +run_check "$TOP/btrfs" check "$TEST_DEV" + +run_check_mkfs_test_dev +run_check "$TOP/btrfs" tune set -f seed "$TEST_DEV" +run_check "$TOP/btrfs" tune clear seed "$TEST_DEV" + +run_mustfail "Unknown features" "$TOP/btrfs" tune set unknown-feature "$TEST_DEV" +run_mustfail "Unknown features" "$TOP/btrfs" tune clear unknown-feature "$TEST_DEV"