@@ -735,9 +735,9 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
735735 logbuf_lock_irq ();
736736 }
737737
738- if (user -> seq < prb_first_valid_seq ( prb ) ) {
738+ if (r -> info -> seq != user -> seq ) {
739739 /* our last seen message is gone, return error and reset */
740- user -> seq = prb_first_valid_seq ( prb ) ;
740+ user -> seq = r -> info -> seq ;
741741 ret = - EPIPE ;
742742 logbuf_unlock_irq ();
743743 goto out ;
@@ -812,6 +812,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
812812static __poll_t devkmsg_poll (struct file * file , poll_table * wait )
813813{
814814 struct devkmsg_user * user = file -> private_data ;
815+ struct printk_info info ;
815816 __poll_t ret = 0 ;
816817
817818 if (!user )
@@ -820,9 +821,9 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait)
820821 poll_wait (file , & log_wait , wait );
821822
822823 logbuf_lock_irq ();
823- if (prb_read_valid (prb , user -> seq , NULL )) {
824+ if (prb_read_valid_info (prb , user -> seq , & info , NULL )) {
824825 /* return error when data has vanished underneath us */
825- if (user -> seq < prb_first_valid_seq ( prb ) )
826+ if (info . seq != user -> seq )
826827 ret = EPOLLIN |EPOLLRDNORM |EPOLLERR |EPOLLPRI ;
827828 else
828829 ret = EPOLLIN |EPOLLRDNORM ;
@@ -1559,6 +1560,7 @@ static void syslog_clear(void)
15591560
15601561int do_syslog (int type , char __user * buf , int len , int source )
15611562{
1563+ struct printk_info info ;
15621564 bool clear = false;
15631565 static int saved_console_loglevel = LOGLEVEL_DEFAULT ;
15641566 int error ;
@@ -1629,9 +1631,14 @@ int do_syslog(int type, char __user *buf, int len, int source)
16291631 /* Number of chars in the log buffer */
16301632 case SYSLOG_ACTION_SIZE_UNREAD :
16311633 logbuf_lock_irq ();
1632- if (syslog_seq < prb_first_valid_seq (prb )) {
1634+ if (!prb_read_valid_info (prb , syslog_seq , & info , NULL )) {
1635+ /* No unread messages. */
1636+ logbuf_unlock_irq ();
1637+ return 0 ;
1638+ }
1639+ if (info .seq != syslog_seq ) {
16331640 /* messages are gone, move to first one */
1634- syslog_seq = prb_first_valid_seq ( prb ) ;
1641+ syslog_seq = info . seq ;
16351642 syslog_partial = 0 ;
16361643 }
16371644 if (source == SYSLOG_FROM_PROC ) {
@@ -1643,7 +1650,6 @@ int do_syslog(int type, char __user *buf, int len, int source)
16431650 error = prb_next_seq (prb ) - syslog_seq ;
16441651 } else {
16451652 bool time = syslog_partial ? syslog_time : printk_time ;
1646- struct printk_info info ;
16471653 unsigned int line_count ;
16481654 u64 seq ;
16491655
@@ -3429,9 +3435,11 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
34293435 goto out ;
34303436
34313437 logbuf_lock_irqsave (flags );
3432- if (dumper -> cur_seq < prb_first_valid_seq (prb )) {
3433- /* messages are gone, move to first available one */
3434- dumper -> cur_seq = prb_first_valid_seq (prb );
3438+ if (prb_read_valid_info (prb , dumper -> cur_seq , & info , NULL )) {
3439+ if (info .seq != dumper -> cur_seq ) {
3440+ /* messages are gone, move to first available one */
3441+ dumper -> cur_seq = info .seq ;
3442+ }
34353443 }
34363444
34373445 /* last entry */
0 commit comments