From owner-freebsd-hackers@FreeBSD.ORG Thu Nov 1 06:48:38 2012 Return-Path: Delivered-To: hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 27C7C6B2; Thu, 1 Nov 2012 06:48:38 +0000 (UTC) (envelope-from alfred@ixsystems.com) Received: from mail.iXsystems.com (newknight.ixsystems.com [206.40.55.70]) by mx1.freebsd.org (Postfix) with ESMTP id 051BC8FC46; Thu, 1 Nov 2012 06:48:37 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by mail.iXsystems.com (Postfix) with ESMTP id CCC43F1A; Wed, 31 Oct 2012 23:48:36 -0700 (PDT) Received: from mail.iXsystems.com ([127.0.0.1]) by localhost (mail.ixsystems.com [127.0.0.1]) (maiad, port 10024) with ESMTP id 31112-06; Wed, 31 Oct 2012 23:48:36 -0700 (PDT) Received: from Alfreds-MacBook-Pro-5.local (unknown [10.8.0.18]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mail.iXsystems.com (Postfix) with ESMTPSA id 6D54BF17; Wed, 31 Oct 2012 23:48:36 -0700 (PDT) Message-ID: <50921B44.20400@ixsystems.com> Date: Wed, 31 Oct 2012 23:48:36 -0700 From: Alfred Perlstein User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/20121026 Thunderbird/16.0.2 MIME-Version: 1.0 To: hackers@freebsd.org, phk@freebsd.org, pjd@freebsd.org, mav@freebsd.org Subject: please review: patch to retain device name for dumpdev. X-Mailman-Approved-At: Fri, 02 Nov 2012 02:53:28 +0000 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.14 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Nov 2012 06:48:38 -0000 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);