diff options
Diffstat (limited to 'drivers/scsi/iscsi_tcp.c')
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0a9dbc59663f..d0b139cccbbc 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -415,8 +415,8 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
415 | iscsi_solicit_data_init(conn, ctask, r2t); | 415 | iscsi_solicit_data_init(conn, ctask, r2t); |
416 | 416 | ||
417 | tcp_ctask->exp_r2tsn = r2tsn + 1; | 417 | tcp_ctask->exp_r2tsn = r2tsn + 1; |
418 | tcp_ctask->xmstate |= XMSTATE_SOL_HDR; | ||
419 | __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); | 418 | __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); |
419 | tcp_ctask->xmstate |= XMSTATE_SOL_HDR; | ||
420 | list_move_tail(&ctask->running, &conn->xmitqueue); | 420 | list_move_tail(&ctask->running, &conn->xmitqueue); |
421 | 421 | ||
422 | scsi_queue_work(session->host, &conn->xmitwork); | 422 | scsi_queue_work(session->host, &conn->xmitwork); |
@@ -1627,9 +1627,12 @@ static int iscsi_send_sol_pdu(struct iscsi_conn *conn, | |||
1627 | if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { | 1627 | if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { |
1628 | tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; | 1628 | tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; |
1629 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; | 1629 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; |
1630 | if (!tcp_ctask->r2t) | 1630 | if (!tcp_ctask->r2t) { |
1631 | spin_lock_bh(&session->lock); | ||
1631 | __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, | 1632 | __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, |
1632 | sizeof(void*)); | 1633 | sizeof(void*)); |
1634 | spin_unlock_bh(&session->lock); | ||
1635 | } | ||
1633 | send_hdr: | 1636 | send_hdr: |
1634 | r2t = tcp_ctask->r2t; | 1637 | r2t = tcp_ctask->r2t; |
1635 | dtask = &r2t->dtask; | 1638 | dtask = &r2t->dtask; |
@@ -1816,21 +1819,14 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) | |||
1816 | { | 1819 | { |
1817 | struct iscsi_conn *conn = cls_conn->dd_data; | 1820 | struct iscsi_conn *conn = cls_conn->dd_data; |
1818 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | 1821 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; |
1819 | int digest = 0; | ||
1820 | |||
1821 | if (conn->hdrdgst_en || conn->datadgst_en) | ||
1822 | digest = 1; | ||
1823 | 1822 | ||
1824 | iscsi_tcp_release_conn(conn); | 1823 | iscsi_tcp_release_conn(conn); |
1825 | iscsi_conn_teardown(cls_conn); | 1824 | iscsi_conn_teardown(cls_conn); |
1826 | 1825 | ||
1827 | /* now free tcp_conn */ | 1826 | if (tcp_conn->tx_hash.tfm) |
1828 | if (digest) { | 1827 | crypto_free_hash(tcp_conn->tx_hash.tfm); |
1829 | if (tcp_conn->tx_hash.tfm) | 1828 | if (tcp_conn->rx_hash.tfm) |
1830 | crypto_free_hash(tcp_conn->tx_hash.tfm); | 1829 | crypto_free_hash(tcp_conn->rx_hash.tfm); |
1831 | if (tcp_conn->rx_hash.tfm) | ||
1832 | crypto_free_hash(tcp_conn->rx_hash.tfm); | ||
1833 | } | ||
1834 | 1830 | ||
1835 | kfree(tcp_conn); | 1831 | kfree(tcp_conn); |
1836 | } | 1832 | } |