diff options
Diffstat (limited to 'drivers/media/dvb-core/dvb_demux.c')
| -rw-r--r-- | drivers/media/dvb-core/dvb_demux.c | 26 | 
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c index 3485655fa08..6c7ff0cdcd3 100644 --- a/drivers/media/dvb-core/dvb_demux.c +++ b/drivers/media/dvb-core/dvb_demux.c @@ -435,7 +435,7 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)  		dprintk_tscheck("TEI detected. "  				"PID=0x%x data1=0x%x\n",  				pid, buf[1]); -		/* data in this packet cant be trusted - drop it unless +		/* data in this packet can't be trusted - drop it unless  		 * module option dvb_demux_feed_err_pkts is set */  		if (!dvb_demux_feed_err_pkts)  			return; @@ -476,7 +476,9 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)  void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,  			      size_t count)  { -	spin_lock(&demux->lock); +	unsigned long flags; + +	spin_lock_irqsave(&demux->lock, flags);  	while (count--) {  		if (buf[0] == 0x47) @@ -484,7 +486,7 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,  		buf += 188;  	} -	spin_unlock(&demux->lock); +	spin_unlock_irqrestore(&demux->lock, flags);  }  EXPORT_SYMBOL(dvb_dmx_swfilter_packets); @@ -519,8 +521,9 @@ static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf,  {  	int p = 0, i, j;  	const u8 *q; +	unsigned long flags; -	spin_lock(&demux->lock); +	spin_lock_irqsave(&demux->lock, flags);  	if (demux->tsbufp) { /* tsbuf[0] is now 0x47. */  		i = demux->tsbufp; @@ -564,7 +567,7 @@ static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf,  	}  bailout: -	spin_unlock(&demux->lock); +	spin_unlock_irqrestore(&demux->lock, flags);  }  void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) @@ -581,11 +584,13 @@ EXPORT_SYMBOL(dvb_dmx_swfilter_204);  void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count)  { -	spin_lock(&demux->lock); +	unsigned long flags; + +	spin_lock_irqsave(&demux->lock, flags);  	demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, DMX_OK); -	spin_unlock(&demux->lock); +	spin_unlock_irqrestore(&demux->lock, flags);  }  EXPORT_SYMBOL(dvb_dmx_swfilter_raw); @@ -1027,8 +1032,13 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed,  		return -EINVAL;  	} -	if (feed->is_filtering) +	if (feed->is_filtering) { +		/* release dvbdmx->mutex as far as it is +		   acquired by stop_filtering() itself */ +		mutex_unlock(&dvbdmx->mutex);  		feed->stop_filtering(feed); +		mutex_lock(&dvbdmx->mutex); +	}  	spin_lock_irq(&dvbdmx->lock);  	f = dvbdmxfeed->filter;  | 
