• Darrick J. Wong's avatar
    block: fix regression where bio_integrity_process uses wrong bio_vec iterator · 594416a7
    Darrick J. Wong authored
    bio integrity handling is broken on a system with LVM layered atop a
    DIF/DIX SCSI drive because device mapper clones the bio, modifies the
    clone, and sends the clone to the lower layers for processing.
    However, the clone bio has bi_vcnt == 0, which means that when the sd
    driver calls bio_integrity_process to attach DIX data, the
    for_each_segment_all() call (which uses bi_vcnt) returns immediately
    and random garbage is sent to the disk on a disk write.  The disk of
    course returns an error.
    
    Therefore, teach bio_integrity_process() to use bio_for_each_segment()
    to iterate the bio_vecs, since the per-bio iterator tracks which
    bio_vecs are associated with that particular bio.  The integrity
    handling code is effectively part of the "driver" (it's not the bio
    owner), so it must use the correct iterator function.
    
    v2: Fix a compiler warning about abandoned local variables.  This
    patch supersedes "block: bio_integrity_process uses wrong bio_vec
    iterator".  Patch applies against 3.18-rc6.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Acked-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    594416a7
bio-integrity.c 14 KB