diff options
| author | Dominik Brodowski <linux@dominikbrodowski.net> | 2005-06-27 19:28:54 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-27 21:03:20 -0400 |
| commit | 378a33a686d457fa5a38d6ad134f5385a9cc7860 (patch) | |
| tree | d3773b8cc8dec6580b7d2b7327766e9cd8738e5d | |
| parent | 3448139b41b9e3b8799eed7d427cd50789dadc3e (diff) | |
[PATCH] pcmcia: release_class
Properly wait for the class refcount to reach zero.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | drivers/pcmcia/cs.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 0ff4d6ec8b77..e82859d3227a 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
| @@ -903,17 +903,29 @@ static int pcmcia_socket_hotplug(struct class_device *dev, char **envp, | |||
| 903 | } | 903 | } |
| 904 | 904 | ||
| 905 | 905 | ||
| 906 | static struct completion pcmcia_unload; | ||
| 907 | |||
| 908 | static void pcmcia_release_socket_class(struct class *data) | ||
| 909 | { | ||
| 910 | complete(&pcmcia_unload); | ||
| 911 | } | ||
| 912 | |||
| 913 | |||
| 906 | struct class pcmcia_socket_class = { | 914 | struct class pcmcia_socket_class = { |
| 907 | .name = "pcmcia_socket", | 915 | .name = "pcmcia_socket", |
| 908 | .hotplug = pcmcia_socket_hotplug, | 916 | .hotplug = pcmcia_socket_hotplug, |
| 909 | .release = pcmcia_release_socket, | 917 | .release = pcmcia_release_socket, |
| 918 | .class_release = pcmcia_release_socket_class, | ||
| 910 | }; | 919 | }; |
| 911 | EXPORT_SYMBOL(pcmcia_socket_class); | 920 | EXPORT_SYMBOL(pcmcia_socket_class); |
| 912 | 921 | ||
| 913 | 922 | ||
| 914 | static int __init init_pcmcia_cs(void) | 923 | static int __init init_pcmcia_cs(void) |
| 915 | { | 924 | { |
| 916 | int ret = class_register(&pcmcia_socket_class); | 925 | int ret; |
| 926 | |||
| 927 | init_completion(&pcmcia_unload); | ||
| 928 | ret = class_register(&pcmcia_socket_class); | ||
| 917 | if (ret) | 929 | if (ret) |
| 918 | return (ret); | 930 | return (ret); |
| 919 | return class_interface_register(&pccard_sysfs_interface); | 931 | return class_interface_register(&pccard_sysfs_interface); |
| @@ -923,6 +935,8 @@ static void __exit exit_pcmcia_cs(void) | |||
| 923 | { | 935 | { |
| 924 | class_interface_unregister(&pccard_sysfs_interface); | 936 | class_interface_unregister(&pccard_sysfs_interface); |
| 925 | class_unregister(&pcmcia_socket_class); | 937 | class_unregister(&pcmcia_socket_class); |
| 938 | |||
| 939 | wait_for_completion(&pcmcia_unload); | ||
| 926 | } | 940 | } |
| 927 | 941 | ||
| 928 | subsys_initcall(init_pcmcia_cs); | 942 | subsys_initcall(init_pcmcia_cs); |
