| From e106f7f04589a45051078e09d5de57ba2ca048e9 Mon Sep 17 00:00:00 2001 |
| From: Nicolas Pitre <nico@fluxnic.net> |
| Date: Tue, 28 Jan 2020 12:50:33 -0500 |
| Subject: [PATCH] vt: fix scrollback flushing on background consoles |
| |
| commit 3f4ef485be9d54040b695f32ec76d0f1ea50bbf3 upstream. |
| |
| Commit a6dbe4427559 ("vt: perform safe console erase in the right |
| order") provided fixes to an earlier commit by gathering all console |
| scrollback flushing operations in a function of its own. This includes |
| the invocation of vc_sw->con_switch() as previously done through a |
| update_screen() call. That commit failed to carry over the |
| con_is_visible() conditional though, as well as cursor handling, which |
| caused problems when "\e[3J" was written to a background console. |
| |
| One could argue for preserving the call to update_screen(). However |
| this does far more than we need, and it is best to remove scrollback |
| assumptions from it. Instead let's gather the minimum needed to actually |
| perform scrollback flushing properly in that one place. |
| |
| While at it, let's document the vc_sw->con_switch() side effect being |
| relied upon. |
| |
| Signed-off-by: Nicolas Pitre <nico@fluxnic.net> |
| Reported-and-tested-by: Lukas Wunner <lukas@wunner.de> |
| Cc: stable@vger.kernel.org |
| Link: https://lore.kernel.org/r/nycvar.YSQ.7.76.2001281205560.1655@knanqh.ubzr |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c |
| index 1a85d94d89f2..48aebcfd2b56 100644 |
| --- a/drivers/tty/vt/vt.c |
| +++ b/drivers/tty/vt/vt.c |
| @@ -936,10 +936,21 @@ static void flush_scrollback(struct vc_data *vc) |
| WARN_CONSOLE_UNLOCKED(); |
| |
| set_origin(vc); |
| - if (vc->vc_sw->con_flush_scrollback) |
| + if (vc->vc_sw->con_flush_scrollback) { |
| vc->vc_sw->con_flush_scrollback(vc); |
| - else |
| + } else if (con_is_visible(vc)) { |
| + /* |
| + * When no con_flush_scrollback method is provided then the |
| + * legacy way for flushing the scrollback buffer is to use |
| + * a side effect of the con_switch method. We do it only on |
| + * the foreground console as background consoles have no |
| + * scrollback buffers in that case and we obviously don't |
| + * want to switch to them. |
| + */ |
| + hide_cursor(vc); |
| vc->vc_sw->con_switch(vc); |
| + set_cursor(vc); |
| + } |
| } |
| |
| /* |
| -- |
| 2.7.4 |
| |