diff options
Diffstat (limited to 'drivers/infiniband/ulp/isert/ib_isert.c')
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 18ada7fb0fc9..f7801aeb7628 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c | |||
@@ -1580,7 +1580,7 @@ isert_unreg_rdma(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn) | |||
1580 | } | 1580 | } |
1581 | 1581 | ||
1582 | static void | 1582 | static void |
1583 | isert_put_cmd(struct isert_cmd *isert_cmd) | 1583 | isert_put_cmd(struct isert_cmd *isert_cmd, bool comp_err) |
1584 | { | 1584 | { |
1585 | struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; | 1585 | struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; |
1586 | struct isert_conn *isert_conn = isert_cmd->conn; | 1586 | struct isert_conn *isert_conn = isert_cmd->conn; |
@@ -1596,8 +1596,21 @@ isert_put_cmd(struct isert_cmd *isert_cmd) | |||
1596 | list_del_init(&cmd->i_conn_node); | 1596 | list_del_init(&cmd->i_conn_node); |
1597 | spin_unlock_bh(&conn->cmd_lock); | 1597 | spin_unlock_bh(&conn->cmd_lock); |
1598 | 1598 | ||
1599 | if (cmd->data_direction == DMA_TO_DEVICE) | 1599 | if (cmd->data_direction == DMA_TO_DEVICE) { |
1600 | iscsit_stop_dataout_timer(cmd); | 1600 | iscsit_stop_dataout_timer(cmd); |
1601 | /* | ||
1602 | * Check for special case during comp_err where | ||
1603 | * WRITE_PENDING has been handed off from core, | ||
1604 | * but requires an extra target_put_sess_cmd() | ||
1605 | * before transport_generic_free_cmd() below. | ||
1606 | */ | ||
1607 | if (comp_err && | ||
1608 | cmd->se_cmd.t_state == TRANSPORT_WRITE_PENDING) { | ||
1609 | struct se_cmd *se_cmd = &cmd->se_cmd; | ||
1610 | |||
1611 | target_put_sess_cmd(se_cmd->se_sess, se_cmd); | ||
1612 | } | ||
1613 | } | ||
1601 | 1614 | ||
1602 | device->unreg_rdma_mem(isert_cmd, isert_conn); | 1615 | device->unreg_rdma_mem(isert_cmd, isert_conn); |
1603 | transport_generic_free_cmd(&cmd->se_cmd, 0); | 1616 | transport_generic_free_cmd(&cmd->se_cmd, 0); |
@@ -1652,7 +1665,7 @@ isert_unmap_tx_desc(struct iser_tx_desc *tx_desc, struct ib_device *ib_dev) | |||
1652 | 1665 | ||
1653 | static void | 1666 | static void |
1654 | isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, | 1667 | isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, |
1655 | struct ib_device *ib_dev) | 1668 | struct ib_device *ib_dev, bool comp_err) |
1656 | { | 1669 | { |
1657 | if (isert_cmd->pdu_buf_dma != 0) { | 1670 | if (isert_cmd->pdu_buf_dma != 0) { |
1658 | pr_debug("Calling ib_dma_unmap_single for isert_cmd->pdu_buf_dma\n"); | 1671 | pr_debug("Calling ib_dma_unmap_single for isert_cmd->pdu_buf_dma\n"); |
@@ -1662,7 +1675,7 @@ isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, | |||
1662 | } | 1675 | } |
1663 | 1676 | ||
1664 | isert_unmap_tx_desc(tx_desc, ib_dev); | 1677 | isert_unmap_tx_desc(tx_desc, ib_dev); |
1665 | isert_put_cmd(isert_cmd); | 1678 | isert_put_cmd(isert_cmd, comp_err); |
1666 | } | 1679 | } |
1667 | 1680 | ||
1668 | static int | 1681 | static int |
@@ -1787,14 +1800,14 @@ isert_do_control_comp(struct work_struct *work) | |||
1787 | iscsit_tmr_post_handler(cmd, cmd->conn); | 1800 | iscsit_tmr_post_handler(cmd, cmd->conn); |
1788 | 1801 | ||
1789 | cmd->i_state = ISTATE_SENT_STATUS; | 1802 | cmd->i_state = ISTATE_SENT_STATUS; |
1790 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); | 1803 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false); |
1791 | break; | 1804 | break; |
1792 | case ISTATE_SEND_REJECT: | 1805 | case ISTATE_SEND_REJECT: |
1793 | pr_debug("Got isert_do_control_comp ISTATE_SEND_REJECT: >>>\n"); | 1806 | pr_debug("Got isert_do_control_comp ISTATE_SEND_REJECT: >>>\n"); |
1794 | atomic_dec(&isert_conn->post_send_buf_count); | 1807 | atomic_dec(&isert_conn->post_send_buf_count); |
1795 | 1808 | ||
1796 | cmd->i_state = ISTATE_SENT_STATUS; | 1809 | cmd->i_state = ISTATE_SENT_STATUS; |
1797 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); | 1810 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false); |
1798 | break; | 1811 | break; |
1799 | case ISTATE_SEND_LOGOUTRSP: | 1812 | case ISTATE_SEND_LOGOUTRSP: |
1800 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); | 1813 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); |
@@ -1808,7 +1821,7 @@ isert_do_control_comp(struct work_struct *work) | |||
1808 | case ISTATE_SEND_TEXTRSP: | 1821 | case ISTATE_SEND_TEXTRSP: |
1809 | atomic_dec(&isert_conn->post_send_buf_count); | 1822 | atomic_dec(&isert_conn->post_send_buf_count); |
1810 | cmd->i_state = ISTATE_SENT_STATUS; | 1823 | cmd->i_state = ISTATE_SENT_STATUS; |
1811 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); | 1824 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false); |
1812 | break; | 1825 | break; |
1813 | default: | 1826 | default: |
1814 | pr_err("Unknown do_control_comp i_state %d\n", cmd->i_state); | 1827 | pr_err("Unknown do_control_comp i_state %d\n", cmd->i_state); |
@@ -1850,7 +1863,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc, | |||
1850 | atomic_dec(&isert_conn->post_send_buf_count); | 1863 | atomic_dec(&isert_conn->post_send_buf_count); |
1851 | 1864 | ||
1852 | cmd->i_state = ISTATE_SENT_STATUS; | 1865 | cmd->i_state = ISTATE_SENT_STATUS; |
1853 | isert_completion_put(tx_desc, isert_cmd, ib_dev); | 1866 | isert_completion_put(tx_desc, isert_cmd, ib_dev, false); |
1854 | } | 1867 | } |
1855 | 1868 | ||
1856 | static void | 1869 | static void |
@@ -1943,7 +1956,8 @@ isert_cq_drain_comp_llist(struct isert_conn *isert_conn, struct ib_device *ib_de | |||
1943 | &isert_conn->post_send_buf_count); | 1956 | &isert_conn->post_send_buf_count); |
1944 | else | 1957 | else |
1945 | atomic_dec(&isert_conn->post_send_buf_count); | 1958 | atomic_dec(&isert_conn->post_send_buf_count); |
1946 | isert_completion_put(t, t->isert_cmd, ib_dev); | 1959 | |
1960 | isert_completion_put(t, t->isert_cmd, ib_dev, true); | ||
1947 | } | 1961 | } |
1948 | } | 1962 | } |
1949 | 1963 | ||
@@ -1973,14 +1987,15 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn | |||
1973 | &isert_conn->post_send_buf_count); | 1987 | &isert_conn->post_send_buf_count); |
1974 | else | 1988 | else |
1975 | atomic_dec(&isert_conn->post_send_buf_count); | 1989 | atomic_dec(&isert_conn->post_send_buf_count); |
1976 | isert_completion_put(t, t->isert_cmd, ib_dev); | 1990 | |
1991 | isert_completion_put(t, t->isert_cmd, ib_dev, true); | ||
1977 | } | 1992 | } |
1978 | tx_desc->comp_llnode_batch = NULL; | 1993 | tx_desc->comp_llnode_batch = NULL; |
1979 | 1994 | ||
1980 | if (!isert_cmd) | 1995 | if (!isert_cmd) |
1981 | isert_unmap_tx_desc(tx_desc, ib_dev); | 1996 | isert_unmap_tx_desc(tx_desc, ib_dev); |
1982 | else | 1997 | else |
1983 | isert_completion_put(tx_desc, isert_cmd, ib_dev); | 1998 | isert_completion_put(tx_desc, isert_cmd, ib_dev, true); |
1984 | } | 1999 | } |
1985 | 2000 | ||
1986 | static void | 2001 | static void |