@@ -735,9 +735,9 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
735
735
logbuf_lock_irq ();
736
736
}
737
737
738
- if (user -> seq < prb_first_valid_seq ( prb ) ) {
738
+ if (r -> info -> seq != user -> seq ) {
739
739
/* our last seen message is gone, return error and reset */
740
- user -> seq = prb_first_valid_seq ( prb ) ;
740
+ user -> seq = r -> info -> seq ;
741
741
ret = - EPIPE ;
742
742
logbuf_unlock_irq ();
743
743
goto out ;
@@ -812,6 +812,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
812
812
static __poll_t devkmsg_poll (struct file * file , poll_table * wait )
813
813
{
814
814
struct devkmsg_user * user = file -> private_data ;
815
+ struct printk_info info ;
815
816
__poll_t ret = 0 ;
816
817
817
818
if (!user )
@@ -820,9 +821,9 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait)
820
821
poll_wait (file , & log_wait , wait );
821
822
822
823
logbuf_lock_irq ();
823
- if (prb_read_valid (prb , user -> seq , NULL )) {
824
+ if (prb_read_valid_info (prb , user -> seq , & info , NULL )) {
824
825
/* return error when data has vanished underneath us */
825
- if (user -> seq < prb_first_valid_seq ( prb ) )
826
+ if (info . seq != user -> seq )
826
827
ret = EPOLLIN |EPOLLRDNORM |EPOLLERR |EPOLLPRI ;
827
828
else
828
829
ret = EPOLLIN |EPOLLRDNORM ;
@@ -1559,6 +1560,7 @@ static void syslog_clear(void)
1559
1560
1560
1561
int do_syslog (int type , char __user * buf , int len , int source )
1561
1562
{
1563
+ struct printk_info info ;
1562
1564
bool clear = false;
1563
1565
static int saved_console_loglevel = LOGLEVEL_DEFAULT ;
1564
1566
int error ;
@@ -1629,9 +1631,14 @@ int do_syslog(int type, char __user *buf, int len, int source)
1629
1631
/* Number of chars in the log buffer */
1630
1632
case SYSLOG_ACTION_SIZE_UNREAD :
1631
1633
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 ) {
1633
1640
/* messages are gone, move to first one */
1634
- syslog_seq = prb_first_valid_seq ( prb ) ;
1641
+ syslog_seq = info . seq ;
1635
1642
syslog_partial = 0 ;
1636
1643
}
1637
1644
if (source == SYSLOG_FROM_PROC ) {
@@ -1643,7 +1650,6 @@ int do_syslog(int type, char __user *buf, int len, int source)
1643
1650
error = prb_next_seq (prb ) - syslog_seq ;
1644
1651
} else {
1645
1652
bool time = syslog_partial ? syslog_time : printk_time ;
1646
- struct printk_info info ;
1647
1653
unsigned int line_count ;
1648
1654
u64 seq ;
1649
1655
@@ -3429,9 +3435,11 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
3429
3435
goto out ;
3430
3436
3431
3437
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
+ }
3435
3443
}
3436
3444
3437
3445
/* last entry */
0 commit comments