* [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
@ 2014-02-07 10:38 Hannes Reinecke
0 siblings, 0 replies; 7+ messages in thread
From: Hannes Reinecke @ 2014-02-07 10:38 UTC (permalink / raw)
To: systemd-devel
Cc: linux-kernel, Hannes Reinecke, Lennart Poettering, Kay Sievers,
Greg Kroah-Hartmann, Jiri Slaby, David Herrmann, Werner Fink
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.
Cc: Lennart Poettering <lennart@poettering.net>
Cc: Kay Sievers <kay@vrfy.org>
Cc: Greg Kroah-Hartmann <gregkh@linuxfoundation.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>
---
Documentation/ABI/testing/sysfs-tty | 3 ++-
drivers/tty/tty_io.c | 25 ++++++++++++++++++-------
2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-tty b/Documentation/ABI/testing/sysfs-tty
index ad22fb0..a2ccec3 100644
--- a/Documentation/ABI/testing/sysfs-tty
+++ b/Documentation/ABI/testing/sysfs-tty
@@ -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
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index c74a00a..bd2715a 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -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;
--
1.7.12.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
@ 2014-02-24 14:50 Hannes Reinecke
2014-02-24 14:58 ` David Herrmann
0 siblings, 1 reply; 7+ messages in thread
From: Hannes Reinecke @ 2014-02-24 14:50 UTC (permalink / raw)
To: linux-kernel
Cc: Ray Strode, David Herrmann, Hannes Reinecke, Lennart Poettering,
Kay Sievers, Greg Kroah-Hartman, Jiri Slaby, Werner Fink
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.
But we need to take care for the virtual console to always display
'tty0' so as not to break existing programs.
Cc: Lennart Poettering <lennart@poettering.net>
Cc: Kay Sievers <kay@vrfy.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Werner Fink <werner@suse.de>
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
drivers/tty/tty_io.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index c74a00a..96eb462 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -1271,12 +1271,13 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
*
* 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,20 @@ 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);
+ /* Some programs rely on 'tty0' for console */
+ if (driver && (index > 0 || driver->major != TTY_MAJOR)) {
+ count += tty_line_name(driver, index, buf + count);
+ count += sprintf(buf + count, "%c", i ? ' ':'\n');
+ } else
+ count += sprintf(buf + count, "%s%d%c",
+ name, cs[i]->index, i ? ' ':'\n');
+ }
console_unlock();
return count;
--
1.7.12.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
2014-02-24 14:50 [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute Hannes Reinecke
@ 2014-02-24 14:58 ` David Herrmann
2014-02-25 7:51 ` Hannes Reinecke
0 siblings, 1 reply; 7+ messages in thread
From: David Herrmann @ 2014-02-24 14:58 UTC (permalink / raw)
To: Hannes Reinecke
Cc: linux-kernel, Ray Strode, Lennart Poettering, Kay Sievers,
Greg Kroah-Hartman, Jiri Slaby, Werner Fink
Hi
On Mon, Feb 24, 2014 at 3:50 PM, Hannes Reinecke <hare@suse.de> wrote:
> 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.
> But we need to take care for the virtual console to always display
> 'tty0' so as not to break existing programs.
>
> Cc: Lennart Poettering <lennart@poettering.net>
> Cc: Kay Sievers <kay@vrfy.org>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: Jiri Slaby <jslaby@suse.cz>
> Signed-off-by: Werner Fink <werner@suse.de>
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> ---
> drivers/tty/tty_io.c | 24 ++++++++++++++++++------
> 1 file changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index c74a00a..96eb462 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -1271,12 +1271,13 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
> *
> * 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,20 @@ 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);
> + /* Some programs rely on 'tty0' for console */
> + if (driver && (index > 0 || driver->major != TTY_MAJOR)) {
As Ray mentioned in the previous discussion, this has to be
cs[i]->index instead of "index" as ->device() changes the parameter.
See drivers/tty/vt/vt.c vt_console_device().
Thanks
David
> + count += tty_line_name(driver, index, buf + count);
> + count += sprintf(buf + count, "%c", i ? ' ':'\n');
> + } else
> + count += sprintf(buf + count, "%s%d%c",
> + name, cs[i]->index, i ? ' ':'\n');
> + }
> console_unlock();
>
> return count;
> --
> 1.7.12.4
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
2014-02-24 14:58 ` David Herrmann
@ 2014-02-25 7:51 ` Hannes Reinecke
2014-02-25 9:38 ` David Herrmann
0 siblings, 1 reply; 7+ messages in thread
From: Hannes Reinecke @ 2014-02-25 7:51 UTC (permalink / raw)
To: David Herrmann
Cc: linux-kernel, Ray Strode, Lennart Poettering, Kay Sievers,
Greg Kroah-Hartman, Jiri Slaby, Werner Fink
On 02/24/2014 03:58 PM, David Herrmann wrote:
> Hi
>
> On Mon, Feb 24, 2014 at 3:50 PM, Hannes Reinecke <hare@suse.de> wrote:
>> 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.
>> But we need to take care for the virtual console to always display
>> 'tty0' so as not to break existing programs.
>>
>> Cc: Lennart Poettering <lennart@poettering.net>
>> Cc: Kay Sievers <kay@vrfy.org>
>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>> Cc: Jiri Slaby <jslaby@suse.cz>
>> Signed-off-by: Werner Fink <werner@suse.de>
>> Signed-off-by: Hannes Reinecke <hare@suse.de>
>> ---
>> drivers/tty/tty_io.c | 24 ++++++++++++++++++------
>> 1 file changed, 18 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
>> index c74a00a..96eb462 100644
>> --- a/drivers/tty/tty_io.c
>> +++ b/drivers/tty/tty_io.c
>> @@ -1271,12 +1271,13 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
>> *
>> * 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,20 @@ 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);
>> + /* Some programs rely on 'tty0' for console */
>> + if (driver && (index > 0 || driver->major != TTY_MAJOR)) {
>
> As Ray mentioned in the previous discussion, this has to be
> cs[i]->index instead of "index" as ->device() changes the parameter.
> See drivers/tty/vt/vt.c vt_console_device().
>
Positive?
I thought this was precisely the problem, ->device() changing the
index '0' into something non-zero.
The reports we had were that the line 'tty0' changed into 'tty1'.
Hence ->device() converted cs[i]->index (which is '0') into index
(which is '1').
Hence the check would be correct, wouldn't it?
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
2014-02-25 7:51 ` Hannes Reinecke
@ 2014-02-25 9:38 ` David Herrmann
2014-02-27 11:16 ` Kay Sievers
0 siblings, 1 reply; 7+ messages in thread
From: David Herrmann @ 2014-02-25 9:38 UTC (permalink / raw)
To: Hannes Reinecke
Cc: linux-kernel, Ray Strode, Lennart Poettering, Kay Sievers,
Greg Kroah-Hartman, Jiri Slaby, Werner Fink
Hi
On Tue, Feb 25, 2014 at 8:51 AM, Hannes Reinecke <hare@suse.de> wrote:
> On 02/24/2014 03:58 PM, David Herrmann wrote:
>> Hi
>>
>> On Mon, Feb 24, 2014 at 3:50 PM, Hannes Reinecke <hare@suse.de> wrote:
>>> 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.
>>> But we need to take care for the virtual console to always display
>>> 'tty0' so as not to break existing programs.
>>>
>>> Cc: Lennart Poettering <lennart@poettering.net>
>>> Cc: Kay Sievers <kay@vrfy.org>
>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>> Cc: Jiri Slaby <jslaby@suse.cz>
>>> Signed-off-by: Werner Fink <werner@suse.de>
>>> Signed-off-by: Hannes Reinecke <hare@suse.de>
>>> ---
>>> drivers/tty/tty_io.c | 24 ++++++++++++++++++------
>>> 1 file changed, 18 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
>>> index c74a00a..96eb462 100644
>>> --- a/drivers/tty/tty_io.c
>>> +++ b/drivers/tty/tty_io.c
>>> @@ -1271,12 +1271,13 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
>>> *
>>> * 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,20 @@ 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);
>>> + /* Some programs rely on 'tty0' for console */
>>> + if (driver && (index > 0 || driver->major != TTY_MAJOR)) {
>>
>> As Ray mentioned in the previous discussion, this has to be
>> cs[i]->index instead of "index" as ->device() changes the parameter.
>> See drivers/tty/vt/vt.c vt_console_device().
>>
> Positive?
> I thought this was precisely the problem, ->device() changing the
> index '0' into something non-zero.
> The reports we had were that the line 'tty0' changed into 'tty1'.
> Hence ->device() converted cs[i]->index (which is '0') into index
> (which is '1').
> Hence the check would be correct, wouldn't it?
If "cs[i]" points to tty0, then cs[i]->index is 0. If you call
->device(), it will store 1 (or !=0) in "index". Thus, "(driver &&
(index > 0))" will be true and you will write tty1 into the file
instead of tty0. So you don't want to check whether the new value is
non-zero, but whether the *previous* value was 0, turning this into:
if (driver && (cs[i]->index > 0 || driver->major != TTY_MAJOR))
So loosely speaking, we use the new code only for devices which either
are not a VT or have an idx > 0. Otherwise, we use our fallback.
Thanks
David
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
2014-02-25 9:38 ` David Herrmann
@ 2014-02-27 11:16 ` Kay Sievers
2014-02-27 11:33 ` David Herrmann
0 siblings, 1 reply; 7+ messages in thread
From: Kay Sievers @ 2014-02-27 11:16 UTC (permalink / raw)
To: David Herrmann
Cc: Hannes Reinecke, linux-kernel, Ray Strode, Lennart Poettering,
Greg Kroah-Hartman, Jiri Slaby, Werner Fink
On Tue, Feb 25, 2014 at 10:38 AM, David Herrmann <dh.herrmann@gmail.com> wrote:
> On Tue, Feb 25, 2014 at 8:51 AM, Hannes Reinecke <hare@suse.de> wrote:
>> Positive?
>> I thought this was precisely the problem, ->device() changing the
>> index '0' into something non-zero.
>> The reports we had were that the line 'tty0' changed into 'tty1'.
>> Hence ->device() converted cs[i]->index (which is '0') into index
>> (which is '1').
>> Hence the check would be correct, wouldn't it?
>
> If "cs[i]" points to tty0, then cs[i]->index is 0. If you call
> ->device(), it will store 1 (or !=0) in "index". Thus, "(driver &&
> (index > 0))" will be true and you will write tty1 into the file
> instead of tty0. So you don't want to check whether the new value is
> non-zero, but whether the *previous* value was 0, turning this into:
>
> if (driver && (cs[i]->index > 0 || driver->major != TTY_MAJOR))
>
> So loosely speaking, we use the new code only for devices which either
> are not a VT or have an idx > 0. Otherwise, we use our fallback.
Hannes, David, care to update the patch to do that? It all sounds fine
to me. And we should get this merged again.
Kay
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute
2014-02-27 11:16 ` Kay Sievers
@ 2014-02-27 11:33 ` David Herrmann
0 siblings, 0 replies; 7+ messages in thread
From: David Herrmann @ 2014-02-27 11:33 UTC (permalink / raw)
To: Kay Sievers
Cc: Hannes Reinecke, linux-kernel, Ray Strode, Lennart Poettering,
Greg Kroah-Hartman, Jiri Slaby, Werner Fink
Hi
On Thu, Feb 27, 2014 at 12:16 PM, Kay Sievers <kay@vrfy.org> wrote:
> On Tue, Feb 25, 2014 at 10:38 AM, David Herrmann <dh.herrmann@gmail.com> wrote:
>> On Tue, Feb 25, 2014 at 8:51 AM, Hannes Reinecke <hare@suse.de> wrote:
>
>>> Positive?
>>> I thought this was precisely the problem, ->device() changing the
>>> index '0' into something non-zero.
>>> The reports we had were that the line 'tty0' changed into 'tty1'.
>>> Hence ->device() converted cs[i]->index (which is '0') into index
>>> (which is '1').
>>> Hence the check would be correct, wouldn't it?
>>
>> If "cs[i]" points to tty0, then cs[i]->index is 0. If you call
>> ->device(), it will store 1 (or !=0) in "index". Thus, "(driver &&
>> (index > 0))" will be true and you will write tty1 into the file
>> instead of tty0. So you don't want to check whether the new value is
>> non-zero, but whether the *previous* value was 0, turning this into:
>>
>> if (driver && (cs[i]->index > 0 || driver->major != TTY_MAJOR))
>>
>> So loosely speaking, we use the new code only for devices which either
>> are not a VT or have an idx > 0. Otherwise, we use our fallback.
>
> Hannes, David, care to update the patch to do that? It all sounds fine
> to me. And we should get this merged again.
I have picked it up and resent a fixed patch. I screwed up the version
field, so it's called v3 again.. sorry.
Thanks
David
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-02-27 11:33 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-24 14:50 [PATCHv3] tty: Set correct tty name in 'active' sysfs attribute Hannes Reinecke
2014-02-24 14:58 ` David Herrmann
2014-02-25 7:51 ` Hannes Reinecke
2014-02-25 9:38 ` David Herrmann
2014-02-27 11:16 ` Kay Sievers
2014-02-27 11:33 ` David Herrmann
-- strict thread matches above, loose matches on Subject: below --
2014-02-07 10:38 Hannes Reinecke
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox