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 hch@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