I've always wanted to be able to query the current dump device.

This patch lets me do this.

Poul-Henning, what do you think? Is there a nicer way? Perhaps a way to include the "/dev/$device"
as the patch in its current form only stores "ada0p3".  I think that is OK.


Provide a device name in the sysctl tree for programs to query the state of 
crashdump target devices.

This will be used to add a "-l" (ell) flag to dumpon(8) to list the currently 
configured dumpdev.



/usr/9-stable % svn diff sys/dev/null sys/geom sys/kern sys/sys
Index: sys/dev/null/null.c
===================================================================
--- sys/dev/null/null.c (revision 242367)
+++ sys/dev/null/null.c (working copy)
@@ -91,7 +91,7 @@
        case DIOCSKERNELDUMP:
                error = priv_check(td, PRIV_SETDUMPER);
                if (error == 0)
-                       error = set_dumper(NULL);
+                       error = set_dumper(NULL, NULL);
                break;
        case FIONBIO:
                break;
Index: sys/geom/geom_dev.c
===================================================================
--- sys/geom/geom_dev.c (revision 242367)
+++ sys/geom/geom_dev.c (working copy)
@@ -351,7 +351,7 @@
        case DIOCSKERNELDUMP:
                u = *((u_int *)data);
                if (!u) {
-                       set_dumper(NULL);
+                       set_dumper(NULL, NULL);
                        error = 0;
                        break;
                }
@@ -360,7 +360,7 @@
                i = sizeof kd;
                error = g_io_getattr("GEOM::kerneldump", cp, &i, &kd);
                if (!error) {
-                       error = set_dumper(&kd.di);
+                       error = set_dumper(&kd.di, devtoname(dev));
                        if (!error)
                                dev->si_flags |= SI_DUMPDEV;
                }
@@ -518,7 +518,7 @@
/* Reset any dump-area set on this device */
        if (dev->si_flags & SI_DUMPDEV)
-               set_dumper(NULL);
+               set_dumper(NULL, NULL);
/* Destroy the struct cdev *so we get no more requests */
        destroy_dev(dev);
Index: sys/kern/kern_shutdown.c
===================================================================
--- sys/kern/kern_shutdown.c    (revision 242367)
+++ sys/kern/kern_shutdown.c    (working copy)
@@ -711,18 +711,28 @@
                printf("done\n");
 }
+static char dumpdevname[sizeof(((struct cdev*)NULL)->si_name)];
+SYSCTL_STRING(_kern_shutdown, OID_AUTO, dumpdevname, CTLFLAG_RD,
+    dumpdevname, 0, "Device for kernel dumps");
+
 /* Registration of dumpers */
 int
-set_dumper(struct dumperinfo *di)
+set_dumper(struct dumperinfo *di, const char *devname)
 {
if (di == NULL) {
                bzero(&dumper, sizeof dumper);
+               dumpdevname[0] = '\0';
                return (0);
        }
        if (dumper.dumper != NULL)
                return (EBUSY);
        dumper = *di;
+       strlcpy(dumpdevname, devname, sizeof(dumpdevname));
+       if (strlen(dumpdevname) != strlen(devname)) {
+               printf("set_dumper: device name truncated from '%s' -> '%s'\n",
+                       devname, dumpdevname);
+       }
        return (0);
 }
Index: sys/sys/conf.h
===================================================================
--- sys/sys/conf.h      (revision 242367)
+++ sys/sys/conf.h      (working copy)
@@ -335,7 +335,7 @@
        off_t   mediasize;      /* Space available in bytes. */
 };
-int set_dumper(struct dumperinfo *);
+int set_dumper(struct dumperinfo *, const char *_devname);
 int dump_write(struct dumperinfo *, void *, vm_offset_t, off_t, size_t);
 void dumpsys(struct dumperinfo *);
 int doadump(boolean_t);


_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to