dahdi: Completely stop spans when unassigning.
When spans are unassigned, dahdi_span_ops.shutdown was called, but the RUNNING
flag was never cleared. Now make sure all calls to the shutdown span ops
callback are the same.
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
(cherry picked from commit 9b11847aee
)
This commit is contained in:
parent
7dc4bb92a7
commit
94a09b5c19
@ -4887,11 +4887,28 @@ static int dahdi_ioctl_startup(struct file *file, unsigned long data)
|
||||
return res;
|
||||
}
|
||||
|
||||
static int dahdi_shutdown_span(struct dahdi_span *s)
|
||||
{
|
||||
int res = 0;
|
||||
int x;
|
||||
|
||||
/* Unconfigure channels */
|
||||
for (x = 0; x < s->channels; x++)
|
||||
s->chans[x]->sig = 0;
|
||||
|
||||
if (s->ops->shutdown)
|
||||
res = s->ops->shutdown(s);
|
||||
|
||||
clear_bit(DAHDI_FLAGBIT_RUNNING, &s->flags);
|
||||
return res;
|
||||
}
|
||||
|
||||
static int dahdi_ioctl_shutdown(unsigned long data)
|
||||
{
|
||||
int res;
|
||||
/* I/O CTL's for control interface */
|
||||
int j;
|
||||
int x;
|
||||
|
||||
struct dahdi_span *s;
|
||||
|
||||
if (get_user(j, (int __user *)data))
|
||||
@ -4899,23 +4916,10 @@ static int dahdi_ioctl_shutdown(unsigned long data)
|
||||
s = span_find_and_get(j);
|
||||
if (!s)
|
||||
return -ENXIO;
|
||||
|
||||
/* Unconfigure channels */
|
||||
for (x = 0; x < s->channels; x++)
|
||||
s->chans[x]->sig = 0;
|
||||
|
||||
if (s->ops->shutdown) {
|
||||
int res = s->ops->shutdown(s);
|
||||
if (res) {
|
||||
res = dahdi_shutdown_span(s);
|
||||
put_span(s);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
s->flags &= ~DAHDI_FLAG_RUNNING;
|
||||
put_span(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* dahdi_is_hwec_available - Is hardware echocan available on a channel?
|
||||
@ -7110,6 +7114,7 @@ static void disable_span(struct dahdi_span *span)
|
||||
*/
|
||||
static int _dahdi_unassign_span(struct dahdi_span *span)
|
||||
{
|
||||
int res;
|
||||
int x;
|
||||
struct dahdi_span *new_master, *s;
|
||||
unsigned long flags;
|
||||
@ -7126,9 +7131,11 @@ static int _dahdi_unassign_span(struct dahdi_span *span)
|
||||
span->spanno = 0;
|
||||
clear_bit(DAHDI_FLAGBIT_REGISTERED, &span->flags);
|
||||
|
||||
/* Shutdown the span if it's running */
|
||||
if ((span->flags & DAHDI_FLAG_RUNNING) && span->ops->shutdown)
|
||||
span->ops->shutdown(span);
|
||||
res = dahdi_shutdown_span(span);
|
||||
if (res) {
|
||||
dev_err(span_device(span),
|
||||
"Failed to shutdown when unassigning.\n");
|
||||
}
|
||||
|
||||
if (debug & DEBUG_MAIN)
|
||||
module_printk(KERN_NOTICE, "Unassigning Span '%s' with %d channels\n", span->name, span->channels);
|
||||
|
Loading…
Reference in New Issue
Block a user