diff options
| author | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-04-02 17:34:11 -0400 |
|---|---|---|
| committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-04-07 04:48:57 -0400 |
| commit | 395ccb2531021974d309f26e5fb08a8240ac5f84 (patch) | |
| tree | 29209107f67d9d16e9e65c7174bbe74978805e85 /drivers/target | |
| parent | a84bf9eedb550e38376008f32fcf0610867d3067 (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>
Diffstat (limited to 'drivers/target')
| -rw-r--r-- | drivers/target/target_core_sbc.c | 31 |
1 files changed, 27 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 | } |
| 1272 | EXPORT_SYMBOL(sbc_dif_verify_write); | 1272 | EXPORT_SYMBOL(sbc_dif_verify_write); |
| 1273 | 1273 | ||
| 1274 | sense_reason_t | 1274 | static sense_reason_t |
| 1275 | sbc_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 | |||
| 1333 | sense_reason_t | ||
| 1334 | sbc_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 | |||
| 1343 | sense_reason_t | ||
| 1344 | sbc_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 | } | ||
| 1333 | EXPORT_SYMBOL(sbc_dif_verify_read); | 1356 | EXPORT_SYMBOL(sbc_dif_verify_read); |
