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 | } |
