tty: Compute flip buffer ptrs
authorPeter Hurley <peter@hurleysoftware.com>
Sat, 15 Jun 2013 13:36:01 +0000 (09:36 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Jul 2013 23:47:07 +0000 (16:47 -0700)
The char_buf_ptr and flag_buf_ptr values are trivially derived from
the .data field offset; compute values as needed.

Fixes a long-standing type-mismatch with the char and flag ptrs.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/tty_buffer.c
include/linux/tty.h
include/linux/tty_flip.h

index ff1b2e37c3ca378f67a6d2d669bc37073e4bad0b..170674cb68fc6457abd18f2a627cbe212453d1b5 100644 (file)
@@ -71,8 +71,6 @@ static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
        p->next = NULL;
        p->commit = 0;
        p->read = 0;
-       p->char_buf_ptr = (char *)(p->data);
-       p->flag_buf_ptr = (unsigned char *)p->char_buf_ptr + size;
        port->buf.memory_used += size;
        return p;
 }
@@ -265,8 +263,8 @@ int tty_insert_flip_string_fixed_flag(struct tty_port *port,
                if (unlikely(space == 0)) {
                        break;
                }
-               memcpy(tb->char_buf_ptr + tb->used, chars, space);
-               memset(tb->flag_buf_ptr + tb->used, flag, space);
+               memcpy(char_buf_ptr(tb, tb->used), chars, space);
+               memset(flag_buf_ptr(tb, tb->used), flag, space);
                tb->used += space;
                copied += space;
                chars += space;
@@ -303,8 +301,8 @@ int tty_insert_flip_string_flags(struct tty_port *port,
                if (unlikely(space == 0)) {
                        break;
                }
-               memcpy(tb->char_buf_ptr + tb->used, chars, space);
-               memcpy(tb->flag_buf_ptr + tb->used, flags, space);
+               memcpy(char_buf_ptr(tb, tb->used), chars, space);
+               memcpy(flag_buf_ptr(tb, tb->used), flags, space);
                tb->used += space;
                copied += space;
                chars += space;
@@ -364,8 +362,8 @@ int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
        int space = tty_buffer_request_room(port, size);
        if (likely(space)) {
                struct tty_buffer *tb = port->buf.tail;
-               *chars = tb->char_buf_ptr + tb->used;
-               memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
+               *chars = char_buf_ptr(tb, tb->used);
+               memset(flag_buf_ptr(tb, tb->used), TTY_NORMAL, space);
                tb->used += space;
        }
        return space;
@@ -394,8 +392,8 @@ int tty_prepare_flip_string_flags(struct tty_port *port,
        int space = tty_buffer_request_room(port, size);
        if (likely(space)) {
                struct tty_buffer *tb = port->buf.tail;
-               *chars = tb->char_buf_ptr + tb->used;
-               *flags = tb->flag_buf_ptr + tb->used;
+               *chars = char_buf_ptr(tb, tb->used);
+               *flags = flag_buf_ptr(tb, tb->used);
                tb->used += space;
        }
        return space;
@@ -407,8 +405,8 @@ static int
 receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
 {
        struct tty_ldisc *disc = tty->ldisc;
-       char          *p = head->char_buf_ptr + head->read;
-       unsigned char *f = head->flag_buf_ptr + head->read;
+       unsigned char *p = char_buf_ptr(head, head->read);
+       char          *f = flag_buf_ptr(head, head->read);
 
        if (disc->ops->receive_buf2)
                count = disc->ops->receive_buf2(tty, p, f, count);
index 57a70d1d0412a9dcb8f27602c6dd67d584561baa..87bbaa31ebf5058f80244250e63a217992293400 100644 (file)
@@ -31,8 +31,6 @@
 
 struct tty_buffer {
        struct tty_buffer *next;
-       char *char_buf_ptr;
-       unsigned char *flag_buf_ptr;
        int used;
        int size;
        int commit;
@@ -41,6 +39,16 @@ struct tty_buffer {
        unsigned long data[0];
 };
 
+static inline unsigned char *char_buf_ptr(struct tty_buffer *b, int ofs)
+{
+       return ((unsigned char *)b->data) + ofs;
+}
+
+static inline char *flag_buf_ptr(struct tty_buffer *b, int ofs)
+{
+       return (char *)char_buf_ptr(b, ofs) + b->size;
+}
+
 /*
  * We default to dicing tty buffer allocations to this many characters
  * in order to avoid multiple page allocations. We know the size of
index e0f252633b4745940edef0c4539381de4bb129a5..ad0303994c32b75907e839ffa5ca7cf2f5a42d6d 100644 (file)
@@ -18,8 +18,8 @@ static inline int tty_insert_flip_char(struct tty_port *port,
 {
        struct tty_buffer *tb = port->buf.tail;
        if (tb && tb->used < tb->size) {
-               tb->flag_buf_ptr[tb->used] = flag;
-               tb->char_buf_ptr[tb->used++] = ch;
+               *flag_buf_ptr(tb, tb->used) = flag;
+               *char_buf_ptr(tb, tb->used++) = ch;
                return 1;
        }
        return tty_insert_flip_string_flags(port, &ch, &flag, 1);