Date: Tue, 10 Feb 2009 21:59:34 -0700 (MST) From: "M. Warner Losh" <imp@bsdimp.com> To: mav@freebsd.org Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r188464 - head/sys/kern Message-ID: <20090210.215934.1159135034.imp@bsdimp.com> In-Reply-To: <200902102322.n1ANMTgW007393@svn.freebsd.org> References: <200902102322.n1ANMTgW007393@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In message: <200902102322.n1ANMTgW007393@svn.freebsd.org> Alexander Motin <mav@freebsd.org> writes: : 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, I'd prefer applying this patch to make it whine louder so we don't forget about it: Index: subr_bus.c =================================================================== --- subr_bus.c (revision 188476) +++ subr_bus.c (working copy) @@ -1758,7 +1758,8 @@ device_set_driver(child, dl->driver); if (!hasclass) { if (device_set_devclass(child, dl->driver->name)) { - PDEBUG(("Unable to set device class")); + printf("driver bug: Unable to set devclass (devname: %s)\n", + DEVICENAME(child)); device_set_driver(child, NULL); continue; } Comments? Warner
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090210.215934.1159135034.imp>