瀏覽代碼

driver core: warn about duplicate driver names on the same bus

Currently an attempt to register multiple
drivers with the same name causes the
stack trace with some cryptic error message.
The attached patch adds the necessary check
and the clear error message.

Signed-off-by: Stas Sergeev <stsp@aknet.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Stas Sergeev 17 年之前
父節點
當前提交
16dc42e018
共有 1 個文件被更改,包括 10 次插入0 次删除
  1. 10 0
      drivers/base/driver.c

+ 10 - 0
drivers/base/driver.c

@@ -217,12 +217,22 @@ static void driver_remove_groups(struct device_driver *drv,
 int driver_register(struct device_driver *drv)
 int driver_register(struct device_driver *drv)
 {
 {
 	int ret;
 	int ret;
+	struct device_driver *other;
 
 
 	if ((drv->bus->probe && drv->probe) ||
 	if ((drv->bus->probe && drv->probe) ||
 	    (drv->bus->remove && drv->remove) ||
 	    (drv->bus->remove && drv->remove) ||
 	    (drv->bus->shutdown && drv->shutdown))
 	    (drv->bus->shutdown && drv->shutdown))
 		printk(KERN_WARNING "Driver '%s' needs updating - please use "
 		printk(KERN_WARNING "Driver '%s' needs updating - please use "
 			"bus_type methods\n", drv->name);
 			"bus_type methods\n", drv->name);
+
+	other = driver_find(drv->name, drv->bus);
+	if (other) {
+		put_driver(other);
+		printk(KERN_ERR "Error: Driver '%s' is already registered, "
+			"aborting...\n", drv->name);
+		return -EEXIST;
+	}
+
 	ret = bus_add_driver(drv);
 	ret = bus_add_driver(drv);
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;