From 3abfa1066b9e98df434868eda9ba91d7012d45c6 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Wed, 9 Jan 2013 13:31:16 -0700 Subject: [PATCH] staging: comedi: comedi_buf: clarify comedi_buf_read_free() Reword the comment about the need for the smp_mb(). Clarify the check to make sure the number of bytes to free is not more than the number of bytes allocated. Signed-off-by: H Hartley Sweeten Signed-off-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/comedi_buf.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/staging/comedi/comedi_buf.c b/drivers/staging/comedi/comedi_buf.c index 971f7394a1f0..70d29016f8c0 100644 --- a/drivers/staging/comedi/comedi_buf.c +++ b/drivers/staging/comedi/comedi_buf.c @@ -312,14 +312,19 @@ EXPORT_SYMBOL(comedi_buf_read_alloc); /* transfers control of a chunk from reader to free buffer space */ unsigned comedi_buf_read_free(struct comedi_async *async, unsigned int nbytes) { - /* barrier insures data has been read out of - * buffer before read count is incremented */ + unsigned int allocated; + + /* + * ensure data has been read out of buffer before + * the async read count is incremented + */ smp_mb(); - if ((int)(async->buf_read_count + nbytes - - async->buf_read_alloc_count) > 0) { + + allocated = comedi_buf_read_n_allocated(async); + if (nbytes > allocated) { dev_info(async->subdevice->device->class_dev, "attempted to read-free more bytes than have been read-allocated.\n"); - nbytes = async->buf_read_alloc_count - async->buf_read_count; + nbytes = allocated; } async->buf_read_count += nbytes; async->buf_read_ptr += nbytes; -- 2.11.0