From 4509f96cc589342df08f0237df6f9add315b10dc Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 19 Apr 2002 09:24:12 +0000 Subject: Make kernel dumps work with GEOM. Notice that if the device on which the dump is set is destroyed for any reason, the dump setting is lost. This in particular will happen in the case of spoilage. For instance if you set dump on ad0s1b and open ad0 for writing, ad0s* will be spoilt and the dump setting lost. See geom(4) for more about spoiling. Sponsored by: DARPA & NAI Labs. --- sys/geom/geom_dev.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'sys/geom/geom_dev.c') diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index 3711fb0..b845b06 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -48,6 +48,7 @@ #include #include #include +#include #define CDEV_MAJOR 4 @@ -239,7 +240,9 @@ g_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td) { struct g_geom *gp; struct g_consumer *cp; + struct g_kerneldump kd; int i, error; + u_int u; struct g_ioctl *gio; gp = dev->si_drv1; @@ -265,6 +268,20 @@ g_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td) case DIOCGFRONTSTUFF: error = g_io_getattr("GEOM::frontstuff", cp, &i, data); break; + case DIOCSKERNELDUMP: + u = *((u_int *)data); + if (!u) { + set_dumper(NULL); + error = 0; + break; + } + kd.offset = 0; + kd.length = OFF_MAX; + i = sizeof kd; + error = g_io_getattr("GEOM::kerneldump", cp, &i, &kd); + if (!error) + dev->si_flags |= SI_DUMPDEV; + break; default: gio = g_malloc(sizeof *gio, M_WAITOK); gio->cmd = cmd; @@ -378,6 +395,8 @@ g_dev_orphan(struct g_consumer *cp) if (cp->biocount > 0) return; dev = gp->softc; + if (dev->si_flags & SI_DUMPDEV) + set_dumper(NULL); destroy_dev(dev); if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0) g_access_rel(cp, -cp->acr, -cp->acw, -cp->ace); -- cgit v1.1