}
 EXPORT_SYMBOL(__kfifo_to_user);
 
-static unsigned int setup_sgl_buf(struct scatterlist *sgl, void *buf,
-                                 int nents, unsigned int len)
+static unsigned int setup_sgl_buf(struct __kfifo *fifo, struct scatterlist *sgl,
+                                 unsigned int data_offset, int nents,
+                                 unsigned int len)
 {
+       const void *buf = fifo->data + data_offset;
+
        if (!nents || !len)
                return 0;
 
        }
        len_to_end = min(len, size - off);
 
-       n = setup_sgl_buf(sgl, fifo->data + off, nents, len_to_end);
-       n += setup_sgl_buf(sgl + n, fifo->data, nents - n, len - len_to_end);
+       n = setup_sgl_buf(fifo, sgl, off, nents, len_to_end);
+       n += setup_sgl_buf(fifo, sgl + n, 0, nents - n, len - len_to_end);
 
        return n;
 }