• Anand Jain's avatar
    btrfs: proper error handling when invalid device is found in find_next_devid · a06dee4d
    Anand Jain authored
    In a corrupted tree, if search for next devid finds the device with
    devid = -1, then report the error -EUCLEAN back to the parent function
    to fail gracefully.
    
    The tree checker will not catch this in case the devids are created
    using the following script:
    
      umount /btrfs
      dev1=/dev/sdb
      dev2=/dev/sdc
      mkfs.btrfs -fq -dsingle -msingle $dev1
      mount $dev1 /btrfs
    
      _fail()
      {
    	  echo $1
    	  exit 1
      }
    
      while true; do
    	  btrfs dev add -f $dev2 /btrfs || _fail "add failed"
    	  btrfs dev del $dev1 /btrfs || _fail "del failed"
    	  dev_tmp=$dev1
    	  dev1=$dev2
    	  dev2=$dev_tmp
      done
    
    With output:
    
      BTRFS critical (device sdb): corrupt leaf: root=3 block=313739198464 slot=1 devid=1 invalid devid: has=507 expect=[0, 506]
      BTRFS error (device sdb): block=313739198464 write time tree block corruption detected
      BTRFS: error (device sdb) in btrfs_commit_transaction:2268: errno=-5 IO failure (Error while writing out transaction)
      BTRFS warning (device sdb): Skipping commit of aborted transaction.
      BTRFS: error (device sdb) in cleanup_transaction:1827: errno=-5 IO failure
    Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
    [ add script and messages ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a06dee4d
volumes.c 205 KB