diff options
Diffstat (limited to 'drivers/dahdi/dahdi-base.c')
-rw-r--r-- | drivers/dahdi/dahdi-base.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c index bfe3a98..ac5b77e 100644 --- a/drivers/dahdi/dahdi-base.c +++ b/drivers/dahdi/dahdi-base.c @@ -495,28 +495,29 @@ struct ecfactory { int dahdi_register_echocan_factory(const struct dahdi_echocan_factory *ec) { struct ecfactory *cur; + struct ecfactory *new; WARN_ON(!ec->owner); + new = kzalloc(sizeof(*new), GFP_KERNEL); + if (!new) + return -ENOMEM; + + INIT_LIST_HEAD(&new->list); + spin_lock(&ecfactory_list_lock); /* make sure it isn't already registered */ list_for_each_entry(cur, &ecfactory_list, list) { if (cur->ec == ec) { spin_unlock(&ecfactory_list_lock); + kfree(new); return -EPERM; } } - if (!(cur = kzalloc(sizeof(*cur), GFP_KERNEL))) { - spin_unlock(&ecfactory_list_lock); - return -ENOMEM; - } - - cur->ec = ec; - INIT_LIST_HEAD(&cur->list); - - list_add_tail(&cur->list, &ecfactory_list); + new->ec = ec; + list_add_tail(&new->list, &ecfactory_list); spin_unlock(&ecfactory_list_lock); @@ -532,6 +533,7 @@ void dahdi_unregister_echocan_factory(const struct dahdi_echocan_factory *ec) list_for_each_entry_safe(cur, next, &ecfactory_list, list) { if (cur->ec == ec) { list_del(&cur->list); + kfree(cur); break; } } |