diff options
author | Jeff Dike <jdike@addtoit.com> | 2007-05-06 17:51:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-07 15:13:02 -0400 |
commit | 2e3f5251ac716879df6b6271f243f657c6e02e9a (patch) | |
tree | 2395a370a84775541aa9c4a05b51b1d3c46eeae3 /arch/um/drivers/net_kern.c | |
parent | d8839354a04181b4cc95cebf7f7622cf336bd58e (diff) |
uml: drivers get release methods
Define release methods for the ubd and net drivers. They contain as much of
the remove methods as make sense. All error checking must have already been
done as well as anything else that might be holding a reference on the device
kobject.
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/um/drivers/net_kern.c')
-rw-r--r-- | arch/um/drivers/net_kern.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index b2c292a66218..baac4ad5e68e 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c | |||
@@ -341,6 +341,19 @@ static struct platform_driver uml_net_driver = { | |||
341 | }; | 341 | }; |
342 | static int driver_registered; | 342 | static int driver_registered; |
343 | 343 | ||
344 | static void net_device_release(struct device *dev) | ||
345 | { | ||
346 | struct uml_net *device = dev->driver_data; | ||
347 | struct net_device *netdev = device->dev; | ||
348 | struct uml_net_private *lp = netdev->priv; | ||
349 | |||
350 | if(lp->remove != NULL) | ||
351 | (*lp->remove)(&lp->user); | ||
352 | list_del(&device->list); | ||
353 | kfree(device); | ||
354 | free_netdev(netdev); | ||
355 | } | ||
356 | |||
344 | static void eth_configure(int n, void *init, char *mac, | 357 | static void eth_configure(int n, void *init, char *mac, |
345 | struct transport *transport) | 358 | struct transport *transport) |
346 | { | 359 | { |
@@ -396,6 +409,8 @@ static void eth_configure(int n, void *init, char *mac, | |||
396 | } | 409 | } |
397 | device->pdev.id = n; | 410 | device->pdev.id = n; |
398 | device->pdev.name = DRIVER_NAME; | 411 | device->pdev.name = DRIVER_NAME; |
412 | device->pdev.dev.release = net_device_release; | ||
413 | device->pdev.dev.driver_data = device; | ||
399 | if(platform_device_register(&device->pdev)) | 414 | if(platform_device_register(&device->pdev)) |
400 | goto out_free_netdev; | 415 | goto out_free_netdev; |
401 | SET_NETDEV_DEV(dev,&device->pdev.dev); | 416 | SET_NETDEV_DEV(dev,&device->pdev.dev); |
@@ -689,13 +704,9 @@ static int net_remove(int n, char **error_out) | |||
689 | lp = dev->priv; | 704 | lp = dev->priv; |
690 | if(lp->fd > 0) | 705 | if(lp->fd > 0) |
691 | return -EBUSY; | 706 | return -EBUSY; |
692 | if(lp->remove != NULL) (*lp->remove)(&lp->user); | ||
693 | unregister_netdev(dev); | 707 | unregister_netdev(dev); |
694 | platform_device_unregister(&device->pdev); | 708 | platform_device_unregister(&device->pdev); |
695 | 709 | ||
696 | list_del(&device->list); | ||
697 | kfree(device); | ||
698 | free_netdev(dev); | ||
699 | return 0; | 710 | return 0; |
700 | } | 711 | } |
701 | 712 | ||