doc:kmsg: explicitly state the return value in case of SEEK_CUR

The commit 625d344978 ("Revert "kernel/printk: add kmsg SEEK_CUR
handling"") reverted a change done to the return value in case a SEEK_CUR
operation was performed for kmsg buffer based on the fact that different
userspace apps were handling the new return value (-ESPIPE) in different
ways, breaking them.

At the same time -ESPIPE was the wrong decision because kmsg /does support/
seek() but doesn't follow the "normal" behavior userspace is used to.
Because of that and also considering the time -EINVAL has been used, it was
decided to keep this way to avoid more userspace breakage.

This patch adds an official statement to the kmsg documentation pointing to
the current return value for SEEK_CUR, -EINVAL, thus userspace libraries
and apps can refer to it for a definitive guide on what to expect.

Signed-off-by: Bruno Meneguele <bmeneg@redhat.com>
Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20200710174423.10480-1-bmeneg@redhat.com
This commit is contained in:
Bruno Meneguele 2020-07-10 14:44:23 -03:00 committed by Petr Mladek
parent 8eda94bde4
commit bc885f1ab6
2 changed files with 19 additions and 0 deletions

View File

@ -61,6 +61,17 @@ Description: The /dev/kmsg character device node provides userspace access
SEEK_CUR is not supported, returning -ESPIPE (invalid seek) to SEEK_CUR is not supported, returning -ESPIPE (invalid seek) to
errno whenever requested. errno whenever requested.
Other seek operations or offsets are not supported because of
the special behavior this device has. The device allows to read
or write only whole variable length messages (records) that are
stored in a ring buffer.
Because of the non-standard behavior also the error values are
non-standard. -ESPIPE is returned for non-zero offset. -EINVAL
is returned for other operations, e.g. SEEK_CUR. This behavior
and values are historical and could not be modified without the
risk of breaking userspace.
The output format consists of a prefix carrying the syslog The output format consists of a prefix carrying the syslog
prefix including priority and facility, the 64 bit message prefix including priority and facility, the 64 bit message
sequence number and the monotonic timestamp in microseconds, sequence number and the monotonic timestamp in microseconds,

View File

@ -943,6 +943,14 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
return ret; return ret;
} }
/*
* Be careful when modifying this function!!!
*
* Only few operations are supported because the device works only with the
* entire variable length messages (records). Non-standard values are
* returned in the other cases and has been this way for quite some time.
* User space applications might depend on this behavior.
*/
static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
{ {
struct devkmsg_user *user = file->private_data; struct devkmsg_user *user = file->private_data;