Module Name: src Committed By: mlelstv Date: Sat Jun 24 11:31:26 UTC 2017
Modified Files: src/sys/dev/iscsi: iscsi_ioctl.c Log Message: Fix session cleanup. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/dev/iscsi/iscsi_ioctl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/iscsi/iscsi_ioctl.c diff -u src/sys/dev/iscsi/iscsi_ioctl.c:1.25 src/sys/dev/iscsi/iscsi_ioctl.c:1.26 --- src/sys/dev/iscsi/iscsi_ioctl.c:1.25 Sat Feb 25 12:03:57 2017 +++ src/sys/dev/iscsi/iscsi_ioctl.c Sat Jun 24 11:31:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: iscsi_ioctl.c,v 1.25 2017/02/25 12:03:57 mlelstv Exp $ */ +/* $NetBSD: iscsi_ioctl.c,v 1.26 2017/06/24 11:31:26 mlelstv Exp $ */ /*- * Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc. @@ -520,16 +520,19 @@ kill_connection(connection_t *conn, uint terminating = conn->terminating; if (!terminating) conn->terminating = status; - mutex_exit(&iscsi_cleanup_mtx); /* Don't recurse */ if (terminating) { + mutex_exit(&iscsi_cleanup_mtx); + + KASSERT(conn->state != ST_FULL_FEATURE); DEBC(conn, 1, ("Kill_connection exiting (already terminating)\n")); goto done; } if (conn->state == ST_FULL_FEATURE) { sess->active_connections--; + conn->state = ST_WINDING_DOWN; /* If this is the last connection and ERL < 2, reset TSIH */ if (!sess->active_connections && sess->ErrorRecoveryLevel < 2) @@ -538,9 +541,6 @@ kill_connection(connection_t *conn, uint /* Don't try to log out if the socket is broken or we're in the middle */ /* of logging in */ if (logout >= 0) { - conn->state = ST_WINDING_DOWN; - connection_timeout_start(conn, CONNECTION_TIMEOUT); - if (sess->ErrorRecoveryLevel < 2 && logout == RECOVER_CONNECTION) { logout = LOGOUT_CONNECTION; @@ -549,20 +549,29 @@ kill_connection(connection_t *conn, uint logout == LOGOUT_CONNECTION) { logout = LOGOUT_SESSION; } + mutex_exit(&iscsi_cleanup_mtx); + + connection_timeout_start(conn, CONNECTION_TIMEOUT); + if (!send_logout(conn, conn, logout, FALSE)) { conn->terminating = ISCSI_STATUS_SUCCESS; return; } /* - * if the logout request was successfully sent, the logout response - * handler will do the rest of the termination processing. If the - * logout doesn't get a response, we'll get back in here once - * the timeout hits. + * if the logout request was successfully sent, + * the logout response handler will do the rest + * of the termination processing. If the logout + * doesn't get a response, we'll get back in here + * once the timeout hits. */ + + mutex_enter(&iscsi_cleanup_mtx); } + } conn->state = ST_SETTLING; + mutex_exit(&iscsi_cleanup_mtx); done: /* let send thread take over next step of cleanup */ @@ -1641,6 +1650,7 @@ add_connection_cleanup(connection_t *con if (conn->in_session) { sess = conn->session; conn->in_session = FALSE; + conn->session = NULL; TAILQ_REMOVE(&sess->conn_list, conn, connections); sess->mru_connection = TAILQ_FIRST(&sess->conn_list); }