aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Edwards <gedwards@ddn.com>2018-07-26 15:52:54 -0400
committerJens Axboe <axboe@kernel.dk>2018-07-26 17:49:43 -0400
commitcdcdcaae8450a975e7d07e1bfec21f9b8c016d0c (patch)
tree27016d6616006a8f953e2eabec8616853aa1541b
parent359f642700f2ff05d9c94cd9216c97af7b8e9553 (diff)
scsi: virtio_scsi: fix pi_bytes{out,in} on 4 KiB block size devices
When the underlying device is a 4 KiB logical block size device with a protection interval exponent of 0, i.e. 4096 bytes data + 8 bytes PI, the driver miscalculates the pi_bytes{out,in} by a factor of 8x (64 bytes). This leads to errors on all reads and writes on 4 KiB logical block size devices when CONFIG_BLK_DEV_INTEGRITY is enabled and the VIRTIO_SCSI_F_T10_PI feature bit has been negotiated. Fixes: e6dc783a38ec0 ("virtio-scsi: Enable DIF/DIX modes in SCSI host LLD") Acked-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Edwards <gedwards@ddn.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--drivers/scsi/virtio_scsi.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 6dc8891ccb74..1c72db94270e 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -513,12 +513,12 @@ static void virtio_scsi_init_hdr_pi(struct virtio_device *vdev,
513 513
514 if (sc->sc_data_direction == DMA_TO_DEVICE) 514 if (sc->sc_data_direction == DMA_TO_DEVICE)
515 cmd_pi->pi_bytesout = cpu_to_virtio32(vdev, 515 cmd_pi->pi_bytesout = cpu_to_virtio32(vdev,
516 blk_rq_sectors(rq) * 516 bio_integrity_bytes(bi,
517 bi->tuple_size); 517 blk_rq_sectors(rq)));
518 else if (sc->sc_data_direction == DMA_FROM_DEVICE) 518 else if (sc->sc_data_direction == DMA_FROM_DEVICE)
519 cmd_pi->pi_bytesin = cpu_to_virtio32(vdev, 519 cmd_pi->pi_bytesin = cpu_to_virtio32(vdev,
520 blk_rq_sectors(rq) * 520 bio_integrity_bytes(bi,
521 bi->tuple_size); 521 blk_rq_sectors(rq)));
522} 522}
523#endif 523#endif
524 524