Loading kernel/printk/printk.c +18 −10 Original line number Diff line number Diff line Loading @@ -735,9 +735,9 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, logbuf_lock_irq(); } if (user->seq < prb_first_valid_seq(prb)) { if (r->info->seq != user->seq) { /* our last seen message is gone, return error and reset */ user->seq = prb_first_valid_seq(prb); user->seq = r->info->seq; ret = -EPIPE; logbuf_unlock_irq(); goto out; Loading Loading @@ -812,6 +812,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) static __poll_t devkmsg_poll(struct file *file, poll_table *wait) { struct devkmsg_user *user = file->private_data; struct printk_info info; __poll_t ret = 0; if (!user) Loading @@ -820,9 +821,9 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait) poll_wait(file, &log_wait, wait); logbuf_lock_irq(); if (prb_read_valid(prb, user->seq, NULL)) { if (prb_read_valid_info(prb, user->seq, &info, NULL)) { /* return error when data has vanished underneath us */ if (user->seq < prb_first_valid_seq(prb)) if (info.seq != user->seq) ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; else ret = EPOLLIN|EPOLLRDNORM; Loading Loading @@ -1559,6 +1560,7 @@ static void syslog_clear(void) int do_syslog(int type, char __user *buf, int len, int source) { struct printk_info info; bool clear = false; static int saved_console_loglevel = LOGLEVEL_DEFAULT; int error; Loading Loading @@ -1629,9 +1631,14 @@ int do_syslog(int type, char __user *buf, int len, int source) /* Number of chars in the log buffer */ case SYSLOG_ACTION_SIZE_UNREAD: logbuf_lock_irq(); if (syslog_seq < prb_first_valid_seq(prb)) { if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { /* No unread messages. */ logbuf_unlock_irq(); return 0; } if (info.seq != syslog_seq) { /* messages are gone, move to first one */ syslog_seq = prb_first_valid_seq(prb); syslog_seq = info.seq; syslog_partial = 0; } if (source == SYSLOG_FROM_PROC) { Loading @@ -1643,7 +1650,6 @@ int do_syslog(int type, char __user *buf, int len, int source) error = prb_next_seq(prb) - syslog_seq; } else { bool time = syslog_partial ? syslog_time : printk_time; struct printk_info info; unsigned int line_count; u64 seq; Loading Loading @@ -3429,9 +3435,11 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, goto out; logbuf_lock_irqsave(flags); if (dumper->cur_seq < prb_first_valid_seq(prb)) { if (prb_read_valid_info(prb, dumper->cur_seq, &info, NULL)) { if (info.seq != dumper->cur_seq) { /* messages are gone, move to first available one */ dumper->cur_seq = prb_first_valid_seq(prb); dumper->cur_seq = info.seq; } } /* last entry */ Loading kernel/printk/printk_ringbuffer.h +1 −1 Original line number Diff line number Diff line Loading @@ -287,7 +287,7 @@ _DEFINE_PRINTKRB(name, descbits, avgtextbits, &_##name##_text[0]) /* Writer Interface */ /** * prb_rec_init_wd() - Initialize a buffer for writing records. * prb_rec_init_wr() - Initialize a buffer for writing records. * * @r: The record to initialize. * @text_buf_size: The needed text buffer size. Loading Loading
kernel/printk/printk.c +18 −10 Original line number Diff line number Diff line Loading @@ -735,9 +735,9 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, logbuf_lock_irq(); } if (user->seq < prb_first_valid_seq(prb)) { if (r->info->seq != user->seq) { /* our last seen message is gone, return error and reset */ user->seq = prb_first_valid_seq(prb); user->seq = r->info->seq; ret = -EPIPE; logbuf_unlock_irq(); goto out; Loading Loading @@ -812,6 +812,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) static __poll_t devkmsg_poll(struct file *file, poll_table *wait) { struct devkmsg_user *user = file->private_data; struct printk_info info; __poll_t ret = 0; if (!user) Loading @@ -820,9 +821,9 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait) poll_wait(file, &log_wait, wait); logbuf_lock_irq(); if (prb_read_valid(prb, user->seq, NULL)) { if (prb_read_valid_info(prb, user->seq, &info, NULL)) { /* return error when data has vanished underneath us */ if (user->seq < prb_first_valid_seq(prb)) if (info.seq != user->seq) ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; else ret = EPOLLIN|EPOLLRDNORM; Loading Loading @@ -1559,6 +1560,7 @@ static void syslog_clear(void) int do_syslog(int type, char __user *buf, int len, int source) { struct printk_info info; bool clear = false; static int saved_console_loglevel = LOGLEVEL_DEFAULT; int error; Loading Loading @@ -1629,9 +1631,14 @@ int do_syslog(int type, char __user *buf, int len, int source) /* Number of chars in the log buffer */ case SYSLOG_ACTION_SIZE_UNREAD: logbuf_lock_irq(); if (syslog_seq < prb_first_valid_seq(prb)) { if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { /* No unread messages. */ logbuf_unlock_irq(); return 0; } if (info.seq != syslog_seq) { /* messages are gone, move to first one */ syslog_seq = prb_first_valid_seq(prb); syslog_seq = info.seq; syslog_partial = 0; } if (source == SYSLOG_FROM_PROC) { Loading @@ -1643,7 +1650,6 @@ int do_syslog(int type, char __user *buf, int len, int source) error = prb_next_seq(prb) - syslog_seq; } else { bool time = syslog_partial ? syslog_time : printk_time; struct printk_info info; unsigned int line_count; u64 seq; Loading Loading @@ -3429,9 +3435,11 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, goto out; logbuf_lock_irqsave(flags); if (dumper->cur_seq < prb_first_valid_seq(prb)) { if (prb_read_valid_info(prb, dumper->cur_seq, &info, NULL)) { if (info.seq != dumper->cur_seq) { /* messages are gone, move to first available one */ dumper->cur_seq = prb_first_valid_seq(prb); dumper->cur_seq = info.seq; } } /* last entry */ Loading
kernel/printk/printk_ringbuffer.h +1 −1 Original line number Diff line number Diff line Loading @@ -287,7 +287,7 @@ _DEFINE_PRINTKRB(name, descbits, avgtextbits, &_##name##_text[0]) /* Writer Interface */ /** * prb_rec_init_wd() - Initialize a buffer for writing records. * prb_rec_init_wr() - Initialize a buffer for writing records. * * @r: The record to initialize. * @text_buf_size: The needed text buffer size. Loading