summaryrefslogtreecommitdiff
path: root/drivers/isdn/hardware/mISDN/avmfritz.c
diff options
context:
space:
mode:
authorKarsten Keil <keil@b1-systems.de>2012-09-13 04:36:20 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-02 10:39:12 -0700
commit3da7f1ade823595e37e37bca09d9d9f24c945e9a (patch)
tree8ba28d15417a09bbc560046e50a837c639c7effd /drivers/isdn/hardware/mISDN/avmfritz.c
parentdff9a4f031d1804f41b0f45c53543284b93548df (diff)
mISDN: Fix wrong usage of flush_work_sync while holding locks
commit 4b921eda53366b319602351ff4d7256fafa4bd1b upstream. It is a bad idea to hold a spinlock and call flush_work_sync. Move the workqueue cleanup outside the spinlock and use cancel_work_sync, on closing the channel this seems to be the more correct function. Remove the never used and constant return value of mISDN_freebchannel. Signed-off-by: Karsten Keil <keil@b1-systems.de> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/isdn/hardware/mISDN/avmfritz.c')
-rw-r--r--drivers/isdn/hardware/mISDN/avmfritz.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/isdn/hardware/mISDN/avmfritz.c b/drivers/isdn/hardware/mISDN/avmfritz.c
index fa6ca473372..dceaec821b0 100644
--- a/drivers/isdn/hardware/mISDN/avmfritz.c
+++ b/drivers/isdn/hardware/mISDN/avmfritz.c
@@ -857,8 +857,9 @@ avm_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
switch (cmd) {
case CLOSE_CHANNEL:
test_and_clear_bit(FLG_OPEN, &bch->Flags);
+ cancel_work_sync(&bch->workq);
spin_lock_irqsave(&fc->lock, flags);
- mISDN_freebchannel(bch);
+ mISDN_clear_bchannel(bch);
modehdlc(bch, ISDN_P_NONE);
spin_unlock_irqrestore(&fc->lock, flags);
ch->protocol = ISDN_P_NONE;