[PATCH v2 2/4] mtd: block2mtd: convert block2mtd_read() to folios

From: Tal Zussman

Date: Fri Oct 16 2026 - 15:17:28 EST


Look the folio up with read_mapping_folio() instead of
read_mapping_page() and copy from it directly. This removes a hidden
compound_head() call per page.

Signed-off-by: Tal Zussman <tz2294@xxxxxxxxxxxx>
---
drivers/mtd/devices/block2mtd.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
index ca72110b07d6..db5472c6b8c2 100644
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
@@ -112,30 +112,24 @@ static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
{
struct block2mtd_dev *dev = mtd->priv;
struct address_space *mapping = dev->bdev_file->f_mapping;
- struct page *page;
- pgoff_t index = from >> PAGE_SHIFT;
- int offset = from & (PAGE_SIZE-1);
- int cpylen;
+ struct folio *folio;
+ size_t offset, cpylen;

while (len) {
- if ((offset + len) > PAGE_SIZE)
- cpylen = PAGE_SIZE - offset; // multiple pages
- else
- cpylen = len; // this page
- len = len - cpylen;
-
- page = page_read(mapping, index);
- if (IS_ERR(page))
- return PTR_ERR(page);
+ folio = read_mapping_folio(mapping, from >> PAGE_SHIFT, NULL);
+ if (IS_ERR(folio))
+ return PTR_ERR(folio);

- memcpy(buf, page_address(page) + offset, cpylen);
- put_page(page);
+ offset = offset_in_folio(folio, from);
+ cpylen = min(len, folio_size(folio) - offset);
+ memcpy(buf, folio_address(folio) + offset, cpylen);
+ folio_put(folio);

if (retlen)
*retlen += cpylen;
buf += cpylen;
- offset = 0;
- index++;
+ from += cpylen;
+ len -= cpylen;
}
return 0;
}

--
2.39.5