From e5a4426d6f65ea15712df1f020c3551a0c8c7fc6 Mon Sep 17 00:00:00 2001 From: mattf Date: Fri, 30 Mar 2007 21:07:03 +0000 Subject: Merged revisions 2359 via svnmerge from https://origsvn.digium.com/svn/zaptel/branches/1.4 ........ r2359 | mattf | 2007-03-30 15:03:19 -0600 (Fri, 30 Mar 2007) | 2 lines Fix potential spinlock recursion issue. ........ git-svn-id: http://svn.digium.com/svn/zaptel/trunk@2360 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- zaptel.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'zaptel.c') diff --git a/zaptel.c b/zaptel.c index 65e7426..5f01539 100644 --- a/zaptel.c +++ b/zaptel.c @@ -6260,6 +6260,22 @@ static inline void __zt_putbuf_chunk(struct zt_chan *ss, unsigned char *rxb) __putbuf_chunk(ss, rxb, ZT_CHUNKSIZE); } +extern 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; @@ -6289,23 +6305,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; -- cgit v1.2.3