]> git.baikalelectronics.ru Git - kernel.git/commit
block: fix regression where bio_integrity_process uses wrong bio_vec iterator
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 26 Nov 2014 01:40:25 +0000 (17:40 -0800)
committerJens Axboe <axboe@fb.com>
Tue, 2 Dec 2014 15:15:21 +0000 (08:15 -0700)
commit1a5700ec162a8ec78e6b1f2605253aaf8b648694
treebdb6fcb0ebba99a19d99c83123ef86cfd5c76911
parent40407ab9c7030192d9d5dc25ea3e5e4b3b1010ec
block: fix regression where bio_integrity_process uses wrong bio_vec iterator

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: Darrick J. Wong <darrick.wong@oracle.com>
Acked-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/bio-integrity.c