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.