aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2014-04-02 17:34:11 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-04-07 04:48:57 -0400
commit395ccb2531021974d309f26e5fb08a8240ac5f84 (patch)
tree29209107f67d9d16e9e65c7174bbe74978805e85
parenta84bf9eedb550e38376008f32fcf0610867d3067 (diff)
target/sbc: Add sbc_dif_read_strip software emulation
Split up __sbc_dif_verify_read() so that VERIFY READ emulation can perform target-core specific READ_STRIP, seperate from the existing FILEIO/RAMDISK backend emulation code. Also add sbc_dif_read_strip() in order to determine number of sectors using cmd->prot_length, and skip the extra sbc_dif_copy_prot(). Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Cc: Martin K. Petersen <martin.petersen@oracle.com> Cc: Or Gerlitz <ogerlitz@mellanox.com> Cc: Quinn Tran <quinn.tran@qlogic.com> Cc: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_sbc.c31
-rw-r--r--include/target/target_core_backend.h1
2 files changed, 28 insertions, 4 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index cc8c0ba53930..e0229592ec55 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -1271,9 +1271,9 @@ sbc_dif_verify_write(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1271} 1271}
1272EXPORT_SYMBOL(sbc_dif_verify_write); 1272EXPORT_SYMBOL(sbc_dif_verify_write);
1273 1273
1274sense_reason_t 1274static sense_reason_t
1275sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, 1275__sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1276 unsigned int ei_lba, struct scatterlist *sg, int sg_off) 1276 unsigned int ei_lba, struct scatterlist *sg, int sg_off)
1277{ 1277{
1278 struct se_device *dev = cmd->se_dev; 1278 struct se_device *dev = cmd->se_dev;
1279 struct se_dif_v1_tuple *sdt; 1279 struct se_dif_v1_tuple *sdt;
@@ -1326,8 +1326,31 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1326 kunmap_atomic(paddr); 1326 kunmap_atomic(paddr);
1327 kunmap_atomic(daddr); 1327 kunmap_atomic(daddr);
1328 } 1328 }
1329 sbc_dif_copy_prot(cmd, sectors, true, sg, sg_off);
1330 1329
1331 return 0; 1330 return 0;
1332} 1331}
1332
1333sense_reason_t
1334sbc_dif_read_strip(struct se_cmd *cmd)
1335{
1336 struct se_device *dev = cmd->se_dev;
1337 u32 sectors = cmd->prot_length / dev->prot_length;
1338
1339 return __sbc_dif_verify_read(cmd, cmd->t_task_lba, sectors, 0,
1340 cmd->t_prot_sg, 0);
1341}
1342
1343sense_reason_t
1344sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1345 unsigned int ei_lba, struct scatterlist *sg, int sg_off)
1346{
1347 sense_reason_t rc;
1348
1349 rc = __sbc_dif_verify_read(cmd, start, sectors, ei_lba, sg, sg_off);
1350 if (rc)
1351 return rc;
1352
1353 sbc_dif_copy_prot(cmd, sectors, true, sg, sg_off);
1354 return 0;
1355}
1333EXPORT_SYMBOL(sbc_dif_verify_read); 1356EXPORT_SYMBOL(sbc_dif_verify_read);
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h
index 0a36c6cb93b2..3a1c1eea1fff 100644
--- a/include/target/target_core_backend.h
+++ b/include/target/target_core_backend.h
@@ -78,6 +78,7 @@ sense_reason_t sbc_dif_verify_write(struct se_cmd *, sector_t, unsigned int,
78 unsigned int, struct scatterlist *, int); 78 unsigned int, struct scatterlist *, int);
79sense_reason_t sbc_dif_verify_read(struct se_cmd *, sector_t, unsigned int, 79sense_reason_t sbc_dif_verify_read(struct se_cmd *, sector_t, unsigned int,
80 unsigned int, struct scatterlist *, int); 80 unsigned int, struct scatterlist *, int);
81sense_reason_t sbc_dif_read_strip(struct se_cmd *);
81 82
82void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *); 83void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
83int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); 84int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);