1 diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
2 index e4b5c03..caca6e5 100644
3 --- a/drivers/media/dvb/dvb-core/dmxdev.c
4 +++ b/drivers/media/dvb/dvb-core/dmxdev.c
5 @@ -81,9 +81,14 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
10 ret = wait_event_interruptible(src->queue,
11 !dvb_ringbuffer_empty(src) ||
13 + (src->error != 0) ||
14 + (src->do_wait != 1));
15 + if (src->do_wait != 1)
21 @@ -963,6 +968,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
25 +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
29 + dmxdevfilter->buffer.do_wait = 0;
31 + if (waitqueue_active(&dmxdevfilter->buffer.queue))
32 + wake_up(&dmxdevfilter->buffer.queue);
34 + ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
36 + dmxdevfilter->buffer.do_wait = 1;
41 static int dvb_demux_do_ioctl(struct file *file,
42 unsigned int cmd, void *parg)
44 @@ -976,7 +997,7 @@ static int dvb_demux_do_ioctl(struct file *file,
48 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
49 + if (dvb_demux_lock_filter(dmxdevfilter)) {
50 mutex_unlock(&dmxdev->mutex);
53 @@ -988,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
57 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
58 + if (dvb_demux_lock_filter(dmxdevfilter)) {
59 mutex_unlock(&dmxdev->mutex);
62 @@ -997,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
66 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
67 + if (dvb_demux_lock_filter(dmxdevfilter)) {
68 mutex_unlock(&dmxdev->mutex);
71 @@ -1006,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
74 case DMX_SET_PES_FILTER:
75 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
76 + if (dvb_demux_lock_filter(dmxdevfilter)) {
77 mutex_unlock(&dmxdev->mutex);
80 @@ -1015,7 +1036,7 @@ static int dvb_demux_do_ioctl(struct file *file,
83 case DMX_SET_BUFFER_SIZE:
84 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
85 + if (dvb_demux_lock_filter(dmxdevfilter)) {
86 mutex_unlock(&dmxdev->mutex);
89 @@ -1059,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
93 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
94 + if (dvb_demux_lock_filter(dmxdevfilter)) {
98 @@ -1068,7 +1089,7 @@ static int dvb_demux_do_ioctl(struct file *file,
102 - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
103 + if (dvb_demux_lock_filter(dmxdevfilter)) {
107 diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
108 index a5712cd..9f744c2 100644
109 --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
110 +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
111 @@ -45,7 +45,8 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
118 init_waitqueue_head(&rbuf->queue);
120 spin_lock_init(&(rbuf->lock));
121 diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
122 index 41f04da..6951dd3 100644
123 --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
124 +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
125 @@ -39,6 +39,7 @@ struct dvb_ringbuffer {
127 wait_queue_head_t queue;
132 #define DVB_RINGBUFFER_PKTHDRSIZE 3