Index: share/man/man9/EVENTHANDLER.9 =================================================================== --- share/man/man9/EVENTHANDLER.9 +++ share/man/man9/EVENTHANDLER.9 @@ -318,6 +318,12 @@ Callbacks invoked before a linker file is about to be unloaded. These callbacks may be used to return an error and prevent the unload from proceeding. +.It Vt livedumper_start +Callback invoked before beginning a minidump of the live system. +.It Vt livedumper_dump +Callback invoked for each dumped block of data during a live minidump. +.It Vt livedumper_finish +Callback invoked once a live minidump has completed. .It Vt lle_event Callback invoked when an link layer event has happened. .It Vt nmbclusters_change Index: sys/kern/kern_vnodedumper.c =================================================================== --- sys/kern/kern_vnodedumper.c +++ sys/kern/kern_vnodedumper.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,14 @@ static struct sx livedump_sx; SX_SYSINIT(livedump, &livedump_sx, "Livedump sx"); +typedef void (*livedump_fn)(void *arg, int *errorp); +typedef void (*livedump_dump_fn)(void *arg, void *virtual, off_t offset, + size_t len, int *errorp); + +EVENTHANDLER_DECLARE(livedumper_start, livedump_fn); +EVENTHANDLER_DECLARE(livedumper_dump, livedump_dump_fn); +EVENTHANDLER_DECLARE(livedumper_finish, livedump_fn); + /* * Invoke a live minidump on the system. */ @@ -94,9 +103,15 @@ /* Only allow one livedump to proceed at a time. */ sx_xlock(&livedump_sx); + EVENTHANDLER_INVOKE(livedumper_start, &error); + if (error != 0) + goto out; + dump_savectx(); error = minidumpsys(&di, true); - + /* XXX: may clobber error. */ + EVENTHANDLER_INVOKE(livedumper_finish, &error); +out: sx_xunlock(&livedump_sx); vn_rangelock_unlock(vp, rl_cookie); VOP_UNLOCK(vp); @@ -149,6 +164,10 @@ MPASS(vp != NULL); ASSERT_VOP_LOCKED(vp, __func__); + EVENTHANDLER_INVOKE(livedumper_dump, virtual, offset, length, &error); + if (error != 0) + return (error); + /* Done? */ if (virtual == NULL) return (0);