Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Oct 2012 23:48:36 -0700
From:      Alfred Perlstein <alfred@ixsystems.com>
To:        hackers@freebsd.org, phk@freebsd.org, pjd@freebsd.org,  mav@freebsd.org
Subject:   please review: patch to retain device name for dumpdev.
Message-ID:  <50921B44.20400@ixsystems.com>

next in thread | raw e-mail | index | archive | help
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);





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50921B44.20400>