• Qu Wenruo's avatar
    btrfs: tree-checker: Fix wrong check on max devid · 8bb177d1
    Qu Wenruo authored
    [BUG]
    The following script will cause false alert on devid check.
      #!/bin/bash
    
      dev1=/dev/test/test
      dev2=/dev/test/scratch1
      mnt=/mnt/btrfs
    
      umount $dev1 &> /dev/null
      umount $dev2 &> /dev/null
      umount $mnt &> /dev/null
    
      mkfs.btrfs -f $dev1
    
      mount $dev1 $mnt
    
      _fail()
      {
              echo "!!! FAILED !!!"
              exit 1
      }
    
      for ((i = 0; i < 4096; i++)); do
              btrfs dev add -f $dev2 $mnt || _fail
              btrfs dev del $dev1 $mnt || _fail
              dev_tmp=$dev1
              dev1=$dev2
              dev2=$dev_tmp
      done
    
    [CAUSE]
    Tree-checker uses BTRFS_MAX_DEVS() and BTRFS_MAX_DEVS_SYS_CHUNK() as
    upper limit for devid.  But we can have devid holes just like above
    script.
    
    So the check for devid is incorrect and could cause false alert.
    
    [FIX]
    Just remove the whole devid check.  We don't have any hard requirement
    for devid assignment.
    
    Furthermore, even devid could get corrupted by a bitflip, we still have
    dev extents verification at mount time, so corrupted data won't sneak
    in.
    
    This fixes fstests btrfs/194.
    Reported-by: default avatarAnand Jain <anand.jain@oracle.com>
    Fixes: ab4ba2e1 ("btrfs: tree-checker: Verify dev item")
    CC: stable@vger.kernel.org # 5.2+
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    8bb177d1
tree-checker.c 43.5 KB