• Nikolay Borisov's avatar
    btrfs: Handle final split-brain possibility during fsid change · cc5de4e7
    Nikolay Borisov authored
    This patch lands the last case which needs to be handled by the fsid
    change code. Namely, this is the case where a multidisk filesystem has
    already undergone at least one successful fsid change i.e all disks
    have the METADATA_UUID incompat bit and power failure occurs as another
    fsid change is in progress. When such an event occurs, disks could be
    split in 2 groups. One of the groups will have both METADATA_UUID and
    CHANGING_FSID_V2 flags set coupled with old fsid/metadata_uuid pairs.
    The other group of disks will have only METADATA_UUID bit set and their
    fsid will be different than the one in disks in the first group. Here
    we look at the following cases:
    
      a) A disk from the first group is scanned first, so fs_devices is
      created with stale fsid/metdata_uuid. Then when a disk from the
      second group is scanned it needs to first check whether there exists
      such an fs_devices that has fsid_change set to true (because it was
      created with a disk having the CHANGING_FSID_V2 flag), the
      metadata_uuid and fsid of the fs_devices will be different (since it was
      created by a disk which already has had at least 1 successful fsid change)
      and finally the metadata_uuid of the fs_devices will equal that of the
      currently scanned disk (because metadata_uuid never really changes).
      When the correct fs_devices is found the information from the scanned
      disk will replace the current one in fs_devices since the scanned disk
      will have higher generation number.
    
      b) A disk from the second group is scanned so fs_devices is created
      as usual with differing fsid/metdata_uid. Then when a disk from the
      first group is scanned the code detects that it has both
      CHANGING_FSID_V2 and METADATA_UUID flags set and will search for
      fs_devices that has differing metadata_uuid/fsid and whose
      metadata_uuid is the same as that of the scanned device.
    Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    cc5de4e7
volumes.c 206 KB