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