vc_screen: extract vcs_write_buf_noattr
authorJiri Slaby <jslaby@suse.cz>
Tue, 18 Aug 2020 08:56:57 +0000 (10:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Aug 2020 11:45:21 +0000 (13:45 +0200)
vcs_write is too long to be readable. Extract buffer handling w/o
attributes from there to a separate function.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20200818085706.12163-7-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vc_screen.c

index 2571d90..62e6d24 100644 (file)
@@ -454,6 +454,33 @@ unlock_out:
        return ret;
 }
 
+static u16 *vcs_write_buf_noattr(struct vc_data *vc, const char *con_buf,
+               unsigned int pos, unsigned int count, bool viewed, u16 **org0)
+{
+       u16 *org;
+       unsigned int col, maxcol = vc->vc_cols;
+
+       *org0 = org = screen_pos(vc, pos, viewed);
+       col = pos % maxcol;
+       pos += maxcol - col;
+
+       while (count > 0) {
+               unsigned char c = *con_buf++;
+
+               count--;
+               vcs_scr_writew(vc,
+                              (vcs_scr_readw(vc, org) & 0xff00) | c, org);
+               org++;
+               if (++col == maxcol) {
+                       org = screen_pos(vc, pos, viewed);
+                       col = 0;
+                       pos += maxcol;
+               }
+       }
+
+       return org;
+}
+
 static ssize_t
 vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
 {
@@ -544,29 +571,15 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
                 * under the lock using the local kernel buffer.
                 */
 
-               con_buf0 = con_buf;
-               orig_count = this_round;
-               maxcol = vc->vc_cols;
-               p = pos;
                if (!attr) {
-                       org0 = org = screen_pos(vc, p, viewed);
-                       col = p % maxcol;
-                       p += maxcol - col;
-
-                       while (this_round > 0) {
-                               unsigned char c = *con_buf0++;
-
-                               this_round--;
-                               vcs_scr_writew(vc,
-                                              (vcs_scr_readw(vc, org) & 0xff00) | c, org);
-                               org++;
-                               if (++col == maxcol) {
-                                       org = screen_pos(vc, p, viewed);
-                                       col = 0;
-                                       p += maxcol;
-                               }
-                       }
+                       org = vcs_write_buf_noattr(vc, con_buf, pos, this_round,
+                                       viewed, &org0);
                } else {
+                       con_buf0 = con_buf;
+                       orig_count = this_round;
+                       maxcol = vc->vc_cols;
+                       p = pos;
+
                        if (p < HEADER_SIZE) {
                                char header[HEADER_SIZE];