Re: [PATCH v1 1/4] driver core: allow certain drivers prohibit override via sysfs

From: Danilo Krummrich

Date: Fri May 08 2026 - 11:18:32 EST


On Fri May 8, 2026 at 11:42 AM CEST, Andy Shevchenko wrote:
> diff --git a/drivers/base/bus.c b/drivers/base/bus.c
> index d17bd91490ee..16a530b91a00 100644
> --- a/drivers/base/bus.c
> +++ b/drivers/base/bus.c
> @@ -594,7 +594,7 @@ int bus_add_device(struct device *dev)
> out_subsys:
> sysfs_remove_link(&sp->devices_kset->kobj, dev_name(dev));
> out_override:
> - if (dev->bus->driver_override)
> + if (dev->bus->driver_override && !dev->driver->suppress_override_attrs)

I think that doesn't work, when bus_add_device() is called no driver is bound to
the device yet, so dev->driver should be NULL.

But more in general, I think this isn't an implementation issue, but a
conceptual issue.

The driver_override attribute is on the device, and indicates whether this
device should be forcefully matched against some specific driver.

Now, if we want to suppress this attribute, we can't really let some driver
define whether is should be suppressed for this device.

Which driver would that be? The one that's already bound?

That said, I think the problem you actually want to resolve is not "suppress the
driver_override attribute", but rather "don't bind this driver through
driver_override".

IOW, this is a match() problem not a sysfs attribute problem.

So, I think the change that we actually want, is this one:

diff --git a/include/linux/device.h b/include/linux/device.h
index d54c86d77764..64bcb46edb97 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -839,9 +839,11 @@ static inline int device_match_driver_override(struct device *dev,
const struct device_driver *drv)
{
guard(spinlock)(&dev->driver_override.lock);
- if (dev->driver_override.name)
- return !strcmp(dev->driver_override.name, drv->name);
- return -1;
+ if (!dev->driver_override.name)
+ return -1;
+ if (drv->no_driver_override)
+ return 0;
+ return !strcmp(dev->driver_override.name, drv->name);
}

/**
diff --git a/include/linux/device/driver.h b/include/linux/device/driver.h
index bbc67ec513ed..d48cd9822634 100644
--- a/include/linux/device/driver.h
+++ b/include/linux/device/driver.h
@@ -55,6 +55,7 @@ enum probe_type {
* @owner: The module owner.
* @mod_name: Used for built-in modules.
* @suppress_bind_attrs: Disables bind/unbind via sysfs.
+ * @no_driver_override: The driver will not be matched via driver_override.
* @probe_type: Type of the probe (synchronous or asynchronous) to use.
* @of_match_table: The open firmware table.
* @acpi_match_table: The ACPI match table.
@@ -103,6 +104,7 @@ struct device_driver {
const char *mod_name; /* used for built-in modules */

bool suppress_bind_attrs; /* disables bind/unbind via sysfs */
+ bool no_driver_override; /* not matchable via driver_override */
enum probe_type probe_type;

const struct of_device_id *of_match_table;

This should also get us rid of the SPI patch, since SPI already uses
device_match_driver_override() in spi_match_device().