diff options
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/loopback/tcm_loop.c | 15 | ||||
-rw-r--r-- | drivers/target/target_core_sbc.c | 15 |
2 files changed, 25 insertions, 5 deletions
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index c886ad1c39fb..1f4c015e9078 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c | |||
@@ -179,7 +179,7 @@ static void tcm_loop_submission_work(struct work_struct *work) | |||
179 | struct tcm_loop_hba *tl_hba; | 179 | struct tcm_loop_hba *tl_hba; |
180 | struct tcm_loop_tpg *tl_tpg; | 180 | struct tcm_loop_tpg *tl_tpg; |
181 | struct scatterlist *sgl_bidi = NULL; | 181 | struct scatterlist *sgl_bidi = NULL; |
182 | u32 sgl_bidi_count = 0; | 182 | u32 sgl_bidi_count = 0, transfer_length; |
183 | int rc; | 183 | int rc; |
184 | 184 | ||
185 | tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); | 185 | tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); |
@@ -213,12 +213,21 @@ static void tcm_loop_submission_work(struct work_struct *work) | |||
213 | 213 | ||
214 | } | 214 | } |
215 | 215 | ||
216 | if (!scsi_prot_sg_count(sc) && scsi_get_prot_op(sc) != SCSI_PROT_NORMAL) | 216 | transfer_length = scsi_transfer_length(sc); |
217 | if (!scsi_prot_sg_count(sc) && | ||
218 | scsi_get_prot_op(sc) != SCSI_PROT_NORMAL) { | ||
217 | se_cmd->prot_pto = true; | 219 | se_cmd->prot_pto = true; |
220 | /* | ||
221 | * loopback transport doesn't support | ||
222 | * WRITE_GENERATE, READ_STRIP protection | ||
223 | * information operations, go ahead unprotected. | ||
224 | */ | ||
225 | transfer_length = scsi_bufflen(sc); | ||
226 | } | ||
218 | 227 | ||
219 | rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, | 228 | rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, |
220 | &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, | 229 | &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, |
221 | scsi_bufflen(sc), tcm_loop_sam_attr(sc), | 230 | transfer_length, tcm_loop_sam_attr(sc), |
222 | sc->sc_data_direction, 0, | 231 | sc->sc_data_direction, 0, |
223 | scsi_sglist(sc), scsi_sg_count(sc), | 232 | scsi_sglist(sc), scsi_sg_count(sc), |
224 | sgl_bidi, sgl_bidi_count, | 233 | sgl_bidi, sgl_bidi_count, |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 1d3a626bf24f..bd78d9235ac6 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -647,8 +647,19 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb, | |||
647 | 647 | ||
648 | cmd->prot_type = dev->dev_attrib.pi_prot_type; | 648 | cmd->prot_type = dev->dev_attrib.pi_prot_type; |
649 | cmd->prot_length = dev->prot_length * sectors; | 649 | cmd->prot_length = dev->prot_length * sectors; |
650 | pr_debug("%s: prot_type=%d, prot_length=%d prot_op=%d prot_checks=%d\n", | 650 | |
651 | __func__, cmd->prot_type, cmd->prot_length, | 651 | /** |
652 | * In case protection information exists over the wire | ||
653 | * we modify command data length to describe pure data. | ||
654 | * The actual transfer length is data length + protection | ||
655 | * length | ||
656 | **/ | ||
657 | if (protect) | ||
658 | cmd->data_length = sectors * dev->dev_attrib.block_size; | ||
659 | |||
660 | pr_debug("%s: prot_type=%d, data_length=%d, prot_length=%d " | ||
661 | "prot_op=%d prot_checks=%d\n", | ||
662 | __func__, cmd->prot_type, cmd->data_length, cmd->prot_length, | ||
652 | cmd->prot_op, cmd->prot_checks); | 663 | cmd->prot_op, cmd->prot_checks); |
653 | 664 | ||
654 | return true; | 665 | return true; |