From: Nikolay Borisov <nborisov@suse.com> To: linux-btrfs@vger.kernel.org Cc: Nikolay Borisov <nborisov@suse.com> Subject: [PATCH 4/4] btrfs: Fix split-brain handling when changing FSID to metadata uuid Date: Fri, 10 Jan 2020 14:11:35 +0200 [thread overview] Message-ID: <20200110121135.7386-5-nborisov@suse.com> (raw) In-Reply-To: <20200110121135.7386-1-nborisov@suse.com> Current code doesn't correctly handle the situation which arises when a file system that has METADATA_UUID_INCOMPAT flag set has its FSID changed to the one in metadata uuid. This causes the incompat flag to disappear. In case of a power failure we could end up in a situation where part of the disks in a multi-disk filesystem are correctly reverted to METADATA_UUID_INCOMPAT flag unset state, while others have METADATA_UUID_INCOMPAT set and CHANGING_FSID_V2_IN_PROGRESS. This patch corrects the behavior required to handle the case where a disk of the second type is scanned first, creating the necessary btrfs_fs_devices. Subsequently, when a disk which has already completed the transition is scanned it should overwrite the data in btrfs_fs_devices. Reported-by: Su Yue <Damenly_Su@gmx.com> Signed-off-by: Nikolay Borisov <nborisov@suse.com> --- fs/btrfs/volumes.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 7739d40939bf..871e163d1252 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -733,6 +733,32 @@ static struct btrfs_fs_devices *find_fsid_changed( return NULL; } + +static struct btrfs_fs_devices *find_fsid_reverted_metadata( + struct btrfs_super_block *disk_super) +{ + struct btrfs_fs_devices *fs_devices; + + /* + * Handles the case where the scanned device is part of an fs whose last + * metadata uuid change reverted it to the original FSID. At the same time + * fs_devices was first created by another constitutent device which didn't + * fully observer the operation. This results in an btrfs_fs_devices + * created with metadata/fsid different AND btrfs_fs_devices::fsid_change + * set AND the metadata_uuid of the fs_devices equal to the FSID of the + * disk. + */ + list_for_each_entry(fs_devices, &fs_uuids, fs_list) { + if (memcmp(fs_devices->fsid, fs_devices->metadata_uuid, + BTRFS_FSID_SIZE) != 0 && + memcmp(fs_devices->metadata_uuid, disk_super->fsid, + BTRFS_FSID_SIZE) == 0 && + fs_devices->fsid_change) + return fs_devices; + } + + return NULL; +} /* * Add new device to list of registered devices * @@ -762,7 +788,9 @@ static noinline struct btrfs_device *device_list_add(const char *path, } else if (has_metadata_uuid) { fs_devices = find_fsid_with_metadata_uuid(disk_super); } else { - fs_devices = find_fsid(disk_super->fsid, NULL); + fs_devices = find_fsid_reverted_metadata(disk_super); + if (!fs_devices) + fs_devices = find_fsid(disk_super->fsid, NULL); } @@ -792,12 +820,17 @@ static noinline struct btrfs_device *device_list_add(const char *path, * a device which had the CHANGING_FSID_V2 flag then replace the * metadata_uuid/fsid values of the fs_devices. */ - if (has_metadata_uuid && fs_devices->fsid_change && + if (fs_devices->fsid_change && found_transid > fs_devices->latest_generation) { memcpy(fs_devices->fsid, disk_super->fsid, BTRFS_FSID_SIZE); - memcpy(fs_devices->metadata_uuid, - disk_super->metadata_uuid, BTRFS_FSID_SIZE); + + if (has_metadata_uuid) + memcpy(fs_devices->metadata_uuid, + disk_super->metadata_uuid, BTRFS_FSID_SIZE); + else + memcpy(fs_devices->metadata_uuid, + disk_super->fsid, BTRFS_FSID_SIZE); fs_devices->fsid_change = false; } -- 2.17.1
next prev parent reply other threads:[~2020-01-10 12:11 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-10 12:11 [PATCH 0/4] More split-brain fixes for metadata uuid feature Nikolay Borisov 2020-01-10 12:11 ` [PATCH 1/4] btrfs: Call find_fsid from find_fsid_inprogress Nikolay Borisov 2020-01-10 15:24 ` Josef Bacik 2020-01-10 12:11 ` [PATCH 2/4] btrfs: Factor out metadata_uuid code from find_fsid Nikolay Borisov 2020-01-10 15:25 ` Josef Bacik 2020-01-10 12:11 ` [PATCH 3/4] btrfs: Handle another split brain scenario with metadata uuid feature Nikolay Borisov 2020-01-10 15:29 ` Josef Bacik 2020-01-21 15:16 ` David Sterba 2020-01-10 12:11 ` Nikolay Borisov [this message] 2020-01-10 15:58 ` [PATCH 4/4] btrfs: Fix split-brain handling when changing FSID to metadata uuid Josef Bacik 2020-01-14 17:14 ` [PATCH 0/4] More split-brain fixes for metadata uuid feature David Sterba 2020-01-21 15:23 ` David Sterba
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=20200110121135.7386-5-nborisov@suse.com \ --to=nborisov@suse.com \ --cc=linux-btrfs@vger.kernel.org \ --subject='Re: [PATCH 4/4] btrfs: Fix split-brain handling when changing FSID to metadata uuid' \ /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
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.