Date: Sat, 8 Dec 2012 21:52:01 +1100 (EST) From: Peter Jeremy <peter@rulingia.com> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/174277: ata_attach() panic's on disabled disk Message-ID: <201212081052.qB8Aq1TH006093@server.rulingia.com> Resent-Message-ID: <201212081100.qB8B01Xi008556@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 174277
>Category: kern
>Synopsis: ata_attach() panic's on disabled disk
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Dec 08 11:00:00 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator: Peter Jeremy
>Release: FreeBSD 8.3-STABLE i386
>Organization:
FreeBSD
>Environment:
System: FreeBSD aspire.rulingia.com 8.3-STABLE FreeBSD 8.3-STABLE #18: Sat Dec 8 21:35:18 EST 2012 root@builder.rulingia.com:/obj/usr/src/sys/aspire i386
Actual revision is r242865M
>Description:
After updating my netbook from 8.x r237444 to 8.x r242865, I
found it panics "page fault while in kernel mode" in
ata_identify(). Working back, ata_boot_attach() is passing
NULL to ata_identify() and the device_get_softc() at the top
of ata_identify() is dereferencing that and setting "ch" to
garbage which panics on ch->devices.
Working back further, I have "hint.ata.0.disabled=1" in my
loader.conf (because the boot device is on ata1 and there's
nothing attached to ata0 so disabling it sped up the boot).
It appears that this leaves ata0 with a present but zero'd
softc - which isn't correctly handled in ata_boot_attach().
It's not clear to me what changed between r237444 and r242865
to cause this problem to become apparent. The relevant ata(4)
code has not been touched for some time.
>How-To-Repeat:
On a system with an ATA controllor and ata(4) in the kernel,
boot with ata0 disabled as per the above.
>Fix:
Whilst I have only tested it on 8.x, this patch appears to
be applicable to 9.x and head as well.
Index: dev/ata/ata-all.c
===================================================================
--- dev/ata/ata-all.c (revision 242865)
+++ dev/ata/ata-all.c (working copy)
@@ -854,16 +854,16 @@
static void
ata_boot_attach(void)
{
- struct ata_channel *ch;
+ device_t dev;
int ctlr;
mtx_lock(&Giant); /* newbus suckage it needs Giant */
- /* kick of probe and attach on all channels */
+ /* kick of probe and attach on all enabled channels */
for (ctlr = 0; ctlr < devclass_get_maxunit(ata_devclass); ctlr++) {
- if ((ch = devclass_get_softc(ata_devclass, ctlr))) {
- ata_identify(ch->dev);
- }
+ dev = devclass_get_device(ata_devclass, ctlr);
+ if (dev != NULL && device_is_enabled(dev))
+ ata_identify(dev);
}
/* release the hook that got us here, we are only needed once during boot */
>Release-Note:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212081052.qB8Aq1TH006093>
