diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-02-28 01:42:11 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-04-08 02:25:39 -0400 |
commit | 823ddd877f3a5c301490196d369f68baa6c020e4 (patch) | |
tree | bf5f492cfd2cd5d9deb98882e6375648ea5308a2 /drivers/target | |
parent | b3c951726edbec6219ba75b34a2151d7c0fa9fc7 (diff) |
target: Convert DIF emulation to use cmd->prot_type
This patch changes existing DIF emulation to check the command descriptor's
prot_type, instead of what the backend device is exposing in pi_prot_type.
Since this value is already set in sbc_check_prot(), go ahead and use it to
allow protected fabrics to function with unprotected devices.
Reviewed-by: Martin Petersen <martin.petersen@oracle.com>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/target_core_sbc.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 9a2f9d3a6e70..95a7a7444965 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -1167,7 +1167,7 @@ sbc_dif_generate(struct se_cmd *cmd) | |||
1167 | sdt = paddr + offset; | 1167 | sdt = paddr + offset; |
1168 | sdt->guard_tag = cpu_to_be16(crc_t10dif(daddr + j, | 1168 | sdt->guard_tag = cpu_to_be16(crc_t10dif(daddr + j, |
1169 | dev->dev_attrib.block_size)); | 1169 | dev->dev_attrib.block_size)); |
1170 | if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE1_PROT) | 1170 | if (cmd->prot_type == TARGET_DIF_TYPE1_PROT) |
1171 | sdt->ref_tag = cpu_to_be32(sector & 0xffffffff); | 1171 | sdt->ref_tag = cpu_to_be32(sector & 0xffffffff); |
1172 | sdt->app_tag = 0; | 1172 | sdt->app_tag = 0; |
1173 | 1173 | ||
@@ -1186,9 +1186,10 @@ sbc_dif_generate(struct se_cmd *cmd) | |||
1186 | } | 1186 | } |
1187 | 1187 | ||
1188 | static sense_reason_t | 1188 | static sense_reason_t |
1189 | sbc_dif_v1_verify(struct se_device *dev, struct se_dif_v1_tuple *sdt, | 1189 | sbc_dif_v1_verify(struct se_cmd *cmd, struct se_dif_v1_tuple *sdt, |
1190 | const void *p, sector_t sector, unsigned int ei_lba) | 1190 | const void *p, sector_t sector, unsigned int ei_lba) |
1191 | { | 1191 | { |
1192 | struct se_device *dev = cmd->se_dev; | ||
1192 | int block_size = dev->dev_attrib.block_size; | 1193 | int block_size = dev->dev_attrib.block_size; |
1193 | __be16 csum; | 1194 | __be16 csum; |
1194 | 1195 | ||
@@ -1201,7 +1202,7 @@ sbc_dif_v1_verify(struct se_device *dev, struct se_dif_v1_tuple *sdt, | |||
1201 | return TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; | 1202 | return TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; |
1202 | } | 1203 | } |
1203 | 1204 | ||
1204 | if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE1_PROT && | 1205 | if (cmd->prot_type == TARGET_DIF_TYPE1_PROT && |
1205 | be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) { | 1206 | be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) { |
1206 | pr_err("DIFv1 Type 1 reference failed on sector: %llu tag: 0x%08x" | 1207 | pr_err("DIFv1 Type 1 reference failed on sector: %llu tag: 0x%08x" |
1207 | " sector MSB: 0x%08x\n", (unsigned long long)sector, | 1208 | " sector MSB: 0x%08x\n", (unsigned long long)sector, |
@@ -1209,7 +1210,7 @@ sbc_dif_v1_verify(struct se_device *dev, struct se_dif_v1_tuple *sdt, | |||
1209 | return TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; | 1210 | return TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; |
1210 | } | 1211 | } |
1211 | 1212 | ||
1212 | if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE2_PROT && | 1213 | if (cmd->prot_type == TARGET_DIF_TYPE2_PROT && |
1213 | be32_to_cpu(sdt->ref_tag) != ei_lba) { | 1214 | be32_to_cpu(sdt->ref_tag) != ei_lba) { |
1214 | pr_err("DIFv1 Type 2 reference failed on sector: %llu tag: 0x%08x" | 1215 | pr_err("DIFv1 Type 2 reference failed on sector: %llu tag: 0x%08x" |
1215 | " ei_lba: 0x%08x\n", (unsigned long long)sector, | 1216 | " ei_lba: 0x%08x\n", (unsigned long long)sector, |
@@ -1293,7 +1294,7 @@ sbc_dif_verify_write(struct se_cmd *cmd, sector_t start, unsigned int sectors, | |||
1293 | (unsigned long long)sector, sdt->guard_tag, | 1294 | (unsigned long long)sector, sdt->guard_tag, |
1294 | sdt->app_tag, be32_to_cpu(sdt->ref_tag)); | 1295 | sdt->app_tag, be32_to_cpu(sdt->ref_tag)); |
1295 | 1296 | ||
1296 | rc = sbc_dif_v1_verify(dev, sdt, daddr + j, sector, | 1297 | rc = sbc_dif_v1_verify(cmd, sdt, daddr + j, sector, |
1297 | ei_lba); | 1298 | ei_lba); |
1298 | if (rc) { | 1299 | if (rc) { |
1299 | kunmap_atomic(paddr); | 1300 | kunmap_atomic(paddr); |
@@ -1354,7 +1355,7 @@ __sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, | |||
1354 | continue; | 1355 | continue; |
1355 | } | 1356 | } |
1356 | 1357 | ||
1357 | rc = sbc_dif_v1_verify(dev, sdt, daddr + j, sector, | 1358 | rc = sbc_dif_v1_verify(cmd, sdt, daddr + j, sector, |
1358 | ei_lba); | 1359 | ei_lba); |
1359 | if (rc) { | 1360 | if (rc) { |
1360 | kunmap_atomic(paddr); | 1361 | kunmap_atomic(paddr); |