tty: Set correct tty name in 'active' sysfs attribute
authorHannes Reinecke <hare@suse.de>
Fri, 7 Feb 2014 10:38:30 +0000 (11:38 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Feb 2014 16:40:54 +0000 (08:40 -0800)
The 'active' sysfs attribute should refer to the currently active tty
devices the console is running on, not the currently active console.

The console structure doesn't refer to any device in sysfs, only the tty
the console is running on has.  So we need to print out the tty names in
'active', not the console names.

This resolves an issue on s390 platforms in determining the correct
console device to use.

Cc: Lennart Poettering <lennart@poettering.net>
Cc: Kay Sievers <kay@vrfy.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Werner Fink <werner@suse.de>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/testing/sysfs-tty
drivers/tty/tty_io.c

index ad22fb0ee765b792a3bc0ab7f9d2995c69f1d5d0..a2ccec35ffce2cedb601d4cad55012b56a3c4e6f 100644 (file)
@@ -3,7 +3,8 @@ Date:           Nov 2010
 Contact:       Kay Sievers <kay.sievers@vrfy.org>
 Description:
                 Shows the list of currently configured
-                console devices, like 'tty1 ttyS0'.
+                tty devices used for the console,
+                like 'tty1 ttyS0'.
                 The last entry in the file is the active
                 device connected to /dev/console.
                 The file supports poll() to detect virtual
index c74a00ad7add80254ddf98dbaf88ed0725a540e0..bd2715a9d8e5ac959ec1681fd920e953859856a3 100644 (file)
@@ -1267,16 +1267,17 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
  *     @p: output buffer of at least 7 bytes
  *
  *     Generate a name from a driver reference and write it to the output
- *     buffer.
+ *     buffer. Return the number of bytes written.
  *
  *     Locking: None
  */
-static void tty_line_name(struct tty_driver *driver, int index, char *p)
+static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)
 {
        if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
-               strcpy(p, driver->name);
+               return sprintf(p, "%s", driver->name);
        else
-               sprintf(p, "%s%d", driver->name, index + driver->name_base);
+               return sprintf(p, "%s%d", driver->name,
+                              index + driver->name_base);
 }
 
 /**
@@ -3545,9 +3546,19 @@ static ssize_t show_cons_active(struct device *dev,
                if (i >= ARRAY_SIZE(cs))
                        break;
        }
-       while (i--)
-               count += sprintf(buf + count, "%s%d%c",
-                                cs[i]->name, cs[i]->index, i ? ' ':'\n');
+       while (i--) {
+               struct tty_driver *driver;
+               const char *name = cs[i]->name;
+               int index = cs[i]->index;
+
+               driver = cs[i]->device(cs[i], &index);
+               if (driver) {
+                       count += tty_line_name(driver, index, buf + count);
+                       count += sprintf(buf + count, "%c", i ? ' ':'\n');
+               } else
+                       count += sprintf(buf + count, "%s%d%c",
+                                        name, index, i ? ' ':'\n');
+       }
        console_unlock();
 
        return count;