From 2b2dc9dd356aed030e7ac11469d12f736793bc89 Mon Sep 17 00:00:00 2001 From: Wang Wensheng Date: Sun, 4 Oct 2026 15:57:55 +0800 Subject: printk_ringbuffer: Fix space_used() when blk_lpos->next overflows Since commit 67e1b0052f6b ("printk_ringbuffer: don't needlessly wrap data blocks around") blk_lpos is treated as not wrapped when blk_lpos->next overflows to the start of data_ring. We use the indices of blk_lpos->next and blk_lpos->start to calculate the size of the data_block. This computes zero minus a small positive value, resulting in underflow and an unexpectedly large value. Simply using the original lpos with wrap-counts solves the problem. Fixes: 67e1b0052f6b ("printk_ringbuffer: don't needlessly wrap data blocks around") Signed-off-by: Wang Wensheng Reviewed-by: John Ogness Reviewed-by: Petr Mladek Link: https://patch.msgid.link/20261004075755.363989-1-wsw9603@163.com Signed-off-by: Petr Mladek --- kernel/printk/printk_ringbuffer.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/kernel/printk/printk_ringbuffer.c b/kernel/printk/printk_ringbuffer.c index d38e7c2f6887..46a79ec0940a 100644 --- a/kernel/printk/printk_ringbuffer.c +++ b/kernel/printk/printk_ringbuffer.c @@ -1237,11 +1237,9 @@ static unsigned int space_used(struct prb_data_ring *data_ring, if (BLK_DATALESS(blk_lpos)) return 0; - if (!is_blk_wrapped(data_ring, blk_lpos->begin, blk_lpos->next)) { - /* Data block does not wrap. */ - return (DATA_INDEX(data_ring, blk_lpos->next) - - DATA_INDEX(data_ring, blk_lpos->begin)); - } + /* Data block does not wrap. */ + if (!is_blk_wrapped(data_ring, blk_lpos->begin, blk_lpos->next)) + return blk_lpos->next - blk_lpos->begin; /* * For wrapping data blocks, the trailing (wasted) space is -- cgit v1.2.3