Author: trasz
Date: Mon Aug  3 11:57:11 2015
New Revision: 286226
URL: https://svnweb.freebsd.org/changeset/base/286226

Log:
  Rework the way iSCSI initiator handles system shutdown. This fixes
  hangs on shutdown with LUNs with mounted filesystems over a disconnected
  iSCSI session.
  
  MFC after:    1 month
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D3052

Modified:
  head/sys/dev/iscsi/iscsi.c

Modified: head/sys/dev/iscsi/iscsi.c
==============================================================================
--- head/sys/dev/iscsi/iscsi.c  Mon Aug  3 11:05:02 2015        (r286225)
+++ head/sys/dev/iscsi/iscsi.c  Mon Aug  3 11:57:11 2015        (r286226)
@@ -2322,11 +2322,23 @@ iscsi_shutdown(struct iscsi_softc *sc)
 {
        struct iscsi_session *is;
 
-       ISCSI_DEBUG("removing all sessions due to shutdown");
+       /*
+        * Trying to reconnect during system shutdown would lead to hang.
+        */
+       fail_on_disconnection = 1;
 
+       /*
+        * If we have any sessions waiting for reconnection, request
+        * maintenance thread to fail them immediately instead of waiting
+        * for reconnect timeout.
+        */
        sx_slock(&sc->sc_lock);
-       TAILQ_FOREACH(is, &sc->sc_sessions, is_next)
-               iscsi_session_terminate(is);
+       TAILQ_FOREACH(is, &sc->sc_sessions, is_next) {
+               ISCSI_SESSION_LOCK(is);
+               if (is->is_waiting_for_iscsid)
+                       iscsi_session_reconnect(is);
+               ISCSI_SESSION_UNLOCK(is);
+       }
        sx_sunlock(&sc->sc_lock);
 }
 
@@ -2352,12 +2364,7 @@ iscsi_load(void)
        }
        sc->sc_cdev->si_drv1 = sc;
 
-       /*
-        * Note that this needs to get run before dashutdown().  Otherwise,
-        * when rebooting with iSCSI session with outstanding requests,
-        * but disconnected, dashutdown() will hang on cam_periph_runccb().
-        */
-       sc->sc_shutdown_eh = EVENTHANDLER_REGISTER(shutdown_post_sync,
+       sc->sc_shutdown_eh = EVENTHANDLER_REGISTER(shutdown_pre_sync,
            iscsi_shutdown, sc, SHUTDOWN_PRI_FIRST);
 
        return (0);
@@ -2375,7 +2382,7 @@ iscsi_unload(void)
        }
 
        if (sc->sc_shutdown_eh != NULL)
-               EVENTHANDLER_DEREGISTER(shutdown_post_sync, sc->sc_shutdown_eh);
+               EVENTHANDLER_DEREGISTER(shutdown_pre_sync, sc->sc_shutdown_eh);
 
        sx_slock(&sc->sc_lock);
        TAILQ_FOREACH_SAFE(is, &sc->sc_sessions, is_next, tmp)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to