@@ -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,
@@ -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;
}
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@redhat.com> --- Documentation/ABI/testing/dev-kmsg | 2 ++ kernel/printk/printk.c | 4 ++++ 2 files changed, 6 insertions(+)