On Mon, Jun 14, 2021 at 05:08:38PM +0200, Christoph Hellwig wrote:
> really_probe tries to special case errors from ->probe, but due to all
> other initialization added to the function over time now a lot of
> internal errors hit that code path as well.  Untangle that by adding
> a new probe_err local variable and apply the special casing only to
> that.
> 
> Signed-off-by: Christoph Hellwig <h...@lst.de>
> ---
>  drivers/base/dd.c | 72 +++++++++++++++++++++++++++--------------------
>  1 file changed, 41 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/base/dd.c b/drivers/base/dd.c
> index 7477d3322b3a..999bc737a8f0 100644
> --- a/drivers/base/dd.c
> +++ b/drivers/base/dd.c
> @@ -513,12 +513,42 @@ static ssize_t state_synced_show(struct device *dev,
>  }
>  static DEVICE_ATTR_RO(state_synced);
>  
> +
> +static int call_driver_probe(struct device *dev, struct device_driver *drv)
> +{
> +     int ret = 0;
> +
> +     if (dev->bus->probe)
> +             ret = dev->bus->probe(dev);
> +     else if (drv->probe)
> +             ret = drv->probe(dev);
> +
> +     switch (ret) {
> +     case -EPROBE_DEFER:
> +             /* Driver requested deferred probing */
> +             dev_dbg(dev, "Driver %s requests probe deferral\n", drv->name);
> +             break;
> +     case -ENODEV:
> +     case -ENXIO:
> +             pr_debug("%s: probe of %s rejects match %d\n",
> +                      drv->name, dev_name(dev), ret);
> +             break;
> +     default:
> +             /* driver matched but the probe failed */
> +             pr_warn("%s: probe of %s failed with error %d\n",
> +                     drv->name, dev_name(dev), ret);
> +             break;
> +     }

Like Kirti said, 0 needs to be handled here.  Did this not spew a lot of
warnings in the logs?

And we can fix up the pr_* calls to use dev_* in the future, shows the
evolution of this code...

thanks,

greg k-h

Reply via email to