summaryrefslogtreecommitdiffstats
path: root/sys/geom/geom_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/geom/geom_dev.c')
-rw-r--r--sys/geom/geom_dev.c19
1 files changed, 19 insertions, 0 deletions
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 <sys/disk.h>
#include <sys/fcntl.h>
#include <geom/geom.h>
+#include <machine/limits.h>
#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);
OpenPOWER on IntegriCloud