Skip to content
  • Gu JinXiang's avatar
    btrfs: Fix bug for misused dev_t when lookup in dev state hash table. · d28e649a
    Gu JinXiang authored
    Fix bug of commit 74d46992
    
     ("block: replace bi_bdev with a gendisk
    pointer and partitions index").
    
    bio_dev(bio) is used to find the dev state in function
    __btrfsic_submit_bio. But when dev_state is added to the hashtable, it
    is using dev_t of block_device.
    
    bio_dev(bio) returns a dev_t of part0 which is different from dev_t in
    block_device(bd_dev). bd_dev in block_device represents the exact
    partition.
    
    block_device.bd_dev =
    	bio->bi_partno (same as block_device.bd_partno) + bio_dev(bio).
    
    When adding a dev_state into hashtable, we use the exact partition dev_t.
    So when looking it up, it should also use the exact partition dev_t.
    
    Reproducer of this bug:
    
    Use MOUNT_OPTIONS="-o check_int" and run btrfs/001 in fstests.
    Then there will be WARNING like below.
    
    WARNING:
    btrfs: attempt to write superblock which references block M @29523968 (sda7     /1111654400/2) which is never written!
    
    Signed-off-by: default avatarGu JinXiang <gujx@cn.fujitsu.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    d28e649a