svn commit: r188464 - head/sys/kern

Alexander Motin mav at FreeBSD.org
Tue Feb 10 15:22:30 PST 2009


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);


More information about the svn-src-head mailing list