Re: [PATCH 5/6] btrfs: copy fsid and metadata_uuid for pulled disk without INCOMPAT_METADATA_UUID

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2020/1/7 3:18 PM, Nikolay Borisov wrote:


On 7.01.20 г. 3:31 ч., Su Yue wrote:
On 2020/1/6 11:12 PM, Nikolay Borisov wrote:


On 12.12.19 г. 13:01 ч., damenly.su@xxxxxxxxx wrote:
From: Su Yue <Damenly_Su@xxxxxxx>

Since a scanned device may be the device pulled into disk without
metadata_uuid feature, there may already be changing devices there.
Here copy fsid and metadata_uuid for above case.

Signed-off-by: Su Yue <Damenly_Su@xxxxxxx>


What does this patch fix, why is it needed? It seems to be independent
of the split brain fixes?


Sorry for the messy and short commit log.
It's one of the split brain fixes.

As mails I replied you earlier, the case
is for device which succeed to sync in
the second transaction and is without
metadata_uuid feature. If there is fs_devices
already scanned, the device's fsid instead of
metadata_uuid(NULL here) should be copied into
the fs_devices->metada_uuid field.

I figures as much as I started tackling the problem. So this must be
part of the patch which fixes aforementioned split brain scenario. I
have already developed some patches + tests. So will be sending those,
since they are very similar to what you posted originally I will retain
your SOB line.


I'm okay about this way. Thanks.

Thanks.

---
   fs/btrfs/volumes.c | 11 +++++++----
   1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index faf9cdd14f33..b21ab45e76a0 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -964,13 +964,16 @@ static noinline struct btrfs_device
*device_list_add(const char *path,
        * metadata_uuid/fsid values of the fs_devices.
        */
       if (*new_device_added && fs_devices_found &&
-        has_metadata_uuid && fs_devices->fsid_change &&
+        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;
       }








[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux