Author: cperciva
Date: Thu Oct  8 15:48:44 2015
New Revision: 289032
URL: https://svnweb.freebsd.org/changeset/base/289032

Log:
  MFC r288446: Disable suspend during shutdown.

Modified:
  stable/10/sbin/init/init.c
  stable/10/sys/dev/acpica/acpi.c
  stable/10/sys/kern/kern_shutdown.c
  stable/10/sys/sys/systm.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/init/init.c
==============================================================================
--- stable/10/sbin/init/init.c  Thu Oct  8 15:38:34 2015        (r289031)
+++ stable/10/sbin/init/init.c  Thu Oct  8 15:48:44 2015        (r289032)
@@ -1499,6 +1499,15 @@ static state_func_t
 death(void)
 {
        session_t *sp;
+       int block, blocked;
+       size_t len;
+
+       /* Temporarily block suspend. */
+       len = sizeof(blocked);
+       block = 1;
+       if (sysctlbyname("kern.suspend_blocked", &blocked, &len,
+           &block, sizeof(block)) == -1)
+               blocked = 0;
 
        /*
         * Also revoke the TTY here.  Because runshutdown() may reopen
@@ -1515,6 +1524,11 @@ death(void)
        /* Try to run the rc.shutdown script within a period of time */
        runshutdown();
 
+       /* Unblock suspend if we blocked it. */
+       if (!blocked)
+               sysctlbyname("kern.suspend_blocked", NULL, NULL,
+                   &blocked, sizeof(blocked));
+
        return (state_func_t) death_single;
 }
 

Modified: stable/10/sys/dev/acpica/acpi.c
==============================================================================
--- stable/10/sys/dev/acpica/acpi.c     Thu Oct  8 15:38:34 2015        
(r289031)
+++ stable/10/sys/dev/acpica/acpi.c     Thu Oct  8 15:48:44 2015        
(r289032)
@@ -2546,8 +2546,11 @@ acpi_ReqSleepState(struct acpi_softc *sc
     if (!acpi_sleep_states[state])
        return (EOPNOTSUPP);
 
-    /* If a suspend request is already in progress, just return. */
-    if (sc->acpi_next_sstate != 0) {
+    /*
+     * If a reboot/shutdown/suspend request is already in progress or
+     * suspend is blocked due to an upcoming shutdown, just return.
+     */
+    if (rebooting || sc->acpi_next_sstate != 0 || suspend_blocked) {
        return (0);
     }
 

Modified: stable/10/sys/kern/kern_shutdown.c
==============================================================================
--- stable/10/sys/kern/kern_shutdown.c  Thu Oct  8 15:38:34 2015        
(r289031)
+++ stable/10/sys/kern/kern_shutdown.c  Thu Oct  8 15:48:44 2015        
(r289032)
@@ -139,6 +139,10 @@ static int show_busybufs = 1;
 SYSCTL_INT(_kern_shutdown, OID_AUTO, show_busybufs, CTLFLAG_RW,
        &show_busybufs, 0, "");
 
+int suspend_blocked = 0;
+SYSCTL_INT(_kern, OID_AUTO, suspend_blocked, CTLFLAG_RW,
+       &suspend_blocked, 0, "Block suspend due to a pending shutdown");
+
 /*
  * Variable panicstr contains argument to first call to panic; used as flag
  * to indicate that the kernel has already called panic.

Modified: stable/10/sys/sys/systm.h
==============================================================================
--- stable/10/sys/sys/systm.h   Thu Oct  8 15:38:34 2015        (r289031)
+++ stable/10/sys/sys/systm.h   Thu Oct  8 15:48:44 2015        (r289032)
@@ -46,6 +46,7 @@
 #include <sys/stdint.h>                /* for people using printf mainly */
 
 extern int cold;               /* nonzero if we are doing a cold boot */
+extern int suspend_blocked;    /* block suspend due to pending shutdown */
 extern int rebooting;          /* kern_reboot() has been called. */
 extern const char *panicstr;   /* panic message */
 extern char version[];         /* system version */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to