aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2014-03-30 18:50:03 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-04-07 04:48:51 -0400
commit03e7848a64ed535a30f5d7fc6dede2d5a6a2534b (patch)
tree30a0f445d7725ac41ed9fdfc389ea03f171322ed
parent131e6abc674edb9f9a59090bb35bf6650569b7e7 (diff)
iser-target: Add missing se_cmd put for WRITE_PENDING in tx_comp_err
This patch fixes a bug where outstanding RDMA_READs with WRITE_PENDING status require an extra target_put_sess_cmd() in isert_put_cmd() code when called from isert_cq_tx_comp_err() + isert_cq_drain_comp_llist() context during session shutdown. The extra kref PUT is required so that transport_generic_free_cmd() invokes the last target_put_sess_cmd() -> target_release_cmd_kref(), which will complete(&se_cmd->cmd_wait_comp) the outstanding se_cmd descriptor with WRITE_PENDING status, and awake the completion in target_wait_for_sess_cmds() to invoke TFO->release_cmd(). The bug was manifesting itself in target_wait_for_sess_cmds() where a se_cmd descriptor with WRITE_PENDING status would end up sleeping indefinately. Acked-by: Sagi Grimberg <sagig@mellanox.com> Cc: Or Gerlitz <ogerlitz@mellanox.com> Cc: <stable@vger.kernel.org> #3.10+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c37
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
1582static void 1582static void
1583isert_put_cmd(struct isert_cmd *isert_cmd) 1583isert_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
1653static void 1666static void
1654isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, 1667isert_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
1668static int 1681static 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
1856static void 1869static 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
1986static void 2001static void