diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-03-17 06:52:18 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-04-07 04:48:49 -0400 |
commit | 96b7973e1c59e9ddde27bca882411c3980125330 (patch) | |
tree | 6103864aba97f59cbd73c88e83a6cf3789bb9178 /drivers/infiniband/ulp/isert | |
parent | 897bb2c9162fa8f03653693a751b473cd131ee60 (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.c | 115 |
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 | ||
1660 | static int | ||
1661 | isert_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 | |||
1700 | fail_mr_status: | ||
1701 | return ret; | ||
1702 | } | ||
1703 | |||
1660 | static void | 1704 | static void |
1661 | isert_completion_rdma_write(struct iser_tx_desc *tx_desc, | 1705 | isert_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 | ||
1706 | fail_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 | ||
1761 | fail_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; |