diff options
author | Evgeniy Polyakov <johnpol@2ka.mipt.ru> | 2006-06-20 08:42:53 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-06-20 08:42:53 +0200 |
commit | d6cc7f1a3b33c89c91b3dfce1ff053178893470e (patch) | |
tree | 8eb8796588b53648c42378a19a6089a5b8790308 /drivers/connector | |
parent | [NETFILTER]: xt_sctp: fix endless loop caused by 0 chunk length (diff) | |
download | linux-d6cc7f1a3b33c89c91b3dfce1ff053178893470e.tar.xz linux-d6cc7f1a3b33c89c91b3dfce1ff053178893470e.zip |
[CONNECTOR]: Initialize subsystem earlier.
Attached patch declares connector init function as subsys_init()
and returns -EAGAIN in case connector is not initialized yet.
Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/connector')
-rw-r--r-- | drivers/connector/connector.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 35897079a78d..79d581c86520 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -308,6 +308,9 @@ int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *)) int err; struct cn_dev *dev = &cdev; + if (!cn_already_initialized) + return -EAGAIN; + err = cn_queue_add_callback(dev->cbdev, name, id, callback); if (err) return err; @@ -435,7 +438,7 @@ static void cn_callback(void *data) mutex_unlock(¬ify_lock); } -static int __init cn_init(void) +static int __devinit cn_init(void) { struct cn_dev *dev = &cdev; int err; @@ -456,21 +459,22 @@ static int __init cn_init(void) sock_release(dev->nls->sk_socket); return -EINVAL; } + + cn_already_initialized = 1; err = cn_add_callback(&dev->id, "connector", &cn_callback); if (err) { + cn_already_initialized = 0; cn_queue_free_dev(dev->cbdev); if (dev->nls->sk_socket) sock_release(dev->nls->sk_socket); return -EINVAL; } - cn_already_initialized = 1; - return 0; } -static void __exit cn_fini(void) +static void __devexit cn_fini(void) { struct cn_dev *dev = &cdev; @@ -482,7 +486,7 @@ static void __exit cn_fini(void) sock_release(dev->nls->sk_socket); } -module_init(cn_init); +subsys_initcall(cn_init); module_exit(cn_fini); EXPORT_SYMBOL_GPL(cn_add_callback); |