Userspace libraries, e.g. glibc's dprintf(), expect the default return value for invalid seek situations: -ESPIPE, but when the IO was over /dev/kmsg the current state of kernel code was returning the generic case of an -EINVAL. Hence, userspace programs were not behaving as expected or documented. With this patch we add SEEK_CUR case returning the expected value and also a simple mention of it in kernel's documentation for those relying on that for guidance. Signed-off-by: Bruno Meneguele <bmeneg@xxxxxxxxxx> --- Documentation/ABI/testing/dev-kmsg | 2 ++ kernel/printk/printk.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Documentation/ABI/testing/dev-kmsg b/Documentation/ABI/testing/dev-kmsg index f307506eb54c..8533d28e6fda 100644 --- a/Documentation/ABI/testing/dev-kmsg +++ b/Documentation/ABI/testing/dev-kmsg @@ -56,6 +56,8 @@ Description: The /dev/kmsg character device node provides userspace access seek after the last record available at the time the last SYSLOG_ACTION_CLEAR was issued. + While SEEK_CUR sets -ESPIPE (invalid seek) to errno. + The output format consists of a prefix carrying the syslog prefix including priority and facility, the 64 bit message sequence number and the monotonic timestamp in microseconds, diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index ad4606234545..d02606723d2d 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -963,6 +963,10 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) user->idx = log_next_idx; user->seq = log_next_seq; break; + case SEEK_CUR: + /* return the default errno for invalid seek */ + ret = -ESPIPE; + break; default: ret = -EINVAL; } -- 2.24.1