diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/tcm_qla2xxx.c')
-rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.c | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index 8e8ab0fa9672..7443e4efa3ae 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
@@ -531,6 +531,24 @@ static void tcm_qla2xxx_handle_data_work(struct work_struct *work) | |||
531 | return; | 531 | return; |
532 | } | 532 | } |
533 | 533 | ||
534 | switch (cmd->dif_err_code) { | ||
535 | case DIF_ERR_GRD: | ||
536 | cmd->se_cmd.pi_err = | ||
537 | TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; | ||
538 | break; | ||
539 | case DIF_ERR_REF: | ||
540 | cmd->se_cmd.pi_err = | ||
541 | TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; | ||
542 | break; | ||
543 | case DIF_ERR_APP: | ||
544 | cmd->se_cmd.pi_err = | ||
545 | TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; | ||
546 | break; | ||
547 | case DIF_ERR_NONE: | ||
548 | default: | ||
549 | break; | ||
550 | } | ||
551 | |||
534 | if (cmd->se_cmd.pi_err) | 552 | if (cmd->se_cmd.pi_err) |
535 | transport_generic_request_failure(&cmd->se_cmd, | 553 | transport_generic_request_failure(&cmd->se_cmd, |
536 | cmd->se_cmd.pi_err); | 554 | cmd->se_cmd.pi_err); |
@@ -555,25 +573,23 @@ static void tcm_qla2xxx_handle_data(struct qla_tgt_cmd *cmd) | |||
555 | queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work); | 573 | queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work); |
556 | } | 574 | } |
557 | 575 | ||
558 | static void tcm_qla2xxx_handle_dif_work(struct work_struct *work) | 576 | static int tcm_qla2xxx_chk_dif_tags(uint32_t tag) |
559 | { | 577 | { |
560 | struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work); | 578 | return 0; |
561 | |||
562 | /* take an extra kref to prevent cmd free too early. | ||
563 | * need to wait for SCSI status/check condition to | ||
564 | * finish responding generate by transport_generic_request_failure. | ||
565 | */ | ||
566 | kref_get(&cmd->se_cmd.cmd_kref); | ||
567 | transport_generic_request_failure(&cmd->se_cmd, cmd->se_cmd.pi_err); | ||
568 | } | 579 | } |
569 | 580 | ||
570 | /* | 581 | static int tcm_qla2xxx_dif_tags(struct qla_tgt_cmd *cmd, |
571 | * Called from qla_target.c:qlt_do_ctio_completion() | 582 | uint16_t *pfw_prot_opts) |
572 | */ | ||
573 | static void tcm_qla2xxx_handle_dif_err(struct qla_tgt_cmd *cmd) | ||
574 | { | 583 | { |
575 | INIT_WORK(&cmd->work, tcm_qla2xxx_handle_dif_work); | 584 | struct se_cmd *se_cmd = &cmd->se_cmd; |
576 | queue_work(tcm_qla2xxx_free_wq, &cmd->work); | 585 | |
586 | if (!(se_cmd->prot_checks & TARGET_DIF_CHECK_GUARD)) | ||
587 | *pfw_prot_opts |= PO_DISABLE_GUARD_CHECK; | ||
588 | |||
589 | if (!(se_cmd->prot_checks & TARGET_DIF_CHECK_APPTAG)) | ||
590 | *pfw_prot_opts |= PO_DIS_APP_TAG_VALD; | ||
591 | |||
592 | return 0; | ||
577 | } | 593 | } |
578 | 594 | ||
579 | /* | 595 | /* |
@@ -1610,7 +1626,6 @@ static void tcm_qla2xxx_update_sess(struct fc_port *sess, port_id_t s_id, | |||
1610 | static struct qla_tgt_func_tmpl tcm_qla2xxx_template = { | 1626 | static struct qla_tgt_func_tmpl tcm_qla2xxx_template = { |
1611 | .handle_cmd = tcm_qla2xxx_handle_cmd, | 1627 | .handle_cmd = tcm_qla2xxx_handle_cmd, |
1612 | .handle_data = tcm_qla2xxx_handle_data, | 1628 | .handle_data = tcm_qla2xxx_handle_data, |
1613 | .handle_dif_err = tcm_qla2xxx_handle_dif_err, | ||
1614 | .handle_tmr = tcm_qla2xxx_handle_tmr, | 1629 | .handle_tmr = tcm_qla2xxx_handle_tmr, |
1615 | .free_cmd = tcm_qla2xxx_free_cmd, | 1630 | .free_cmd = tcm_qla2xxx_free_cmd, |
1616 | .free_mcmd = tcm_qla2xxx_free_mcmd, | 1631 | .free_mcmd = tcm_qla2xxx_free_mcmd, |
@@ -1622,6 +1637,8 @@ static struct qla_tgt_func_tmpl tcm_qla2xxx_template = { | |||
1622 | .clear_nacl_from_fcport_map = tcm_qla2xxx_clear_nacl_from_fcport_map, | 1637 | .clear_nacl_from_fcport_map = tcm_qla2xxx_clear_nacl_from_fcport_map, |
1623 | .put_sess = tcm_qla2xxx_put_sess, | 1638 | .put_sess = tcm_qla2xxx_put_sess, |
1624 | .shutdown_sess = tcm_qla2xxx_shutdown_sess, | 1639 | .shutdown_sess = tcm_qla2xxx_shutdown_sess, |
1640 | .get_dif_tags = tcm_qla2xxx_dif_tags, | ||
1641 | .chk_dif_tags = tcm_qla2xxx_chk_dif_tags, | ||
1625 | }; | 1642 | }; |
1626 | 1643 | ||
1627 | static int tcm_qla2xxx_init_lport(struct tcm_qla2xxx_lport *lport) | 1644 | static int tcm_qla2xxx_init_lport(struct tcm_qla2xxx_lport *lport) |