V4L/DVB (7658): dvb-core: Fix DMX_SET_BUFFER_SIZE in case the buffer shrinks
This patch fixes the bug in DMX_SET_BUFFER_SIZE for the demux. Basically it resets read and write pointers to 0 in case they are beyond the new size of the buffer. Signed-off-by: Andrea Odetti <mariofutire@gmail.com> Signed-off-by: Oliver Endriss <o.endriss@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
3ff9a81b21
commit
48c01a9c2d
|
@ -281,7 +281,9 @@ static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter *dmxdevfilter,
|
||||||
mem = buf->data;
|
mem = buf->data;
|
||||||
buf->data = NULL;
|
buf->data = NULL;
|
||||||
buf->size = size;
|
buf->size = size;
|
||||||
dvb_ringbuffer_flush(buf);
|
|
||||||
|
/* reset and not flush in case the buffer shrinks */
|
||||||
|
dvb_ringbuffer_reset(buf);
|
||||||
spin_unlock_irq(&dmxdevfilter->dev->lock);
|
spin_unlock_irq(&dmxdevfilter->dev->lock);
|
||||||
vfree(mem);
|
vfree(mem);
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,11 @@ void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
|
||||||
rbuf->error = 0;
|
rbuf->error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf)
|
||||||
|
{
|
||||||
|
rbuf->pread = rbuf->pwrite = 0;
|
||||||
|
rbuf->error = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)
|
void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct dvb_ringbuffer {
|
||||||
** to lock read or write operations.
|
** to lock read or write operations.
|
||||||
** Two or more readers must be locked against each other.
|
** Two or more readers must be locked against each other.
|
||||||
** Flushing the buffer counts as a read operation.
|
** Flushing the buffer counts as a read operation.
|
||||||
|
** Resetting the buffer counts as a read and write operation.
|
||||||
** Two or more writers must be locked against each other.
|
** Two or more writers must be locked against each other.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -85,6 +86,13 @@ extern ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf);
|
||||||
extern ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf);
|
extern ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Reset the read and write pointers to zero and flush the buffer
|
||||||
|
** This counts as a read and write operation
|
||||||
|
*/
|
||||||
|
extern void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf);
|
||||||
|
|
||||||
|
|
||||||
/* read routines & macros */
|
/* read routines & macros */
|
||||||
/* ---------------------- */
|
/* ---------------------- */
|
||||||
/* flush buffer */
|
/* flush buffer */
|
||||||
|
|
Loading…
Reference in New Issue