Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Dec 2011 12:55:51 +0200
From:      Ivan Klymenko <fidaj@ukr.net>
To:        svn-src-all@freebsd.org
Subject:   Re: svn commit: r228209 - head/sys/kern
Message-ID:  <20111203125551.156724e1@nonamehost.>
In-Reply-To: <201112022119.pB2LJEqJ009294@svn.freebsd.org>
References:  <201112022119.pB2LJEqJ009294@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
=D0=92 Fri, 2 Dec 2011 21:19:14 +0000 (UTC)
Marius Strobl <marius@FreeBSD.org> =D0=BF=D0=B8=D1=88=D0=B5=D1=82:

> Author: marius
> Date: Fri Dec  2 21:19:14 2011
> New Revision: 228209
> URL: http://svn.freebsd.org/changeset/base/228209
>=20
> Log:
>   - 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.=20
>   Reviewed by:	yongari (slightly earlier version)
>=20
> Modified:
>   head/sys/kern/subr_bus.c
>=20
> Modified: head/sys/kern/subr_bus.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/kern/subr_bus.c	Fri Dec  2 20:28:45 2011
> (r228208) +++ head/sys/kern/subr_bus.c	Fri Dec  2 21:19:14
> 2011	(r228209) @@ -1129,7 +1129,7 @@
> devclass_driver_deleted(devclass_t buscl dev->parent->devclass =3D=3D
> busclass) { if ((error =3D device_detach(dev)) !=3D 0)
>  					return (error);
> -				device_set_driver(dev, NULL);
> +				(void)device_set_driver(dev, NULL);
>  				BUS_PROBE_NOMATCH(dev->parent, dev);
>  				devnomatch(dev);
>  				dev->flags |=3D DF_DONENOMATCH;
> @@ -2007,19 +2007,22 @@ device_probe_child(device_t dev, device_
>  		for (dl =3D first_matching_driver(dc, child);
>  		     dl;
>  		     dl =3D next_matching_driver(dc, child, dl)) {
> -
>  			/* If this driver's pass is too high, then
> ignore it. */ if (dl->pass > bus_current_pass)
>  				continue;
> =20
>  			PDEBUG(("Trying %s",
> DRIVERNAME(dl->driver)));
> -			device_set_driver(child, dl->driver);
> +			result =3D device_set_driver(child,
> dl->driver);
> +			if (result =3D=3D ENOMEM)
> +				return (result);
> +			else if (result !=3D 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;
>  				}
>  			}
> @@ -2033,7 +2036,7 @@ device_probe_child(device_t dev, device_
>  			/* Reset flags and devclass before the next
> probe. */ child->devflags =3D 0;
>  			if (!hasclass)
> -				device_set_devclass(child, NULL);
> +				(void)device_set_devclass(child,
> NULL);=20
>  			/*
>  			 * If the driver returns SUCCESS, there can
> be @@ -2050,7 +2053,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;
>  			}
> =20
> @@ -2113,7 +2116,9 @@ device_probe_child(device_t dev, device_
>  			if (result !=3D 0)
>  				return (result);
>  		}
> -		device_set_driver(child, best->driver);
> +		result =3D device_set_driver(child, best->driver);
> +		if (result !=3D 0)
> +			return (result);
>  		resource_int_value(best->driver->name, child->unit,
>  		    "flags", &child->devflags);
> =20
> @@ -2722,8 +2727,8 @@ device_attach(device_t dev)
>  		    dev->driver->name, dev->unit, error);
>  		/* Unset the class; set in device_probe_child */
>  		if (dev->devclass =3D=3D 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 =3D DS_NOTPRESENT;
>  		return (error);
> @@ -2776,7 +2781,7 @@ device_detach(device_t dev)
>  		devclass_delete_device(dev->devclass, dev);
> =20
>  	dev->state =3D DS_NOTPRESENT;
> -	device_set_driver(dev, NULL);
> +	(void)device_set_driver(dev, NULL);
>  	device_set_desc(dev, NULL);
>  	device_sysctl_fini(dev);
> =20
> @@ -4613,7 +4618,6 @@ print_driver(driver_t *driver, int inden
>  	print_driver_short(driver, indent);
>  }
> =20
> -
>  static void
>  print_driver_list(driver_list_t drivers, int indent)
>  {

Thank you!
Now I can again connect a USB external drive...
But, nevertheless, remains a problem when you connect an external drive
via FireWire...



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