Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Feb 2009 23:22:29 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r188464 - head/sys/kern
Message-ID:  <200902102322.n1ANMTgW007393@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Tue Feb 10 23:22:29 2009
New Revision: 188464
URL: http://svn.freebsd.org/changeset/base/188464

Log:
  Check for device_set_devclass() errors and skip driver probe/attach if any.
  Attach call without devclass set crashes the system.
  
  On resume AHCI driver sometimes tries to create duplicate adX device.
  It is surely his own problem, but IMHO it is not a reason to crash here.
  Other reasons are also possible.

Modified:
  head/sys/kern/subr_bus.c

Modified: head/sys/kern/subr_bus.c
==============================================================================
--- head/sys/kern/subr_bus.c	Tue Feb 10 23:17:20 2009	(r188463)
+++ head/sys/kern/subr_bus.c	Tue Feb 10 23:22:29 2009	(r188464)
@@ -1756,8 +1756,13 @@ device_probe_child(device_t dev, device_
 		     dl = next_matching_driver(dc, child, dl)) {
 			PDEBUG(("Trying %s", DRIVERNAME(dl->driver)));
 			device_set_driver(child, dl->driver);
-			if (!hasclass)
-				device_set_devclass(child, dl->driver->name);
+			if (!hasclass) {
+				if (device_set_devclass(child, dl->driver->name)) {
+					PDEBUG(("Unable to set device class"));
+					device_set_driver(child, NULL);
+					continue;
+				}
+			}
 
 			/* Fetch any flags for the device before probing. */
 			resource_int_value(dl->driver->name, child->unit,
@@ -1843,8 +1848,11 @@ device_probe_child(device_t dev, device_
 				return (result);
 
 		/* Set the winning driver, devclass, and flags. */
-		if (!child->devclass)
-			device_set_devclass(child, best->driver->name);
+		if (!child->devclass) {
+			result = device_set_devclass(child, best->driver->name);
+			if (result != 0)
+				return (result);
+		}
 		device_set_driver(child, best->driver);
 		resource_int_value(best->driver->name, child->unit,
 		    "flags", &child->devflags);



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