Skip site navigation (1)Skip section navigation (2)
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>