Skip to content

Commit

Permalink
Merge branch 'for-5.7-console-exit' of git://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/kernel/git/pmladek/printk into tty-next

We need the console patches in here as well for futher work from Andy.

* 'for-5.7-console-exit' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk:
  console: Introduce ->exit() callback
  console: Don't notify user space when unregister non-listed console
  console: Avoid positive return code from unregister_console()
  console: Drop misleading comment
  console: Use for_each_console() helper in unregister_console()
  console: Drop double check for console_drivers being non-NULL
  console: Don't perform test for CON_BRL flag

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Greg Kroah-Hartman committed Mar 17, 2020
2 parents 7e13d0a + ed31685 commit 5f3a481
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 24 deletions.
4 changes: 0 additions & 4 deletions drivers/accessibility/braille/braille_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,8 +347,6 @@ int braille_register_console(struct console *console, int index,
{
int ret;

if (!(console->flags & CON_BRL))
return 0;
if (!console_options)
/* Only support VisioBraille for now */
console_options = "57600o8";
Expand All @@ -371,8 +369,6 @@ int braille_unregister_console(struct console *console)
{
if (braille_co != console)
return -EINVAL;
if (!(console->flags & CON_BRL))
return 0;
unregister_keyboard_notifier(&keyboard_notifier_block);
unregister_vt_notifier(&vt_notifier_block);
braille_co = NULL;
Expand Down
1 change: 1 addition & 0 deletions include/linux/console.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ struct console {
struct tty_driver *(*device)(struct console *, int *);
void (*unblank)(void);
int (*setup)(struct console *, char *);
int (*exit)(struct console *);
int (*match)(struct console *, char *name, int idx, char *options);
short flags;
short index;
Expand Down
49 changes: 29 additions & 20 deletions kernel/printk/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1772,9 +1772,6 @@ static void call_console_drivers(const char *ext_text, size_t ext_len,

trace_console_rcuidle(text, len);

if (!console_drivers)
return;

for_each_console(con) {
if (exclusive_console && con != exclusive_console)
continue;
Expand Down Expand Up @@ -2653,19 +2650,17 @@ void register_console(struct console *newcon)
struct console_cmdline *c;
static bool has_preferred;

if (console_drivers)
for_each_console(bcon)
if (WARN(bcon == newcon,
"console '%s%d' already registered\n",
bcon->name, bcon->index))
return;
for_each_console(bcon) {
if (WARN(bcon == newcon, "console '%s%d' already registered\n",
bcon->name, bcon->index))
return;
}

/*
* before we register a new CON_BOOT console, make sure we don't
* already have a valid console
*/
if (console_drivers && newcon->flags & CON_BOOT) {
/* find the last or real console */
if (newcon->flags & CON_BOOT) {
for_each_console(bcon) {
if (!(bcon->flags & CON_BOOT)) {
pr_info("Too late to register bootconsole %s%d\n",
Expand Down Expand Up @@ -2813,34 +2808,38 @@ EXPORT_SYMBOL(register_console);

int unregister_console(struct console *console)
{
struct console *a, *b;
struct console *con;
int res;

pr_info("%sconsole [%s%d] disabled\n",
(console->flags & CON_BOOT) ? "boot" : "" ,
console->name, console->index);

res = _braille_unregister_console(console);
if (res)
if (res < 0)
return res;
if (res > 0)
return 0;

res = 1;
res = -ENODEV;
console_lock();
if (console_drivers == console) {
console_drivers=console->next;
res = 0;
} else if (console_drivers) {
for (a=console_drivers->next, b=console_drivers ;
a; b=a, a=b->next) {
if (a == console) {
b->next = a->next;
} else {
for_each_console(con) {
if (con->next == console) {
con->next = console->next;
res = 0;
break;
}
}
}

if (!res && (console->flags & CON_EXTENDED))
if (res)
goto out_disable_unlock;

if (console->flags & CON_EXTENDED)
nr_ext_console_drivers--;

/*
Expand All @@ -2853,6 +2852,16 @@ int unregister_console(struct console *console)
console->flags &= ~CON_ENABLED;
console_unlock();
console_sysfs_notify();

if (console->exit)
res = console->exit(console);

return res;

out_disable_unlock:
console->flags &= ~CON_ENABLED;
console_unlock();

return res;
}
EXPORT_SYMBOL(unregister_console);
Expand Down

0 comments on commit 5f3a481

Please sign in to comment.