Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Jan 2012 12:56:21 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r230739 - stable/8/sys/kern
Message-ID:  <201201291256.q0TCuLL6036110@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Sun Jan 29 12:56:21 2012
New Revision: 230739
URL: http://svn.freebsd.org/changeset/base/230739

Log:
  MFC: r228209
  
  - In device_probe_child(9) check the return value of device_set_driver(9)
    when actually setting a driver as especially ENOMEM is fatal in these
    cases.
  - Annotate other calls to device_set_devclass(9) and device_set_driver(9)
    without the return value being checked and that are okay to fail.
  
  Reviewed by:	yongari (slightly earlier version)

Modified:
  stable/8/sys/kern/subr_bus.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/kern/subr_bus.c
==============================================================================
--- stable/8/sys/kern/subr_bus.c	Sun Jan 29 12:56:18 2012	(r230738)
+++ stable/8/sys/kern/subr_bus.c	Sun Jan 29 12:56:21 2012	(r230739)
@@ -1165,7 +1165,7 @@ devclass_driver_deleted(devclass_t buscl
 			    dev->parent->devclass == busclass) {
 				if ((error = device_detach(dev)) != 0)
 					return (error);
-				device_set_driver(dev, NULL);
+				(void)device_set_driver(dev, NULL);
 				BUS_PROBE_NOMATCH(dev->parent, dev);
 				devnomatch(dev);
 				dev->flags |= DF_DONENOMATCH;
@@ -2010,19 +2010,22 @@ device_probe_child(device_t dev, device_
 		for (dl = first_matching_driver(dc, child);
 		     dl;
 		     dl = next_matching_driver(dc, child, dl)) {
-
 			/* If this driver's pass is too high, then ignore it. */
 			if (dl->pass > bus_current_pass)
 				continue;
 
 			PDEBUG(("Trying %s", DRIVERNAME(dl->driver)));
-			device_set_driver(child, dl->driver);
+			result = device_set_driver(child, dl->driver);
+			if (result == ENOMEM)
+				return (result);
+			else if (result != 0)
+				continue;
 			if (!hasclass) {
 				if (device_set_devclass(child, dl->driver->name)) {
 					printf("driver bug: Unable to set devclass (devname: %s)\n",
 					    (child ? device_get_name(child) :
 						"no device"));
-					device_set_driver(child, NULL);
+					(void)device_set_driver(child, NULL);
 					continue;
 				}
 			}
@@ -2036,7 +2039,7 @@ device_probe_child(device_t dev, device_
 			/* Reset flags and devclass before the next probe. */
 			child->devflags = 0;
 			if (!hasclass)
-				device_set_devclass(child, NULL);
+				(void)device_set_devclass(child, NULL);
 
 			/*
 			 * If the driver returns SUCCESS, there can be
@@ -2053,7 +2056,7 @@ device_probe_child(device_t dev, device_
 			 * certainly doesn't match.
 			 */
 			if (result > 0) {
-				device_set_driver(child, NULL);
+				(void)device_set_driver(child, NULL);
 				continue;
 			}
 
@@ -2116,7 +2119,9 @@ device_probe_child(device_t dev, device_
 			if (result != 0)
 				return (result);
 		}
-		device_set_driver(child, best->driver);
+		result = device_set_driver(child, best->driver);
+		if (result != 0)
+			return (result);
 		resource_int_value(best->driver->name, child->unit,
 		    "flags", &child->devflags);
 
@@ -2725,8 +2730,8 @@ device_attach(device_t dev)
 		    dev->driver->name, dev->unit, error);
 		/* Unset the class; set in device_probe_child */
 		if (dev->devclass == NULL)
-			device_set_devclass(dev, NULL);
-		device_set_driver(dev, NULL);
+			(void)device_set_devclass(dev, NULL);
+		(void)device_set_driver(dev, NULL);
 		device_sysctl_fini(dev);
 		dev->state = DS_NOTPRESENT;
 		return (error);
@@ -2779,7 +2784,7 @@ device_detach(device_t dev)
 		devclass_delete_device(dev->devclass, dev);
 
 	dev->state = DS_NOTPRESENT;
-	device_set_driver(dev, NULL);
+	(void)device_set_driver(dev, NULL);
 	device_set_desc(dev, NULL);
 	device_sysctl_fini(dev);
 
@@ -4441,7 +4446,6 @@ print_driver(driver_t *driver, int inden
 	print_driver_short(driver, indent);
 }
 
-
 static void
 print_driver_list(driver_list_t drivers, int indent)
 {



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