From 86ec71b1a7d9b6b68deead5ae95e1c5e7b618a12 Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Wed, 10 Dec 2014 08:39:39 -0600 Subject: [PATCH] dahdi_dynamic: Release reference count on network device when destroying dynamic spans. It was reported that for VLAN interfaces, failing to release this reference count will prevent a system from rebooting properly, resulting in the need to power cycle. Reported-by: Assen Totin Internal-Issue-ID: DAHLIN-343 Signed-off-by: Shaun Ruffell --- drivers/dahdi/dahdi_dynamic_eth.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/dahdi/dahdi_dynamic_eth.c b/drivers/dahdi/dahdi_dynamic_eth.c index e92ba30..ab63d71 100644 --- a/drivers/dahdi/dahdi_dynamic_eth.c +++ b/drivers/dahdi/dahdi_dynamic_eth.c @@ -266,6 +266,7 @@ static void ztdeth_destroy(struct dahdi_dynamic *dyn) struct ztdeth *z = dyn->pvt; unsigned long flags; struct ztdeth *prev=NULL, *cur; + spin_lock_irqsave(&zlock, flags); cur = zdevs; while(cur) { @@ -279,12 +280,14 @@ static void ztdeth_destroy(struct dahdi_dynamic *dyn) prev = cur; cur = cur->next; } + spin_unlock_irqrestore(&zlock, flags); + if (cur == z) { /* Successfully removed */ dyn->pvt = NULL; + dev_put(z->dev); printk(KERN_INFO "TDMoE: Removed interface for %s\n", z->span->name); kfree(z); } - spin_unlock_irqrestore(&zlock, flags); } static int ztdeth_create(struct dahdi_dynamic *dyn, const char *addr) -- 2.1.2