--- zaptel.c 2006-11-01 07:59:07.406935200 +0200 +++ zaptel.c.patched 2006-11-01 08:06:56.469435200 +0200 @@ -2347,8 +2347,10 @@ else if ((chans[unit]->sig & __ZT_SIG_DACS) == __ZT_SIG_DACS) res = -EBUSY; else { + unsigned long flags; /* Assume everything is going to be okay */ res = initialize_channel(chans[unit]); + spin_lock_irqsave(&chans[unit]->lock, flags); if (chans[unit]->flags & ZT_FLAG_PSEUDO) chans[unit]->flags |= ZT_FLAG_AUDIO; if (chans[unit]->span && chans[unit]->span->open) @@ -2360,7 +2362,9 @@ MOD_INC_USE_COUNT; #endif chans[unit]->flags |= ZT_FLAG_OPEN; + spin_unlock_irqrestore(&chans[unit]->lock, flags); } else { + spin_unlock_irqrestore(&chans[unit]->lock, flags); close_channel(chans[unit]); } } @@ -2373,7 +2377,10 @@ { int res=0; if (chans[unit]) { + unsigned long flags; + spin_lock_irqsave(&chans[unit]->lock, flags); chans[unit]->flags &= ~ZT_FLAG_OPEN; + spin_unlock_irqrestore(&chans[unit]->lock, flags); chans[unit]->file = NULL; close_channel(chans[unit]); if (chans[unit]->span && chans[unit]->span->close)