Index: sys/kern/kern_subr.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_subr.c,v
retrieving revision 1.135
diff -u -r1.135 kern_subr.c
--- sys/kern/kern_subr.c	28 Mar 2006 17:38:39 -0000	1.135
+++ sys/kern/kern_subr.c	22 Apr 2006 17:02:55 -0000
@@ -509,18 +509,48 @@
  * it won't be run again.
  */
 
-static hook_list_t shutdownhook_list;
+struct shutdownhook_desc {
+	LIST_ENTRY(shutdownhook_desc) shk_list;
+	void	(*shk_fn)(int, void *);
+	void	*shk_arg;
+};
+
+static LIST_HEAD(, shutdownhook_desc) shutdownhook_list =
+    LIST_HEAD_INITIALIZER(shutdownhook_list);
 
 void *
-shutdownhook_establish(void (*fn)(void *), void *arg)
+shutdownhook_establish(void (*fn)(int, void *), void *arg)
 {
-	return hook_establish(&shutdownhook_list, fn, arg);
+	struct shutdownhook_desc *hd;
+
+	hd = malloc(sizeof(*hd), M_DEVBUF, M_NOWAIT);
+	if (hd == NULL)
+		return (NULL);
+
+	hd->shk_fn = fn;
+	hd->shk_arg = arg;
+	LIST_INSERT_HEAD(&shutdownhook_list, hd, shk_list);
+
+	return (hd);
 }
 
 void
 shutdownhook_disestablish(void *vhook)
 {
-	hook_disestablish(&shutdownhook_list, vhook);
+#ifdef DIAGNOSTIC
+	struct shutdownhook_desc *hd;
+
+	LIST_FOREACH(hd, &shutdownhook_list, shk_list) {
+                if (hd == vhook)
+			break;
+	}
+
+	if (hd == NULL)
+		panic("hook_disestablish: hook %p not established", vhook);
+#endif
+	LIST_REMOVE((struct shutdownhook_desc *)vhook, shk_list);
+	free(vhook, M_DEVBUF);
+
 }
 
 /*
@@ -532,13 +562,15 @@
  * it won't be run again.
  */
 void
-doshutdownhooks(void)
+doshutdownhooks(int howto)
 {
-	struct hook_desc *dp;
+	struct shutdownhook_desc *dp;
 
-	while ((dp = LIST_FIRST(&shutdownhook_list)) != NULL) {
-		LIST_REMOVE(dp, hk_list);
-		(*dp->hk_fn)(dp->hk_arg);
+	LIST_FOREACH(dp, &shutdownhook_list, shk_list) {
+	  //   XXX: Please get comments on this.
+	  //	while ((dp = LIST_FIRST(&shutdownhook_list)) != NULL) {
+	  //		LIST_REMOVE(dp, hk_list);
+		(*dp->shk_fn)(howto, dp->shk_arg);
 #if 0
 		/*
 		 * Don't bother freeing the hook structure,, since we may
Index: sys/sys/systm.h
===================================================================
RCS file: /cvsroot/src/sys/sys/systm.h,v
retrieving revision 1.186
diff -u -r1.186 systm.h
--- sys/sys/systm.h	7 Mar 2006 13:18:20 -0000	1.186
+++ sys/sys/systm.h	22 Apr 2006 17:12:33 -0000
@@ -303,9 +303,9 @@
  * Shutdown hooks.  Functions to be run with all interrupts disabled
  * immediately before the system is halted or rebooted.
  */
-void	*shutdownhook_establish(void (*)(void *), void *);
+void	*shutdownhook_establish(void (*)(int, void *), void *);
 void	shutdownhook_disestablish(void *);
-void	doshutdownhooks(void);
+void	doshutdownhooks(int);
 
 /*
  * Power management hooks.

