mei: fix read after read scenario
authorTomas Winkler <tomas.winkler@intel.com>
Wed, 29 May 2013 17:09:30 +0000 (20:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 May 2013 12:44:41 +0000 (21:44 +0900)
mei read always has to be preceded by write but
'write write read read' scenario should work as well.
In this case the offset is not zero but new read should
be initiated

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/main.c

index b9ad5106f5e196ffb7427f9748f80051a54869bd..5e11b5b9b65d2b9096164691f7feaf3a54c00ffc 100644 (file)
@@ -214,19 +214,21 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
                goto out;
        }
 
-       if (cl->read_cb && cl->read_cb->buf_idx > *offset) {
-               cb = cl->read_cb;
-               goto copy_buffer;
-       } else if (cl->read_cb && cl->read_cb->buf_idx > 0 &&
-                  cl->read_cb->buf_idx <= *offset) {
+       if (cl->read_cb) {
                cb = cl->read_cb;
-               rets = 0;
-               goto free;
-       } else if ((!cl->read_cb || !cl->read_cb->buf_idx) && *offset > 0) {
-               /*Offset needs to be cleaned for contiguous reads*/
+               /* read what left */
+               if (cb->buf_idx > *offset)
+                       goto copy_buffer;
+               /* offset is beyond buf_idx we have no more data return 0 */
+               if (cb->buf_idx > 0 && cb->buf_idx <= *offset) {
+                       rets = 0;
+                       goto free;
+               }
+               /* Offset needs to be cleaned for contiguous reads*/
+               if (cb->buf_idx == 0 && *offset > 0)
+                       *offset = 0;
+       } else if (*offset > 0) {
                *offset = 0;
-               rets = 0;
-               goto out;
        }
 
        err = mei_cl_read_start(cl, length);