• Qu Wenruo's avatar
    btrfs: raid56: make error_bitmap update atomic · a9ad4d87
    Qu Wenruo authored
    In the rework of raid56 code, there is very limited concurrency in the
    endio context.
    
    Most of the work is done inside the sectors arrays, which different bios
    will never touch the same sector.
    
    But there is a concurrency here for error_bitmap. Both read and write
    endio functions need to touch them, and we can have multiple write bios
    touching the same error bitmap if they all hit some errors.
    
    Here we fix the unprotected bitmap operation by going set_bit() in a
    loop.
    
    Since we have a very small ceiling of the sectors (at most 16 sectors),
    such set_bit() in a loop should be very acceptable.
    
    Fixes: 2942a50d ("btrfs: raid56: introduce btrfs_raid_bio::error_bitmap")
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a9ad4d87
raid56.c 75.3 KB