From: Sergey Senozhatsky <senozhatsky@chromium.org>
To: Pooyan Azad <pooyan.azadparvar@gmail.com>
Cc: Minchan Kim <minchan@kernel.org>,
Sergey Senozhatsky <senozhatsky@chromium.org>,
Andrew Morton <akpm@linux-foundation.org>,
Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] zram: fix short reads from block_state
Date: Tue, 29 Sep 2026 13:52:55 +0900 [thread overview]
Message-ID: <artCq0JFqBNcZkzY@google.com> (raw)
In-Reply-To: <20260928164826.24858-1-pooyan.azadparvar@gmail.com>
On (26/09/28 18:48), Pooyan Azad wrote:
> read_block_state() formats each entry directly into the buffer supplied
> by read(). If the remaining buffer is too small for one complete record,
> snprintf() returns the full record length and the function stops without
> copying data or advancing the file position. A read smaller than a record
> therefore returns zero at a non-EOF position and cannot make progress.
>
> Convert block_state to seq_file so formatted records are buffered
> independently of the userspace read size. Keep dev_lock held across each
> seq_file iteration and continue to protect individual entries with their
> slot locks.
>
> Fixes: c0265342bff4 ("zram: introduce zram memory tracking")
> Closes: https://lore.kernel.org/r/CANC3H+LdtoydSp+o2ecErAw7k6R2+gRf9LyxcaoHv_mGhJmyQQ@mail.gmail.com/
> Signed-off-by: Pooyan Azad <pooyan.azadparvar@gmail.com>
Overall looks good, some comments below.
[..]
> No runtime testing of the patched kernel was performed.
I would prefer some testing, especially given that you have a repro script.
[..]
> +static void *zram_block_state_next(struct seq_file *seq, void *v, loff_t *pos)
> +{
> + struct zram *zram = seq->private;
> + unsigned long nr_pages = zram->disksize >> PAGE_SHIFT;
>
> - copied = snprintf(kbuf + written, count,
> - "%12lu %12u.%06d %c%c%c%c%c%c\n",
> - index, zram->table[index].attr.ac_time, 0,
> - test_slot_flag(zram, index, ZRAM_SAME) ? 's' : '.',
> - test_slot_flag(zram, index, ZRAM_WB) ? 'w' : '.',
> - test_slot_flag(zram, index, ZRAM_HUGE) ? 'h' : '.',
> - test_slot_flag(zram, index, ZRAM_IDLE) ? 'i' : '.',
> - get_slot_comp_priority(zram, index) ? 'r' : '.',
> - test_slot_flag(zram, index,
> - ZRAM_INCOMPRESSIBLE) ? 'n' : '.');
> -
> - if (count <= copied) {
> - slot_unlock(zram, index);
> - break;
> - }
> - written += copied;
> - count -= copied;
> -next:
> + ++*pos;
> + if (*pos >= nr_pages)
> + return NULL;
> +
> + return &zram->table[*pos];
> +}
Can you return pos instead? (and handle v as a pointer to offset in
other functions.)
[..]
> +static int zram_block_state_show(struct seq_file *seq, void *v)
> +{
> + struct zram *zram = seq->private;
> + struct zram_table_entry *entry = v;
> + unsigned long index = entry - zram->table;
> +
> + slot_lock(zram, index);
> + if (!slot_allocated(zram, index)) {
> slot_unlock(zram, index);
> - *ppos += 1;
> + return SEQ_SKIP;
> }
I guess we can just do
+static int block_state_show(struct seq_file *s, void *v)
+{
+ struct zram *zram = s->private;
+ unsigned long index = *(loff_t *)v;
+
+ slot_lock(zram, index);
+ if (slot_allocated(zram, index)) {
+ seq_printf(s, "%12lu %12u.%06d %c%c%c%c%c%c\n",
+ index, zram->table[index].attr.ac_time, 0,
+ test_slot_flag(zram, index, ZRAM_SAME) ? 's' : '.',
+ test_slot_flag(zram, index, ZRAM_WB) ? 'w' : '.',
+ test_slot_flag(zram, index, ZRAM_HUGE) ? 'h' : '.',
+ test_slot_flag(zram, index, ZRAM_IDLE) ? 'i' : '.',
+ get_slot_comp_priority(zram, index) ? 'r' : '.',
+ test_slot_flag(zram, index,
+ ZRAM_INCOMPRESSIBLE) ? 'n' : '.');
}
+ slot_unlock(zram, index);
- if (copy_to_user(buf, kbuf, written))
- written = -EFAULT;
- kvfree(kbuf);
-
- return written;
+ return 0;
}
The SEQ_SKIP branch is probably not needed. We don't advance s->count
for un-allocated entries, which should be enough, I guess.
next prev parent reply other threads:[~2026-09-29 4:53 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-20 16:27 zram: block_state returns premature EOF with short read buffers Pooyan Azadparvar
2026-09-28 16:48 ` [PATCH] zram: fix short reads from block_state Pooyan Azad
2026-09-29 4:52 ` Sergey Senozhatsky [this message]
2026-09-29 7:18 ` [PATCH v2] " Pooyan Azad
2026-09-29 8:36 ` Sergey Senozhatsky
2026-09-29 4:13 ` zram: block_state returns premature EOF with short read buffers Sergey Senozhatsky
2026-09-29 4:28 ` Sergey Senozhatsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=artCq0JFqBNcZkzY@google.com \
--to=senozhatsky@chromium.org \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=minchan@kernel.org \
--cc=pooyan.azadparvar@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®