diff options
author | mattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-03-30 21:03:19 +0000 |
---|---|---|
committer | mattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-03-30 21:03:19 +0000 |
commit | 32c19e218448140844f31d90e1e8df37872631ec (patch) | |
tree | e7286589581f7b147e3086103fb6741fb78e2b2b /zaptel-base.c | |
parent | d6b5e1bec7e7eedad491c374c175570fa41b44c1 (diff) |
Fix potential spinlock recursion issue.
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@2359 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'zaptel-base.c')
-rw-r--r-- | zaptel-base.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/zaptel-base.c b/zaptel-base.c index fb7b932..89ccc4e 100644 --- a/zaptel-base.c +++ b/zaptel-base.c @@ -6267,6 +6267,22 @@ static inline void __zt_putbuf_chunk(struct zt_chan *ss, unsigned char *rxb) __putbuf_chunk(ss, rxb, ZT_CHUNKSIZE); } +void __zt_hdlc_abort(struct zt_chan *ss, int event) +{ + if (ss->inreadbuf >= 0) + ss->readidx[ss->inreadbuf] = 0; + if ((ss->flags & ZT_FLAG_OPEN) && !ss->span->alarms) + __qevent(ss->master, event); +} + +extern void zt_hdlc_abort(struct zt_chan *ss, int event) +{ + unsigned long flags; + spin_lock_irqsave(&ss->lock, flags); + __zt_hdlc_abort(ss, event); + spin_unlock_irqrestore(&ss->lock, flags); +} + extern void zt_hdlc_putbuf(struct zt_chan *ss, unsigned char *rxb, int bytes) { unsigned long flags; @@ -6296,23 +6312,12 @@ extern void zt_hdlc_putbuf(struct zt_chan *ss, unsigned char *rxb, int bytes) #ifdef CONFIG_ZAPATA_DEBUG printk("HDLC frame isn't fit into buffer space\n"); #endif - zt_hdlc_abort(ss, ZT_EVENT_OVERRUN); + __zt_hdlc_abort(ss, ZT_EVENT_OVERRUN); } res = left; spin_unlock_irqrestore(&ss->lock, flags); } -extern void zt_hdlc_abort(struct zt_chan *ss, int event) -{ - unsigned long flags; - spin_lock_irqsave(&ss->lock, flags); - if (ss->inreadbuf >= 0) - ss->readidx[ss->inreadbuf] = 0; - if ((ss->flags & ZT_FLAG_OPEN) && !ss->span->alarms) - __qevent(ss->master, event); - spin_unlock_irqrestore(&ss->lock, flags); -} - extern void zt_hdlc_finish(struct zt_chan *ss) { int oldreadbuf; |