kern/189355: [zfs] zfs panic on root mount 10-stable
Steven Hartland
killing at multiplay.co.uk
Tue May 6 00:50:02 UTC 2014
The following reply was made to PR kern/189355; it has been noted by GNATS.
From: "Steven Hartland" <killing at multiplay.co.uk>
To: <bug-followup at freebsd.org>,
<hsn at sendmail.cz>
Cc:
Subject: Re: kern/189355: [zfs] zfs panic on root mount 10-stable
Date: Tue, 6 May 2014 01:44:29 +0100
This is a multi-part message in MIME format.
------=_NextPart_000_0300_01CF68CC.B8749960
Content-Type: text/plain;
format=flowed;
charset="Windows-1252";
reply-type=original
Content-Transfer-Encoding: 7bit
Can you try building a debug kernel with the attached patch.
It should allow you to configure a dump device before
the root device is mounted by specifying it in /boot/loader.conf
kern.shutdown.defaultdumpdev="ada4p3"
Ensure you choose a valid device such a swap device.
If all goes well that will enable you to get a proper stack
trace from the dump.
Regards
Steve
------=_NextPart_000_0300_01CF68CC.B8749960
Content-Type: application/octet-stream;
name="default-dump-dev.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="default-dump-dev.patch"
Quick patch which configures kernel dump location prior to mounting root.=0A=
=0A=
The location is controlled by the new tunable:=0A=
kern.shutdown.defaultdumpdev=0A=
=0A=
An example of configuring it would be to add the following to =
/boot/loader.conf:=0A=
kern.shutdown.defaultdumpdev=3D"ada4p3"=0A=
=0A=
This would configure kernel dumps on ata disk 4 partition 3.=0A=
=0A=
The usual rules should be maintained when picking a device i.e. choose a =
device=0A=
use for swap or otherwise unused.=0A=
--- sys/kern/kern_shutdown.c.orig 2014-05-04 23:37:01.954116628 +0000=0A=
+++ sys/kern/kern_shutdown.c 2014-05-06 00:28:54.591101862 +0000=0A=
@@ -50,12 +50,14 @@ __FBSDID("$FreeBSD: releng/10.0/sys/kern=0A=
#include <sys/conf.h>=0A=
#include <sys/cons.h>=0A=
#include <sys/eventhandler.h>=0A=
+#include <sys/fcntl.h>=0A=
#include <sys/jail.h>=0A=
#include <sys/kdb.h>=0A=
#include <sys/kernel.h>=0A=
#include <sys/kerneldump.h>=0A=
#include <sys/kthread.h>=0A=
#include <sys/ktr.h>=0A=
+#include <sys/limits.h>=0A=
#include <sys/malloc.h>=0A=
#include <sys/mount.h>=0A=
#include <sys/priv.h>=0A=
@@ -72,6 +74,9 @@ __FBSDID("$FreeBSD: releng/10.0/sys/kern=0A=
=0A=
#include <ddb/ddb.h>=0A=
=0A=
+#include <fs/devfs/devfs_int.h>=0A=
+#include <geom/geom.h>=0A=
+=0A=
#include <machine/cpu.h>=0A=
#include <machine/pcb.h>=0A=
#include <machine/smp.h>=0A=
@@ -245,6 +250,72 @@ print_uptime(void)=0A=
printf("%lds\n", (long)ts.tv_sec);=0A=
}=0A=
=0A=
+static char defaultdumpdev[MAXPATHLEN];=0A=
+TUNABLE_STR("kern.shutdown.defaultdumpdev", defaultdumpdev,=0A=
+ sizeof(defaultdumpdev));=0A=
+SYSCTL_STRING(_kern_shutdown, OID_AUTO, defaultdumpdev, CTLFLAG_RDTUN,=0A=
+ defaultdumpdev, 0, "Default device for early kernel dumps");=0A=
+=0A=
+int=0A=
+setdumpdev(char *devname)=0A=
+{=0A=
+ struct thread *td =3D curthread;=0A=
+ int error, i, ref;=0A=
+ struct g_consumer *cp;=0A=
+ struct g_kerneldump kd;=0A=
+ struct cdev_priv *cdp;=0A=
+ struct cdev *dev;=0A=
+ struct cdevsw *dsw;=0A=
+=0A=
+ if (devname =3D=3D NULL || strlen(devname) =3D=3D 0)=0A=
+ return (set_dumper(NULL, NULL));=0A=
+=0A=
+ dev =3D NULL;=0A=
+ dev_lock();=0A=
+ TAILQ_FOREACH(cdp, &cdevp_list, cdp_list) {=0A=
+ dev =3D &cdp->cdp_c;=0A=
+ if (strcmp(dev->si_name, devname) =3D=3D 0)=0A=
+ break;=0A=
+ dev =3D NULL;=0A=
+ }=0A=
+ dev_unlock();=0A=
+=0A=
+ if (dev =3D=3D NULL)=0A=
+ return (ENOENT);=0A=
+=0A=
+ dsw =3D dev_refthread(dev, &ref);=0A=
+ if (dsw =3D=3D NULL)=0A=
+ return (ENXIO);=0A=
+=0A=
+ error =3D dsw->d_open(dev, FREAD, 0, td);=0A=
+ if (error !=3D 0) {=0A=
+ dev_relthread(dev, ref);=0A=
+ return (error);=0A=
+ }=0A=
+=0A=
+ cp =3D dev->si_drv2;=0A=
+ kd.offset =3D 0;=0A=
+ kd.length =3D OFF_MAX;=0A=
+ i =3D sizeof(kd);=0A=
+ error =3D g_io_getattr("GEOM::kerneldump", cp, &i, &kd);=0A=
+ if (error =3D=3D 0) {=0A=
+ error =3D set_dumper(&kd.di, devtoname(dev));=0A=
+ if (error =3D=3D 0)=0A=
+ dev->si_flags |=3D SI_DUMPDEV;=0A=
+ }=0A=
+=0A=
+ (void)dev->si_devsw->d_close(dev, FREAD, 0, td);=0A=
+ dev_relthread(dev, ref);=0A=
+=0A=
+ return (error);=0A=
+}=0A=
+=0A=
+int=0A=
+setdumpdev_default(void)=0A=
+{=0A=
+ return (setdumpdev(defaultdumpdev));=0A=
+}=0A=
+=0A=
int=0A=
doadump(boolean_t textdump)=0A=
{=0A=
--- sys/kern/init_main.c.orig 2014-05-05 18:06:24.008837474 +0000=0A=
+++ sys/kern/init_main.c 2014-05-05 22:39:52.964175470 +0000=0A=
@@ -697,6 +697,8 @@ start_init(void *dummy)=0A=
struct thread *td;=0A=
struct proc *p;=0A=
=0A=
+ setdumpdev_default();=0A=
+=0A=
mtx_lock(&Giant);=0A=
=0A=
GIANT_REQUIRED;=0A=
--- sys/sys/conf.h.orig 2014-05-05 02:20:24.408440686 +0000=0A=
+++ sys/sys/conf.h 2014-05-05 15:21:06.150967151 +0000=0A=
@@ -338,6 +338,8 @@ int set_dumper(struct dumperinfo *, cons=0A=
int dump_write(struct dumperinfo *, void *, vm_offset_t, off_t, size_t);=0A=
void dumpsys(struct dumperinfo *);=0A=
int doadump(boolean_t);=0A=
+int setdumpdev_default(void);=0A=
+int setdumpdev(char *);=0A=
extern int dumping; /* system is dumping */=0A=
=0A=
#endif /* _KERNEL */=0A=
------=_NextPart_000_0300_01CF68CC.B8749960--
More information about the freebsd-fs
mailing list