From: l@damenly.org
To: Qu Wenruo <wqu@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 3/3] btrfs-progs: tune: add fsck runs before and after a full conversion
Date: Mon, 04 Dec 2023 10:11:04 +0000 [thread overview]
Message-ID: <455ec3c5adf1dbb10f5ee00bf3a6c955@damenly.org> (raw)
In-Reply-To: <a5qqguz5.fsf@damenly.org>
On 2023-12-04 09:44, Su Yue wrote:
> On Mon 04 Dec 2023 at 17:26, Qu Wenruo <wqu@suse.com> wrote:
>
>> We have two bug reports in the mailing list around block group tree
>> conversion.
>>
>> Although currently there is still no strong evidence showing btrfstune
>> is the culprit yet, I still want to be extra cautious.
>>
>> This patch would add an extra safenet for the end users, that a full
>> readonly btrfs check would be executed on the filesystem before doing
>> any full fs conversion (including bg/extent tree and csum conversion).
>>
>> This can catch any existing health problem of the filesystem.
>>
>> Furthermore, after the conversion is done, there would also be a
>> "btrfs
>> check" run, to make sure the conversion itself is fine, to make sure
>> we
>> have done everything to make sure the problem is not from our side.
>>
>> One thing to note is, the initial check would only happen on a source
>> filesystem which is not under any existing conversion.
>> As a fs already under conversion can easily trigger btrfs check false
>> alerts.
>>
> Better to mention above behavior in documentation too? Or some
> impatient people may give up then complain btrfs is slow ;)
>
And maybe an option to skip check? People who want to convert to BG tree
usually have large filesystems, then the original check can be killed
because of OOM...
--
Su
> --
> Su
>>
>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>> ---
>> Makefile | 3 ++-
>> tune/main.c | 55
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 57 insertions(+), 1 deletion(-)
>>
>> diff --git a/Makefile b/Makefile
>> index 374f59b99150..47c6421781f3 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -267,7 +267,8 @@ mkfs_objects = mkfs/main.o mkfs/common.o
>> mkfs/rootdir.o
>> image_objects = image/main.o image/sanitize.o image/image-create.o
>> image/common.o \
>> image/image-restore.o
>> tune_objects = tune/main.o tune/seeding.o tune/change-uuid.o
>> tune/change-metadata-uuid.o \
>> - tune/convert-bgt.o tune/change-csum.o common/clear-cache.o
>> tune/quota.o
>> + tune/convert-bgt.o tune/change-csum.o common/clear-cache.o
>> tune/quota.o \
>> + check/main.o check/mode-common.o check/mode-lowmem.o
>> mkfs/common.o
>> all_objects = $(objects) $(cmds_objects) $(libbtrfs_objects)
>> $(convert_objects) \
>> $(mkfs_objects) $(image_objects) $(tune_objects)
>> $(libbtrfsutil_objects)
>>
>> diff --git a/tune/main.c b/tune/main.c
>> index 9dcb55952b59..f05ab7c3b36e 100644
>> --- a/tune/main.c
>> +++ b/tune/main.c
>> @@ -29,6 +29,7 @@
>> #include "kernel-shared/transaction.h"
>> #include "kernel-shared/volumes.h"
>> #include "kernel-shared/free-space-tree.h"
>> +#include "kernel-shared/zoned.h"
>> #include "common/utils.h"
>> #include "common/open-utils.h"
>> #include "common/device-scan.h"
>> @@ -367,6 +368,47 @@ int BOX_MAIN(btrfstune)(int argc, char *argv[])
>> if (change_metadata_uuid || random_fsid || new_fsid_str)
>> ctree_flags |= OPEN_CTREE_USE_LATEST_BDEV;
>>
>> + /*
>> + * For fs rewrites operations, we need to verify the initial
>> + * filesystem to make sure they are healthy.
>> + * Otherwise the transaction protection is not going to save us.
>> + */
>> + if (to_bg_tree || to_extent_tree || csum_type != -1) {
>> + struct btrfs_super_block sb = { 0 };
>> + u64 sb_flags;
>> +
>> + /*
>> + * Here we just read out the superblock without any extra check,
>> + * as later btrfs_check() would do more comprehensive check on
>> + * it.
>> + */
>> + ret = sbread(fd, &sb, 0);
>> + if (ret < 0) {
>> + errno = -ret;
>> + error("failed to read super block from \"%s\"", device);
>> + goto free_out;
>> + }
>> + sb_flags = btrfs_super_flags(&sb);
>> + /*
>> + * If we're not resuming the conversion, we should check the fs
>> + * first.
>> + */
>> + if (!(sb_flags & (BTRFS_SUPER_FLAG_CHANGING_BG_TREE |
>> + BTRFS_SUPER_FLAG_CHANGING_DATA_CSUM |
>> + BTRFS_SUPER_FLAG_CHANGING_META_CSUM))) {
>> + bool check_ret;
>> + struct btrfs_check_options options =
>> + btrfs_default_check_options;
>> +
>> + check_ret = btrfs_check(device, &options);
>> + if (check_ret) {
>> + error(
>> + "\"btrfs check\" found some errors, will not touch the
>> filesystem");
>> + ret = -EUCLEAN;
>> + goto free_out;
>> + }
>> + }
>> + }
>> root = open_ctree_fd(fd, device, 0, ctree_flags);
>>
>> if (!root) {
>> @@ -535,6 +577,19 @@ out:
>> }
>> close_ctree(root);
>> btrfs_close_all_devices();
>> + /* A sucessful run finished, let's verify the fs again. */
>> + if (!ret && (to_bg_tree || to_extent_tree || csum_type)) {
>> + bool check_ret;
>> + struct btrfs_check_options options = btrfs_default_check_options;
>> +
>> + check_ret = btrfs_check(device, &options);
>> + if (check_ret) {
>> + error(
>> + "\"btrfs check\" found some errors after the conversion, please
>> contact the developers");
>> + ret = -EUCLEAN;
>> + }
>> +
>> + }
>>
>> free_out:
>> return ret;
next prev parent reply other threads:[~2023-12-04 10:11 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-04 6:56 [PATCH 0/3] btrfs-progs: tune: run "btrfs check" before and after full fs conversion Qu Wenruo
2023-12-04 6:56 ` [PATCH 1/3] btrfs-progs: check: remove inode cache clearing functionality Qu Wenruo
2023-12-05 16:47 ` David Sterba
2023-12-04 6:56 ` [PATCH 2/3] btrfs-progs: check: export a dedicated btrfs_check() function Qu Wenruo
2023-12-04 6:56 ` [PATCH 3/3] btrfs-progs: tune: add fsck runs before and after a full conversion Qu Wenruo
2023-12-04 9:44 ` Su Yue
2023-12-04 10:11 ` l [this message]
2023-12-04 10:22 ` Qu Wenruo
2023-12-05 16:46 ` David Sterba
2023-12-05 21:33 ` Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=455ec3c5adf1dbb10f5ee00bf3a6c955@damenly.org \
--to=l@damenly.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox