• NeilBrown's avatar
    md/raid10: fix two problems with RAID10 resync. · 7bb23c49
    NeilBrown authored
    1/ When an different between blocks is found, data is copied from
       one bio to the other.  However bv_len is used as the length to
       copy and this could be zero.  So use r10_bio->sectors to calculate
       length instead.
       Using bv_len was probably always a bit dubious, but the introduction
       of bio_advance made it much more likely to be a problem.
    
    2/ When preparing some blocks for sync, we don't set BIO_UPTODATE
       except on bios that we schedule for a read.  This ensures that
       missing/failed devices don't confuse the loop at the top of
       sync_request write.
       Commit 8be185f2 "raid10: Use bio_reset()"
       removed a loop which set BIO_UPTDATE on all appropriate bios.
       So we need to re-add that flag.
    
    These bugs were introduced in 3.10, so this patch is suitable for
    3.10-stable, and can remove a potential for data corruption.
    
    Cc: stable@vger.kernel.org (3.10)
    Reported-by: default avatarBrassow Jonathan <jbrassow@redhat.com>
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    7bb23c49
raid10.c 131 KB