]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: core: fix adapter debugfs creation
authorJohan Hovold <johan@kernel.org>
Mon, 11 May 2026 14:37:10 +0000 (16:37 +0200)
committerWolfram Sang <wsa+renesas@sang-engineering.com>
Sat, 30 May 2026 21:57:19 +0000 (23:57 +0200)
Clients can be registered from bus notifier callbacks so the debugfs
directory needs to be created before registering the adapter as clients
use that directory as their debugfs parent.

Move debugfs creation before adapter registration to avoid having
clients create their debugfs directories in the debugfs root (which is
also more likely to fail due to name collisions).

Note that failure to allocate the adapter name must now be handled
explicitly as debugfs_create_dir() cannot handle a NULL name (unlike
device_add() which returns an error).

Fixes: 73febd775bdb ("i2c: create debugfs entry per adapter")
Cc: stable@vger.kernel.org # 6.8
Cc: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
drivers/i2c/i2c-core-base.c

index 1caaa3b3ee10522466101d3145e412620c0327f8..25d66de412872b0f96009287846b5291d5cc4207 100644 (file)
@@ -1557,7 +1557,10 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
                goto out_list;
        }
 
-       dev_set_name(&adap->dev, "i2c-%d", adap->nr);
+       res = dev_set_name(&adap->dev, "i2c-%d", adap->nr);
+       if (res)
+               goto err_remove_irq_domain;
+
        adap->dev.bus = &i2c_bus_type;
        adap->dev.type = &i2c_adapter_type;
        device_initialize(&adap->dev);
@@ -1575,14 +1578,14 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
        pm_suspend_ignore_children(&adap->dev, true);
        pm_runtime_enable(&adap->dev);
 
+       adap->debugfs = debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_root);
+
        res = device_add(&adap->dev);
        if (res) {
                pr_err("adapter '%s': can't register device (%d)\n", adap->name, res);
-               goto err_put_adap;
+               goto err_remove_debugfs;
        }
 
-       adap->debugfs = debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_root);
-
        res = i2c_setup_smbus_alert(adap);
        if (res)
                goto out_reg;
@@ -1606,13 +1609,14 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
 
 out_reg:
        i2c_deregister_clients(adap);
-       debugfs_remove_recursive(adap->debugfs);
        device_del(&adap->dev);
+err_remove_debugfs:
+       debugfs_remove_recursive(adap->debugfs);
 err_put_adap:
        init_completion(&adap->dev_released);
        put_device(&adap->dev);
        wait_for_completion(&adap->dev_released);
-
+err_remove_irq_domain:
        i2c_host_notify_irq_teardown(adap);
 out_list:
        mutex_lock(&core_lock);