Skip to content

Commit 5d9e2ab

Browse files
Johannes Thumshirngregkh
authored andcommitted
mcb: Implement bus->dev.release callback
The mcb_bus structure previously was released in mcb_release_bus. This lead to the following warning on module unload: ------------[ cut here ]------------ WARNING: CPU: 1 PID: 2032 at drivers/base/core.c:251 device_release+0x73/0x90 Device 'mcb:0' does not have a release() function, it is broken and must be fixed. Modules linked in: men_z135_uart mcb_pci(-) mcb CPU: 1 PID: 2032 Comm: rmmod Not tainted 4.6.0-rc4+ #3 Hardware name: N/A N/A/COMe-mBTi10, BIOS MVV1R921 X64 10/14/2015 00000286 00000286 c0117de4 c12d6f16 c0117e2c c18be0d3 c0117dfc c104f6e1 000000fb f5ccbe08 f5ccbe00 f5c64600 c0117e18 c104f728 00000009 00000000 c0117e10 c18db674 c0117e2c c0117e3c c13ce5c3 c18be0d3 000000fb c18db674 Call Trace: [<c12d6f16>] dump_stack+0x47/0x61 [<c104f6e1>] __warn+0xc1/0xe0 [<c104f728>] warn_slowpath_fmt+0x28/0x30 [<c13ce5c3>] device_release+0x73/0x90 [<c12d92e4>] kobject_release+0x34/0x80 [<c12d929d>] ? kobject_del+0x2d/0x40 [<c12d9205>] kobject_put+0x25/0x50 [<c13ce77f>] put_device+0xf/0x20 [<c13d114b>] klist_devices_put+0xb/0x10 [<c1752673>] klist_next+0x73/0xf0 [<c13d1140>] ? unbind_store+0x100/0x100 [<f8a23370>] ? mcb_bus_add_devices+0x30/0x30 [mcb] [<c13d0a81>] bus_for_each_dev+0x51/0x80 [<f8a23319>] mcb_release_bus+0x19/0x40 [mcb] [<f8a23370>] ? mcb_bus_add_devices+0x30/0x30 [mcb] [<f8a2b033>] mcb_pci_remove+0x13/0x20 [mcb_pci] [<c130d358>] pci_device_remove+0x28/0xb0 [<c13d201b>] __device_release_driver+0x7b/0x110 [<c13d2847>] driver_detach+0x87/0x90 [<c13d1b9b>] bus_remove_driver+0x3b/0x80 [<c13d2ed0>] driver_unregister+0x20/0x50 [<c130be53>] pci_unregister_driver+0x13/0x60 [<f8a2b1f4>] mcb_pci_driver_exit+0xd/0xf [mcb_pci] [<c10be588>] SyS_delete_module+0x138/0x200 [<c1159208>] ? ____fput+0x8/0x10 [<c1068054>] ? task_work_run+0x74/0x90 [<c1001879>] do_fast_syscall_32+0x69/0x120 [<c1757597>] sysenter_past_esp+0x40/0x6a ---[ end trace 1ed34c2aa3019875 ]--- Release a mcb_bus' memory on the device's release callback, to avoid above warning. Signed-off-by: Johannes Thumshirn <[email protected]> Reported-by: Andreas Werner <[email protected]> Tested-by: Andreas Werner <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 803f1ca commit 5d9e2ab

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

drivers/mcb/mcb-core.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ static int mcb_remove(struct device *dev)
8383

8484
static void mcb_shutdown(struct device *dev)
8585
{
86+
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
8687
struct mcb_device *mdev = to_mcb_device(dev);
87-
struct mcb_driver *mdrv = mdev->driver;
8888

8989
if (mdrv && mdrv->shutdown)
9090
mdrv->shutdown(mdev);
@@ -214,6 +214,7 @@ int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev)
214214
int device_id;
215215

216216
device_initialize(&dev->dev);
217+
mcb_bus_get(bus);
217218
dev->dev.bus = &mcb_bus_type;
218219
dev->dev.parent = bus->dev.parent;
219220
dev->dev.release = mcb_release_dev;
@@ -237,6 +238,15 @@ int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev)
237238
}
238239
EXPORT_SYMBOL_GPL(mcb_device_register);
239240

241+
static void mcb_free_bus(struct device *dev)
242+
{
243+
struct mcb_bus *bus = to_mcb_bus(dev);
244+
245+
put_device(bus->carrier);
246+
ida_simple_remove(&mcb_ida, bus->bus_nr);
247+
kfree(bus);
248+
}
249+
240250
/**
241251
* mcb_alloc_bus() - Allocate a new @mcb_bus
242252
*
@@ -259,12 +269,13 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
259269
}
260270

261271
bus->bus_nr = bus_nr;
262-
bus->carrier = carrier;
272+
bus->carrier = get_device(carrier);
263273

264274
device_initialize(&bus->dev);
265275
bus->dev.parent = carrier;
266276
bus->dev.bus = &mcb_bus_type;
267277
bus->dev.type = &mcb_carrier_device_type;
278+
bus->dev.release = &mcb_free_bus;
268279

269280
dev_set_name(&bus->dev, "mcb:%d", bus_nr);
270281
rc = device_add(&bus->dev);
@@ -273,6 +284,7 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
273284

274285
return bus;
275286
err_free:
287+
put_device(carrier);
276288
kfree(bus);
277289
return ERR_PTR(rc);
278290
}
@@ -297,10 +309,6 @@ static void mcb_devices_unregister(struct mcb_bus *bus)
297309
void mcb_release_bus(struct mcb_bus *bus)
298310
{
299311
mcb_devices_unregister(bus);
300-
301-
ida_simple_remove(&mcb_ida, bus->bus_nr);
302-
303-
kfree(bus);
304312
}
305313
EXPORT_SYMBOL_GPL(mcb_release_bus);
306314

0 commit comments

Comments
 (0)