lib/freader: support reading more than 2 folios

freader_fetch currently reads from at most two folios. When a read spans
into a third folio, the overflow bytes are copied adjacent to the second
folio’s data instead of being handled as a separate folio.
This patch modifies fetch algorithm to support reading from many folios.

Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Reviewed-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20251026203853.135105-5-mykyta.yatsenko5@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Mykyta Yatsenko 2025-10-26 20:38:47 +00:00 committed by Alexei Starovoitov
parent 76e4fed847
commit 5a5fff604f
1 changed files with 13 additions and 10 deletions

View File

@ -108,18 +108,21 @@ const void *freader_fetch(struct freader *r, loff_t file_off, size_t sz)
*/ */
folio_sz = folio_size(r->folio); folio_sz = folio_size(r->folio);
if (file_off + sz > r->folio_off + folio_sz) { if (file_off + sz > r->folio_off + folio_sz) {
int part_sz = r->folio_off + folio_sz - file_off; u64 part_sz = r->folio_off + folio_sz - file_off, off;
/* copy the part that resides in the current folio */ memcpy(r->buf, r->addr + file_off - r->folio_off, part_sz);
memcpy(r->buf, r->addr + (file_off - r->folio_off), part_sz); off = part_sz;
/* fetch next folio */ while (off < sz) {
r->err = freader_get_folio(r, r->folio_off + folio_sz); /* fetch next folio */
if (r->err) r->err = freader_get_folio(r, r->folio_off + folio_sz);
return NULL; if (r->err)
return NULL;
/* copy the rest of requested data */ folio_sz = folio_size(r->folio);
memcpy(r->buf + part_sz, r->addr, sz - part_sz); part_sz = min_t(u64, sz - off, folio_sz);
memcpy(r->buf + off, r->addr, part_sz);
off += part_sz;
}
return r->buf; return r->buf;
} }