forked from Minki/linux
block: Integrity checksum flag
Make the choice of checksum a per-I/O property by introducing a flag that can be inspected by the SCSI layer. There are several reasons for this: 1. It allows us to switch choice of checksum without unloading and reloading the HBA driver. 2. During error recovery we need to be able to tell the HBA that checksums read from disk should not be verified and converted to IP checksums. 3. For error injection purposes we need to be able to write a bad guard tag to storage. Since the storage device only supports T10 CRC we need to be able to disable IP checksum conversion on the HBA. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
b1f0138857
commit
aae7df5019
@ -297,6 +297,9 @@ int bio_integrity_prep(struct bio *bio)
|
|||||||
bip->bip_iter.bi_size = len;
|
bip->bip_iter.bi_size = len;
|
||||||
bip_set_seed(bip, bio->bi_iter.bi_sector);
|
bip_set_seed(bip, bio->bi_iter.bi_sector);
|
||||||
|
|
||||||
|
if (bi->flags & BLK_INTEGRITY_IP_CHECKSUM)
|
||||||
|
bip->bip_flags |= BIP_IP_CHECKSUM;
|
||||||
|
|
||||||
/* Map it */
|
/* Map it */
|
||||||
offset = offset_in_page(buf);
|
offset = offset_in_page(buf);
|
||||||
for (i = 0 ; i < nr_pages ; i++) {
|
for (i = 0 ; i < nr_pages ; i++) {
|
||||||
|
@ -255,12 +255,14 @@ void sd_dif_config_host(struct scsi_disk *sdkp)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Enable DMA of protection information */
|
/* Enable DMA of protection information */
|
||||||
if (scsi_host_get_guard(sdkp->device->host) & SHOST_DIX_GUARD_IP)
|
if (scsi_host_get_guard(sdkp->device->host) & SHOST_DIX_GUARD_IP) {
|
||||||
if (type == SD_DIF_TYPE3_PROTECTION)
|
if (type == SD_DIF_TYPE3_PROTECTION)
|
||||||
blk_integrity_register(disk, &dif_type3_integrity_ip);
|
blk_integrity_register(disk, &dif_type3_integrity_ip);
|
||||||
else
|
else
|
||||||
blk_integrity_register(disk, &dif_type1_integrity_ip);
|
blk_integrity_register(disk, &dif_type1_integrity_ip);
|
||||||
else
|
|
||||||
|
disk->integrity->flags |= BLK_INTEGRITY_IP_CHECKSUM;
|
||||||
|
} else
|
||||||
if (type == SD_DIF_TYPE3_PROTECTION)
|
if (type == SD_DIF_TYPE3_PROTECTION)
|
||||||
blk_integrity_register(disk, &dif_type3_integrity_crc);
|
blk_integrity_register(disk, &dif_type3_integrity_crc);
|
||||||
else
|
else
|
||||||
|
@ -328,6 +328,7 @@ enum bip_flags {
|
|||||||
BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */
|
BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */
|
||||||
BIP_CTRL_NOCHECK = 1 << 2, /* disable HBA integrity checking */
|
BIP_CTRL_NOCHECK = 1 << 2, /* disable HBA integrity checking */
|
||||||
BIP_DISK_NOCHECK = 1 << 3, /* disable disk integrity checking */
|
BIP_DISK_NOCHECK = 1 << 3, /* disable disk integrity checking */
|
||||||
|
BIP_IP_CHECKSUM = 1 << 4, /* IP checksum */
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
|
static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
|
||||||
|
@ -1462,6 +1462,7 @@ enum blk_integrity_flags {
|
|||||||
BLK_INTEGRITY_VERIFY = 1 << 0,
|
BLK_INTEGRITY_VERIFY = 1 << 0,
|
||||||
BLK_INTEGRITY_GENERATE = 1 << 1,
|
BLK_INTEGRITY_GENERATE = 1 << 1,
|
||||||
BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2,
|
BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2,
|
||||||
|
BLK_INTEGRITY_IP_CHECKSUM = 1 << 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct blk_integrity_iter {
|
struct blk_integrity_iter {
|
||||||
|
Loading…
Reference in New Issue
Block a user