• Nikolay Borisov's avatar
    btrfs: always initialize btrfs_bio::tgtdev_map/raid_map pointers · 608769a4
    Nikolay Borisov authored
    Since btrfs_bio always contains the extra space for the tgtdev_map and
    raid_maps it's pointless to make the assignment iff specific conditions
    are met.
    
    Instead, always assign the pointers to their correct value at allocation
    time. To accommodate this change also move code a bit in
    __btrfs_map_block so that btrfs_bio::stripes array is always initialized
    before the raid_map, subsequently move the call to sort_parity_stripes
    in the 'if' building the raid_map, retaining the old behavior.
    
    To better understand the change, there are 2 aspects to this:
    
    1. The original code is harder to grasp because the calculations for
       initializing raid_map/tgtdev ponters are apart from the initial
       allocation of memory. Having them predicated on 2 separate checks
       doesn't help that either... So by moving the initialisation in
       alloc_btrfs_bio puts everything together.
    
    2. tgtdev/raid_maps are now always initialized despite sometimes they
       might be equal i.e __btrfs_map_block_for_discard calls
       alloc_btrfs_bio with tgtdev = 0 but their usage should be predicated
       on external checks i.e. just because those pointers are non-null
       doesn't mean they are valid per-se. And actually while taking another
       look at __btrfs_map_block I saw a discrepancy:
    
       Original code initialised tgtdev_map if the following check is true:
    
    	   if (dev_replace_is_ongoing && dev_replace->tgtdev != NULL)
    
       However, further down tgtdev_map is only used if the following check
       is true:
    
    	if (dev_replace_is_ongoing && dev_replace->tgtdev != NULL && need_full_stripe(op))
    
      e.g. the additional need_full_stripe(op) predicate is there.
    Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    [ copy more details from mail discussion ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    608769a4
volumes.c 203 KB