Module Name:    src
Committed By:   dyoung
Date:           Fri Apr 10 17:36:42 UTC 2009

Modified Files:
        src/sys/dev/scsipi: sd.c sdvar.h

Log Message:
Use a PMF shutdown hook instead of shutdownhook_establish().  This ought
to stop the crash during shutdown that yamt@ reports in kern/41182.


To generate a diff of this commit:
cvs rdiff -u -r1.278 -r1.279 src/sys/dev/scsipi/sd.c
cvs rdiff -u -r1.31 -r1.32 src/sys/dev/scsipi/sdvar.h

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/scsipi/sd.c
diff -u src/sys/dev/scsipi/sd.c:1.278 src/sys/dev/scsipi/sd.c:1.279
--- src/sys/dev/scsipi/sd.c:1.278	Tue Apr  7 18:35:17 2009
+++ src/sys/dev/scsipi/sd.c	Fri Apr 10 17:36:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sd.c,v 1.278 2009/04/07 18:35:17 dyoung Exp $	*/
+/*	$NetBSD: sd.c,v 1.279 2009/04/10 17:36:42 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.278 2009/04/07 18:35:17 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.279 2009/04/10 17:36:42 dyoung Exp $");
 
 #include "opt_scsi.h"
 #include "rnd.h"
@@ -101,7 +101,7 @@
 static void	sdrestart(void *);
 static void	sddone(struct scsipi_xfer *, int);
 static bool	sd_suspend(device_t PMF_FN_PROTO);
-static void	sd_shutdown(void *);
+static bool	sd_shutdown(device_t, int);
 static int	sd_interpret_sense(struct scsipi_xfer *);
 
 static int	sd_mode_sense(struct sd_softc *, u_int8_t, void *, size_t, int,
@@ -305,16 +305,11 @@
 	 * Establish a shutdown hook so that we can ensure that
 	 * our data has actually made it onto the platter at
 	 * shutdown time.  Note that this relies on the fact
-	 * that the shutdown hook code puts us at the head of
-	 * the list (thus guaranteeing that our hook runs before
+	 * that the shutdown hooks at the "leaves" of the device tree
+	 * are run, first (thus guaranteeing that our hook runs before
 	 * our ancestors').
 	 */
-	if ((sd->sc_sdhook =
-	    shutdownhook_establish(sd_shutdown, sd)) == NULL)
-		aprint_error_dev(sd->sc_dev,
-			"WARNING: unable to establish shutdown hook\n");
-
-	if (!pmf_device_register(self, sd_suspend, NULL))
+	if (!pmf_device_register1(self, sd_suspend, NULL, sd_shutdown))
 		aprint_error_dev(self, "couldn't establish power handler\n");
 
 #if NRND > 0
@@ -392,7 +387,6 @@
 	callout_destroy(&sd->sc_callout);
 
 	pmf_device_deregister(self);
-	shutdownhook_disestablish(sd->sc_sdhook);
 
 #if NRND > 0
 	/* Unhook the entropy source. */
@@ -1324,10 +1318,10 @@
 	return 0;
 }
 
-static void
-sd_shutdown(void *arg)
+static bool
+sd_shutdown(device_t self, int how)
 {
-	struct sd_softc *sd = arg;
+	struct sd_softc *sd = device_private(self);
 
 	/*
 	 * If the disk cache needs to be flushed, and the disk supports
@@ -1342,15 +1336,13 @@
 		} else
 			sd->flags &= ~(SDF_FLUSHING|SDF_DIRTY);
 	}
+	return true;
 }
 
 static bool
 sd_suspend(device_t dv PMF_FN_ARGS)
 {
-	struct sd_softc *sd = device_private(dv);
-
-	sd_shutdown(sd); /* XXX no need to poll */
-	return true;
+	return sd_shutdown(dv, boothowto); /* XXX no need to poll */
 }
 
 /*

Index: src/sys/dev/scsipi/sdvar.h
diff -u src/sys/dev/scsipi/sdvar.h:1.31 src/sys/dev/scsipi/sdvar.h:1.32
--- src/sys/dev/scsipi/sdvar.h:1.31	Wed Jul 16 18:54:09 2008
+++ src/sys/dev/scsipi/sdvar.h	Fri Apr 10 17:36:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sdvar.h,v 1.31 2008/07/16 18:54:09 drochner Exp $	*/
+/*	$NetBSD: sdvar.h,v 1.32 2009/04/10 17:36:42 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
@@ -91,8 +91,6 @@
 	u_int8_t type;
 	char name[16]; /* product name, for default disklabel */
 
-	void *sc_sdhook;		/* our shutdown hook */
-
 #if NRND > 0
 	rndsource_element_t rnd_source;
 #endif

Reply via email to