• Anand Jain's avatar
    btrfs: include non-missing as a qualifier for the latest_bdev · 998a0671
    Anand Jain authored
    btrfs_free_extra_devids() updates fs_devices::latest_bdev to point to
    the bdev with greatest device::generation number.  For a typical-missing
    device the generation number is zero so fs_devices::latest_bdev will
    never point to it.
    
    But if the missing device is due to alienation [1], then
    device::generation is not zero and if it is greater or equal to the rest
    of device  generations in the list, then fs_devices::latest_bdev ends up
    pointing to the missing device and reports the error like [2].
    
    [1] We maintain devices of a fsid (as in fs_device::fsid) in the
    fs_devices::devices list, a device is considered as an alien device
    if its fsid does not match with the fs_device::fsid
    
    Consider a working filesystem with raid1:
    
      $ mkfs.btrfs -f -d raid1 -m raid1 /dev/sda /dev/sdb
      $ mount /dev/sda /mnt-raid1
      $ umount /mnt-raid1
    
    While mnt-raid1 was unmounted the user force-adds one of its devices to
    another btrfs filesystem:
    
      $ mkfs.btrfs -f /dev/sdc
      $ mount /dev/sdc /mnt-single
      $ btrfs dev add -f /dev/sda /mnt-single
    
    Now the original mnt-raid1 fails to mount in degraded mode, because
    fs_devices::latest_bdev is pointing to the alien device.
    
      $ mount -o degraded /dev/sdb /mnt-raid1
    
    [2]
    mount: wrong fs type, bad option, bad superblock on /dev/sdb,
           missing codepage or helper program, or other error
    
           In some cases useful info is found in syslog - try
           dmesg | tail or so.
    
      kernel: BTRFS warning (device sdb): devid 1 uuid 072a0192-675b-4d5a-8640-a5cf2b2c704d is missing
      kernel: BTRFS error (device sdb): failed to read devices
      kernel: BTRFS error (device sdb): open_ctree failed
    
    Fix the root cause by checking if the device is not missing before it
    can be considered for the fs_devices::latest_bdev.
    
    CC: stable@vger.kernel.org # 4.19+
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    998a0671
volumes.c 202 KB