diff options
-rw-r--r-- | drivers/target/loopback/tcm_loop.c | 4 | ||||
-rw-r--r-- | drivers/target/target_core_sbc.c | 2 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 12 | ||||
-rw-r--r-- | include/target/target_core_base.h | 1 |
4 files changed, 13 insertions, 6 deletions
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index fadad7c5f635..a49ef0a49fa9 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c | |||
@@ -212,6 +212,10 @@ static void tcm_loop_submission_work(struct work_struct *work) | |||
212 | se_cmd->se_cmd_flags |= SCF_BIDI; | 212 | se_cmd->se_cmd_flags |= SCF_BIDI; |
213 | 213 | ||
214 | } | 214 | } |
215 | |||
216 | if (!scsi_prot_sg_count(sc) && scsi_get_prot_op(sc) != SCSI_PROT_NORMAL) | ||
217 | se_cmd->prot_pto = true; | ||
218 | |||
215 | rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, | 219 | rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, |
216 | &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, | 220 | &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, |
217 | scsi_bufflen(sc), tcm_loop_sam_attr(sc), | 221 | scsi_bufflen(sc), tcm_loop_sam_attr(sc), |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index a1e75dd636ac..c301d9b6874d 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -634,7 +634,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb, | |||
634 | { | 634 | { |
635 | u8 protect = cdb[1] >> 5; | 635 | u8 protect = cdb[1] >> 5; |
636 | 636 | ||
637 | if (!cmd->t_prot_sg || !cmd->t_prot_nents) | 637 | if ((!cmd->t_prot_sg || !cmd->t_prot_nents) && cmd->prot_pto) |
638 | return true; | 638 | return true; |
639 | 639 | ||
640 | switch (dev->dev_attrib.pi_prot_type) { | 640 | switch (dev->dev_attrib.pi_prot_type) { |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 4653d826e595..0a359fa82bd3 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1365,6 +1365,13 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess | |||
1365 | target_put_sess_cmd(se_sess, se_cmd); | 1365 | target_put_sess_cmd(se_sess, se_cmd); |
1366 | return 0; | 1366 | return 0; |
1367 | } | 1367 | } |
1368 | |||
1369 | rc = target_setup_cmd_from_cdb(se_cmd, cdb); | ||
1370 | if (rc != 0) { | ||
1371 | transport_generic_request_failure(se_cmd, rc); | ||
1372 | return 0; | ||
1373 | } | ||
1374 | |||
1368 | /* | 1375 | /* |
1369 | * Save pointers for SGLs containing protection information, | 1376 | * Save pointers for SGLs containing protection information, |
1370 | * if present. | 1377 | * if present. |
@@ -1374,11 +1381,6 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess | |||
1374 | se_cmd->t_prot_nents = sgl_prot_count; | 1381 | se_cmd->t_prot_nents = sgl_prot_count; |
1375 | } | 1382 | } |
1376 | 1383 | ||
1377 | rc = target_setup_cmd_from_cdb(se_cmd, cdb); | ||
1378 | if (rc != 0) { | ||
1379 | transport_generic_request_failure(se_cmd, rc); | ||
1380 | return 0; | ||
1381 | } | ||
1382 | /* | 1384 | /* |
1383 | * When a non zero sgl_count has been passed perform SGL passthrough | 1385 | * When a non zero sgl_count has been passed perform SGL passthrough |
1384 | * mapping for pre-allocated fabric memory instead of having target | 1386 | * mapping for pre-allocated fabric memory instead of having target |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 5ae92492d1ee..82cb4ed06f71 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -570,6 +570,7 @@ struct se_cmd { | |||
570 | enum target_prot_ho prot_handover; | 570 | enum target_prot_ho prot_handover; |
571 | sense_reason_t pi_err; | 571 | sense_reason_t pi_err; |
572 | sector_t bad_sector; | 572 | sector_t bad_sector; |
573 | bool prot_pto; | ||
573 | }; | 574 | }; |
574 | 575 | ||
575 | struct se_ua { | 576 | struct se_ua { |