]> 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)
commitc9dbef14f8acca28073269f2de74162ed87b6f4e
treebdb6fcb0ebba99a19d99c83123ef86cfd5c76911
parentba45561728c20faf2120fe597ce796d19e8b6a88
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