aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/isert
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-03-17 06:52:18 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-04-07 04:48:49 -0400
commit96b7973e1c59e9ddde27bca882411c3980125330 (patch)
tree6103864aba97f59cbd73c88e83a6cf3789bb9178 /drivers/infiniband/ulp/isert
parent897bb2c9162fa8f03653693a751b473cd131ee60 (diff)
Target/iser: Move check signature status to a function
Remove code duplication from RDMA_READ and RDMA_WRITE completions that do basically the same check. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/infiniband/ulp/isert')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c115
1 files changed, 50 insertions, 65 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index faec22404da5..e2d48a9d828a 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -1657,6 +1657,50 @@ isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd,
1657 isert_put_cmd(isert_cmd); 1657 isert_put_cmd(isert_cmd);
1658} 1658}
1659 1659
1660static int
1661isert_check_pi_status(struct se_cmd *se_cmd, struct ib_mr *sig_mr)
1662{
1663 struct ib_mr_status mr_status;
1664 int ret;
1665
1666 ret = ib_check_mr_status(sig_mr, IB_MR_CHECK_SIG_STATUS, &mr_status);
1667 if (ret) {
1668 pr_err("ib_check_mr_status failed, ret %d\n", ret);
1669 goto fail_mr_status;
1670 }
1671
1672 if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {
1673 u64 sec_offset_err;
1674 u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8;
1675
1676 switch (mr_status.sig_err.err_type) {
1677 case IB_SIG_BAD_GUARD:
1678 se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
1679 break;
1680 case IB_SIG_BAD_REFTAG:
1681 se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
1682 break;
1683 case IB_SIG_BAD_APPTAG:
1684 se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
1685 break;
1686 }
1687 sec_offset_err = mr_status.sig_err.sig_err_offset;
1688 do_div(sec_offset_err, block_size);
1689 se_cmd->bad_sector = sec_offset_err + se_cmd->t_task_lba;
1690
1691 pr_err("isert: PI error found type %d at sector 0x%llx "
1692 "expected 0x%x vs actual 0x%x\n",
1693 mr_status.sig_err.err_type,
1694 (unsigned long long)se_cmd->bad_sector,
1695 mr_status.sig_err.expected,
1696 mr_status.sig_err.actual);
1697 ret = 1;
1698 }
1699
1700fail_mr_status:
1701 return ret;
1702}
1703
1660static void 1704static void
1661isert_completion_rdma_write(struct iser_tx_desc *tx_desc, 1705isert_completion_rdma_write(struct iser_tx_desc *tx_desc,
1662 struct isert_cmd *isert_cmd) 1706 struct isert_cmd *isert_cmd)
@@ -1666,44 +1710,14 @@ isert_completion_rdma_write(struct iser_tx_desc *tx_desc,
1666 struct se_cmd *se_cmd = &cmd->se_cmd; 1710 struct se_cmd *se_cmd = &cmd->se_cmd;
1667 struct isert_conn *isert_conn = isert_cmd->conn; 1711 struct isert_conn *isert_conn = isert_cmd->conn;
1668 struct isert_device *device = isert_conn->conn_device; 1712 struct isert_device *device = isert_conn->conn_device;
1669 struct ib_mr_status mr_status;
1670 int ret = 0; 1713 int ret = 0;
1671 1714
1672 if (wr->fr_desc && wr->fr_desc->ind & ISERT_PROTECTED) { 1715 if (wr->fr_desc && wr->fr_desc->ind & ISERT_PROTECTED) {
1673 ret = ib_check_mr_status(wr->fr_desc->pi_ctx->sig_mr, 1716 ret = isert_check_pi_status(se_cmd,
1674 IB_MR_CHECK_SIG_STATUS, &mr_status); 1717 wr->fr_desc->pi_ctx->sig_mr);
1675 if (ret) { 1718 wr->fr_desc->ind &= ~ISERT_PROTECTED;
1676 pr_err("ib_check_mr_status failed, ret %d\n", ret);
1677 goto fail_mr_status;
1678 }
1679 if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {
1680 u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8;
1681
1682 switch (mr_status.sig_err.err_type) {
1683 case IB_SIG_BAD_GUARD:
1684 se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
1685 break;
1686 case IB_SIG_BAD_REFTAG:
1687 se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
1688 break;
1689 case IB_SIG_BAD_APPTAG:
1690 se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
1691 break;
1692 }
1693 se_cmd->bad_sector = mr_status.sig_err.sig_err_offset;
1694 do_div(se_cmd->bad_sector, block_size);
1695
1696 pr_err("isert: PI error found type %d at sector 0x%llx "
1697 "expected 0x%x vs actual 0x%x\n",
1698 mr_status.sig_err.err_type,
1699 (unsigned long long)se_cmd->bad_sector,
1700 mr_status.sig_err.expected,
1701 mr_status.sig_err.actual);
1702 ret = 1;
1703 }
1704 } 1719 }
1705 1720
1706fail_mr_status:
1707 device->unreg_rdma_mem(isert_cmd, isert_conn); 1721 device->unreg_rdma_mem(isert_cmd, isert_conn);
1708 wr->send_wr_num = 0; 1722 wr->send_wr_num = 0;
1709 if (ret) 1723 if (ret)
@@ -1722,43 +1736,14 @@ isert_completion_rdma_read(struct iser_tx_desc *tx_desc,
1722 struct se_cmd *se_cmd = &cmd->se_cmd; 1736 struct se_cmd *se_cmd = &cmd->se_cmd;
1723 struct isert_conn *isert_conn = isert_cmd->conn; 1737 struct isert_conn *isert_conn = isert_cmd->conn;
1724 struct isert_device *device = isert_conn->conn_device; 1738 struct isert_device *device = isert_conn->conn_device;
1725 struct ib_mr_status mr_status;
1726 int ret; 1739 int ret;
1727 1740
1728 if (wr->fr_desc && wr->fr_desc->ind & ISERT_PROTECTED) { 1741 if (wr->fr_desc && wr->fr_desc->ind & ISERT_PROTECTED) {
1729 ret = ib_check_mr_status(wr->fr_desc->pi_ctx->sig_mr, 1742 ret = isert_check_pi_status(se_cmd,
1730 IB_MR_CHECK_SIG_STATUS, &mr_status); 1743 wr->fr_desc->pi_ctx->sig_mr);
1731 if (ret) { 1744 wr->fr_desc->ind &= ~ISERT_PROTECTED;
1732 pr_err("ib_check_mr_status failed, ret %d\n", ret);
1733 goto fail_mr_status;
1734 }
1735 if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {
1736 u32 block_size = se_cmd->se_dev->dev_attrib.block_size + 8;
1737
1738 switch (mr_status.sig_err.err_type) {
1739 case IB_SIG_BAD_GUARD:
1740 se_cmd->pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
1741 break;
1742 case IB_SIG_BAD_REFTAG:
1743 se_cmd->pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
1744 break;
1745 case IB_SIG_BAD_APPTAG:
1746 se_cmd->pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
1747 break;
1748 }
1749 se_cmd->bad_sector = mr_status.sig_err.sig_err_offset;
1750 do_div(se_cmd->bad_sector, block_size);
1751
1752 pr_err("isert: PI error found type %d at sector 0x%llx "
1753 "expected 0x%x vs actual 0x%x\n",
1754 mr_status.sig_err.err_type,
1755 (unsigned long long)se_cmd->bad_sector,
1756 mr_status.sig_err.expected,
1757 mr_status.sig_err.actual);
1758 }
1759 } 1745 }
1760 1746
1761fail_mr_status:
1762 iscsit_stop_dataout_timer(cmd); 1747 iscsit_stop_dataout_timer(cmd);
1763 device->unreg_rdma_mem(isert_cmd, isert_conn); 1748 device->unreg_rdma_mem(isert_cmd, isert_conn);
1764 cmd->write_data_done = wr->data.len; 1749 cmd->write_data_done = wr->data.len;