]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
nubus: Call put_device() in bus initialization error path
authorFinn Thain <fthain@linux-m68k.org>
Sat, 13 Dec 2025 07:21:09 +0000 (18:21 +1100)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Mon, 26 Jan 2026 11:26:01 +0000 (12:26 +0100)
The error path for bus initialization is missing a call to put_device().
Add that call.  This error path will probably never actually execute,
but any kernel source code may be subject to static checking or re-use.

Cc: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
Cc: Daniel Palmer <daniel@0x0f.com>
Suggested-by: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
Signed-off-by: Finn Thain <fthain@linux-m68k.org>
Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://patch.msgid.link/478d5f080d74b6688c9e3f9132e3fe251e997ad7.1765610469.git.fthain@linux-m68k.org
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
drivers/nubus/bus.c
drivers/nubus/nubus.c
include/linux/nubus.h

index 12df4d88970c8088dbc05c6dc9f18da33c1e3f25..b7d417385d9846b42c64a7030bd1378b14d921bb 100644 (file)
@@ -51,21 +51,12 @@ void nubus_driver_unregister(struct nubus_driver *ndrv)
 }
 EXPORT_SYMBOL(nubus_driver_unregister);
 
-static struct device nubus_parent = {
-       .init_name      = "nubus",
-};
-
 static int __init nubus_bus_register(void)
 {
        return bus_register(&nubus_bus_type);
 }
 postcore_initcall(nubus_bus_register);
 
-int __init nubus_parent_device_register(void)
-{
-       return device_register(&nubus_parent);
-}
-
 static void nubus_device_release(struct device *dev)
 {
        struct nubus_board *board = to_nubus_board(dev);
@@ -79,9 +70,9 @@ static void nubus_device_release(struct device *dev)
        kfree(board);
 }
 
-int nubus_device_register(struct nubus_board *board)
+int nubus_device_register(struct device *parent, struct nubus_board *board)
 {
-       board->dev.parent = &nubus_parent;
+       board->dev.parent = parent;
        board->dev.release = nubus_device_release;
        board->dev.bus = &nubus_bus_type;
        dev_set_name(&board->dev, "slot.%X", board->slot);
index ab0f32b901c84f52045096a904a5f50996eab30f..197c8c0de1999be302baadcdca8c9ad773b03adb 100644 (file)
@@ -41,6 +41,10 @@ module_param_named(populate_procfs, nubus_populate_procfs, bool, 0);
 
 LIST_HEAD(nubus_func_rsrcs);
 
+static struct device nubus_parent = {
+       .init_name      = "nubus",
+};
+
 /* Meaning of "bytelanes":
 
    The card ROM may appear on any or all bytes of each long word in
@@ -829,7 +833,7 @@ static void __init nubus_add_board(int slot, int bytelanes)
                list_add_tail(&fres->list, &nubus_func_rsrcs);
        }
 
-       if (nubus_device_register(board))
+       if (nubus_device_register(&nubus_parent, board))
                put_device(&board->dev);
 }
 
@@ -882,9 +886,11 @@ static int __init nubus_init(void)
                return 0;
 
        nubus_proc_init();
-       err = nubus_parent_device_register();
-       if (err)
+       err = device_register(&nubus_parent);
+       if (err) {
+               put_device(&nubus_parent);
                return err;
+       }
        nubus_scan_bus();
        return 0;
 }
index 4d103ac8f5c7a90d609825de3f7fc348bf5fd5c9..b8710c825d6403228f04bee6db8cf897f79da578 100644 (file)
@@ -162,8 +162,7 @@ void nubus_seq_write_rsrc_mem(struct seq_file *m,
 unsigned char *nubus_dirptr(const struct nubus_dirent *nd);
 
 /* Declarations relating to driver model objects */
-int nubus_parent_device_register(void);
-int nubus_device_register(struct nubus_board *board);
+int nubus_device_register(struct device *parent, struct nubus_board *board);
 int nubus_driver_register(struct nubus_driver *ndrv);
 void nubus_driver_unregister(struct nubus_driver *ndrv);
 int nubus_proc_show(struct seq_file *m, void *data);