iscsi bugfixes: fix oops when iser is flushing io
Subsystems (4)
PATCH 5/11 iscsi bugfixes: fix oops when iser is flushing io
When we enter recovery and flush the running commands we cannot freee the connection before flushing the commands. Some commands may have a reference to the connection that needs to be released before. iscsi_stop was forcing the term and suspend too early and was causing a oops in iser, so this patch removes those callbacks all together and allows the LLD to handle that detail.
Signed-off-by Mike Christie <[email protected]>
drivers/infiniband/ulp/iser/iscsi_iser.c +2 -20
@@ -378,21 +378,6 @@ iscsi_iser_conn_start(struct iscsi_cls_creturn iser_conn_set_full_featured_mode (conn); } -static void -iscsi_iser_conn_terminate (struct iscsi_conn *conn) -{ -struct iscsi_iser_conn *iser_conn = conn->dd_data; -struct iser_conn *ib_conn = iser_conn->ib_conn; - -BUG_ON (!ib_conn); -/* starts conn teardown process, waits until all previously * -* posted buffers get flushed, deallocates all conn resources */ -iser_conn_terminate (ib_conn); - iser_conn->ib_conn =NULL ; - conn->recv_lock =NULL ; -} - -static struct iscsi_transport iscsi_iser_transport; static struct iscsi_cls_session *
@@ -555,13 +540,13 @@ iscsi_iser_ep_poll(__u64 ep_handle, intstatic void iscsi_iser_ep_disconnect (__u64 ep_handle) { -struct iser_conn *ib_conn =iscsi_iser_ib_conn_lookup (ep_handle); +struct iser_conn *ib_conn; + ib_conn =iscsi_iser_ib_conn_lookup (ep_handle);if (!ib_conn)return ;iser_err ("ib conn %p state %d\n" ,ib_conn, ib_conn->state); -iser_conn_terminate (ib_conn); }
@@ -614,9 +599,6 @@ static struct iscsi_transport iscsi_iser .get_session_param = iscsi_session_get_param, .start_conn = iscsi_iser_conn_start, .stop_conn = iscsi_conn_stop, -/* these are called as part of conn recovery */ - .suspend_conn_recv = NULL, /* FIXME is/how this relvant to iser? */ - .terminate_conn = iscsi_iser_conn_terminate,/* IO */ .send_pdu = iscsi_conn_send_pdu, .get_stats = iscsi_iser_conn_get_stats,
drivers/scsi/iscsi_tcp.c +29 -38
104 lines not on this page · raw message
drivers/scsi/libiscsi.c +3 -9
@@ -1440,12 +1440,6 @@ void iscsi_conn_teardown(struct iscsi_clset_bit (ISCSI_SUSPEND_BIT , &conn->suspend_tx);mutex_lock (&conn->xmitmutex); -if (conn->c_stage ==ISCSI_CONN_INITIAL_STAGE ) { -if (session->tt->suspend_conn_recv) - session->tt->suspend_conn_recv (conn); - - session->tt->terminate_conn (conn); - }spin_lock_bh (&session->lock); conn->c_stage =ISCSI_CONN_CLEANUP_WAIT ;
@@ -1622,8 +1616,9 @@ static void iscsi_start_session_recoveryset_bit (ISCSI_SUSPEND_BIT , &conn->suspend_tx);spin_unlock_bh (&session->lock); -if (session->tt->suspend_conn_recv) - session->tt->suspend_conn_recv (conn); +write_lock_bh (conn->recv_lock); +set_bit (ISCSI_SUSPEND_BIT , &conn->suspend_rx); +write_unlock_bh (conn->recv_lock);mutex_lock (&conn->xmitmutex);/*
@@ -1642,7 +1637,6 @@ static void iscsi_start_session_recovery } } - session->tt->terminate_conn (conn);/* * flush queues. */
include/scsi/scsi_transport_iscsi.h +0 -4
@@ -57,8 +57,6 @@ struct sockaddr;* @stop_conn: suspend/recover/terminate connection * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. * @session_recovery_timedout: notify LLD a block during recovery timed out -* @suspend_conn_recv: susepend the recv side of the connection -* @termincate_conn: destroy socket connection. Called with mutex lock. * @init_cmd_task: Initialize a iscsi_cmd_task and any internal structs. * Called from queuecommand with session lock held. * @init_mgmt_task: Initialize a iscsi_mgmt_task and any internal structs.
@@ -112,8 +110,6 @@ struct iscsi_transport { char *data, uint32_t data_size);void (*get_stats) (struct iscsi_cls_conn *conn,struct iscsi_stats *stats); -void (*suspend_conn_recv) (struct iscsi_conn *conn); -void (*terminate_conn) (struct iscsi_conn *conn);void (*init_cmd_task) (struct iscsi_cmd_task *ctask); void (*init_mgmt_task) (struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask,