From: "Steven Rostedt (Red Hat)" <rost...@goodmis.org>

Currently seq_buf is full when all but one byte of the buffer is
filled. Change it so that the seq_buf is full when all of the
buffer is filled.

Some of the functions would fill the buffer completely and report
everything was fine. This was inconsistent with the max of size - 1.
Changing this to be max of size makes all functions consistent.

Link: http://lkml.kernel.org/r/20141104160222.502133...@goodmis.org
Link: http://lkml.kernel.org/r/20141114011412.811957...@goodmis.org

Tested-by: Jiri Kosina <jkos...@suse.cz>
Acked-by: Jiri Kosina <jkos...@suse.cz>
Reviewed-by: Petr Mladek <pmla...@suse.cz>
Signed-off-by: Steven Rostedt <rost...@goodmis.org>
---
 include/linux/seq_buf.h | 6 +++---
 kernel/trace/seq_buf.c  | 9 ++++++---
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/include/linux/seq_buf.h b/include/linux/seq_buf.h
index 93718e570d4c..0800a24b4348 100644
--- a/include/linux/seq_buf.h
+++ b/include/linux/seq_buf.h
@@ -43,13 +43,13 @@ seq_buf_init(struct seq_buf *s, unsigned char *buf, 
unsigned int size)
 static inline bool
 seq_buf_has_overflowed(struct seq_buf *s)
 {
-       return s->len == s->size;
+       return s->len > s->size;
 }
 
 static inline void
 seq_buf_set_overflow(struct seq_buf *s)
 {
-       s->len = s->size;
+       s->len = s->size + 1;
 }
 
 /*
@@ -61,7 +61,7 @@ seq_buf_buffer_left(struct seq_buf *s)
        if (seq_buf_has_overflowed(s))
                return 0;
 
-       return (s->size - 1) - s->len;
+       return s->size - s->len;
 }
 
 /* How much buffer was written? */
diff --git a/kernel/trace/seq_buf.c b/kernel/trace/seq_buf.c
index 89d1bd5c27fe..27e48348ae67 100644
--- a/kernel/trace/seq_buf.c
+++ b/kernel/trace/seq_buf.c
@@ -18,7 +18,7 @@
 
 static bool seq_buf_can_fit(struct seq_buf *s, size_t len)
 {
-       return s->len + len < s->size;
+       return s->len + len <= s->size;
 }
 
 /**
@@ -102,8 +102,11 @@ int seq_buf_bitmask(struct seq_buf *s, const unsigned long 
*maskp,
        WARN_ON(s->size == 0);
 
        /*
-        * The last byte of the buffer is used to determine if we
-        * overflowed or not.
+        * Note, because bitmap_scnprintf() only returns the number of bytes
+        * written and not the number that would be written, we use the last
+        * byte of the buffer to let us know if we overflowed. There's a small
+        * chance that the bitmap could have fit exactly inside the buffer, but
+        * it's not that critical if that does happen.
         */
        if (len > 1) {
                ret = bitmap_scnprintf(s->buffer + s->len, len, maskp, 
nmaskbits);
-- 
2.1.1


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to