From 64e0fc9afdde4dcaf5076d37715128587bc89e9a Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Wed, 21 Sep 2016 11:49:49 -0700 Subject: [PATCH 1/7] Add some kernel dump facilities for netdump This just consists of init and fini methods for the dumper. netdump uses them to ARP the gateway and to signal completion to netdumpd once the transfer is complete. --- sys/geom/geom_dev.c | 4 ++++ sys/kern/kern_shutdown.c | 17 ++++++++++++++++- sys/sys/conf.h | 8 ++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index 81166f6..0923b4e 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -466,6 +466,10 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread } kd.offset = 0; kd.length = OFF_MAX; + /* Begin Isilon */ + kd.di.dumper_init = NULL; + kd.di.dumper_fini = NULL; + /* End Isilon */ i = sizeof kd; error = g_io_getattr("GEOM::kerneldump", cp, &i, &kd); if (!error) { diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 6941353..6f562fa 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -392,6 +392,14 @@ doadump(boolean_t textdump) dumptid = curthread->td_tid; dumping++; + /* Begin Isilon */ + if (dumper.dumper_init != NULL) { + error = dumper.dumper_init(dumper.priv); + if (error != 0) + return (error); + } + /* End Isilon */ + coredump = TRUE; /* Begin Isilon */ #if 0 @@ -411,6 +419,11 @@ doadump(boolean_t textdump) if (coredump) error = dumpsys(&dumper); + /* Begin Isilon */ + if (dumper.dumper_fini != NULL) + dumper.dumper_fini(dumper.priv); + /* End Isilon */ + printf("Core dumped.\n"); dumped_already++; dumping--; @@ -1231,7 +1244,9 @@ dump_write(struct dumperinfo *di, void *virtual, vm_offset_t physical, off_t offset, size_t length) { - if (length != 0 && (offset < di->mediaoffset || + /* Begin Isilon */ + if (length != 0 && (di->mediasize != 0) && (offset < di->mediaoffset || + /* End Isilon */ offset - di->mediaoffset + length > di->mediasize)) { printf("Attempt to write outside dump device boundaries.\n" "offset(%jd), mediaoffset(%jd), length(%ju), mediasize(%jd).\n", diff --git a/sys/sys/conf.h b/sys/sys/conf.h index 611ceb5..29f43e3 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -144,6 +144,8 @@ typedef int d_mmap_single_t(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size, struct vm_object **object, int nprot); typedef void d_purge_t(struct cdev *dev); +typedef int dumper_init_t(void *); +typedef void dumper_fini_t(void *); typedef int dumper_t( void *_priv, /* Private to the driver. */ void *_virtual, /* Virtual (mapped) address. */ @@ -333,9 +335,11 @@ EVENTHANDLER_DECLARE(dev_clone, dev_clone_fn); /* Stuff relating to kernel-dump */ struct dumperinfo { + dumper_init_t *dumper_init; /* Dump device init callback. */ dumper_t *dumper; /* Dumping function. */ - void *priv; /* Private parts. */ - u_int blocksize; /* Size of block in bytes. */ + dumper_fini_t *dumper_fini; /* Dump device cleanup callback. */ + void *priv; /* Private parts. */ + u_int blocksize; /* Size of block in bytes. */ u_int maxiosize; /* Max size allowed for an individual I/O */ off_t mediaoffset; /* Initial offset in bytes. */ off_t mediasize; /* Space available in bytes. */ -- 2.10.1