Move DIF status check to a seperate routine to be shared by completion handlers for RDMA READ/WRITE. Nic, please apply this one on rdma-dif. I'll have an easier time rebasing once we can get it in to for-next. Signed-off-by: Sagi Grimberg <sagig@xxxxxxxxxxxx> --- drivers/infiniband/ulp/isert/ib_isert.c | 120 ++++++++++++++----------------- 1 files changed, 53 insertions(+), 67 deletions(-) diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 1cf8824..05153f4 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -1657,6 +1657,47 @@ isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, isert_put_cmd(isert_cmd); } +static int +isert_check_dif_status(struct ib_mr *sig_mr, struct se_cmd *se_cmd) +{ + struct ib_mr_status mr_status; + int ret; + + ret = ib_check_mr_status(sig_mr, IB_MR_CHECK_SIG_STATUS, &mr_status); + if (ret) { + pr_err("ib_check_mr_status failed, ret %d\n", ret); + return ret; + } + if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) { + u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8; + + switch (mr_status.sig_err.err_type) { + case IB_SIG_BAD_GUARD: + se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; + break; + case IB_SIG_BAD_REFTAG: + se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; + break; + case IB_SIG_BAD_APPTAG: + se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; + break; + } + se_cmd->bad_sector = mr_status.sig_err.sig_err_offset; + do_div(se_cmd->bad_sector, block_size); + se_cmd->bad_sector += se_cmd->t_task_lba; + + pr_err("isert: PI error found cmd=%p type %d at sector 0x%llx " + "expected 0x%x vs actual 0x%x\n", + se_cmd, mr_status.sig_err.err_type, + (unsigned long long)se_cmd->bad_sector, + mr_status.sig_err.expected, + mr_status.sig_err.actual); + return -1; + } + + return 0; +} + static void isert_completion_rdma_write(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd) @@ -1666,44 +1707,14 @@ isert_completion_rdma_write(struct iser_tx_desc *tx_desc, struct se_cmd *se_cmd = &cmd->se_cmd; struct isert_conn *isert_conn = isert_cmd->conn; struct isert_device *device = isert_conn->conn_device; - struct ib_mr_status mr_status; int ret = 0; if (wr->fr_desc && wr->fr_desc->ind & ISERT_PROTECTED) { - ret = ib_check_mr_status(wr->fr_desc->pi_ctx->sig_mr, - IB_MR_CHECK_SIG_STATUS, &mr_status); - if (ret) { - pr_err("ib_check_mr_status failed, ret %d\n", ret); - goto fail_mr_status; - } - if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) { - u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8; - - switch (mr_status.sig_err.err_type) { - case IB_SIG_BAD_GUARD: - se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; - break; - case IB_SIG_BAD_REFTAG: - se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; - break; - case IB_SIG_BAD_APPTAG: - se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; - break; - } - se_cmd->bad_sector = mr_status.sig_err.sig_err_offset; - do_div(se_cmd->bad_sector, block_size); - - pr_err("isert: PI error found type %d at sector 0x%llx " - "expected 0x%x vs actual 0x%x\n", - mr_status.sig_err.err_type, - (unsigned long long)se_cmd->bad_sector, - mr_status.sig_err.expected, - mr_status.sig_err.actual); - ret = 1; - } + ret = isert_check_dif_status(wr->fr_desc->pi_ctx->sig_mr, + se_cmd); + wr->fr_desc->ind &= ~ISERT_PROTECTED; } -fail_mr_status: device->unreg_rdma_mem(isert_cmd, isert_conn); if (ret) transport_send_check_condition_and_sense(se_cmd, @@ -1721,43 +1732,14 @@ isert_completion_rdma_read(struct iser_tx_desc *tx_desc, struct se_cmd *se_cmd = &cmd->se_cmd; struct isert_conn *isert_conn = isert_cmd->conn; struct isert_device *device = isert_conn->conn_device; - struct ib_mr_status mr_status; - int ret; + int ret = 0; if (wr->fr_desc && wr->fr_desc->ind & ISERT_PROTECTED) { - ret = ib_check_mr_status(wr->fr_desc->pi_ctx->sig_mr, - IB_MR_CHECK_SIG_STATUS, &mr_status); - if (ret) { - pr_err("ib_check_mr_status failed, ret %d\n", ret); - goto fail_mr_status; - } - if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) { - u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8; - - switch (mr_status.sig_err.err_type) { - case IB_SIG_BAD_GUARD: - se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; - break; - case IB_SIG_BAD_REFTAG: - se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; - break; - case IB_SIG_BAD_APPTAG: - se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; - break; - } - se_cmd->bad_sector = mr_status.sig_err.sig_err_offset; - do_div(se_cmd->bad_sector, block_size); - - pr_err("isert: PI error found type %d at sector 0x%llx " - "expected 0x%x vs actual 0x%x\n", - mr_status.sig_err.err_type, - (unsigned long long)se_cmd->bad_sector, - mr_status.sig_err.expected, - mr_status.sig_err.actual); - } + ret = isert_check_dif_status(wr->fr_desc->pi_ctx->sig_mr, + se_cmd); + wr->fr_desc->ind &= ~ISERT_PROTECTED; } -fail_mr_status: iscsit_stop_dataout_timer(cmd); device->unreg_rdma_mem(isert_cmd, isert_conn); cmd->write_data_done = wr->data.len; @@ -1768,7 +1750,11 @@ fail_mr_status: cmd->i_state = ISTATE_RECEIVED_LAST_DATAOUT; spin_unlock_bh(&cmd->istate_lock); - target_execute_cmd(se_cmd); + if (ret) + transport_send_check_condition_and_sense(se_cmd, + se_cmd->pi_err, 0); + else + target_execute_cmd(se_cmd); } static void -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html