From eb23e32375bdc6abbdfc864c2ac0a3898170818d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 18 Feb 2023 17:08:32 +0100 Subject: [PATCH] 5.15-stable patches added patches: mm-filemap-fix-page-end-in-filemap_get_read_batch.patch --- ...x-page-end-in-filemap_get_read_batch.patch | 57 +++++++++++++++++++ queue-5.15/series | 1 + 2 files changed, 58 insertions(+) create mode 100644 queue-5.15/mm-filemap-fix-page-end-in-filemap_get_read_batch.patch diff --git a/queue-5.15/mm-filemap-fix-page-end-in-filemap_get_read_batch.patch b/queue-5.15/mm-filemap-fix-page-end-in-filemap_get_read_batch.patch new file mode 100644 index 00000000000..2de6bd56bd8 --- /dev/null +++ b/queue-5.15/mm-filemap-fix-page-end-in-filemap_get_read_batch.patch @@ -0,0 +1,57 @@ +From 5956592ce337330cdff0399a6f8b6a5aea397a8e Mon Sep 17 00:00:00 2001 +From: Qian Yingjin +Date: Wed, 8 Feb 2023 10:24:00 +0800 +Subject: mm/filemap: fix page end in filemap_get_read_batch + +From: Qian Yingjin + +commit 5956592ce337330cdff0399a6f8b6a5aea397a8e upstream. + +I was running traces of the read code against an RAID storage system to +understand why read requests were being misaligned against the underlying +RAID strips. I found that the page end offset calculation in +filemap_get_read_batch() was off by one. + +When a read is submitted with end offset 1048575, then it calculates the +end page for read of 256 when it should be 255. "last_index" is the index +of the page beyond the end of the read and it should be skipped when get a +batch of pages for read in @filemap_get_read_batch(). + +The below simple patch fixes the problem. This code was introduced in +kernel 5.12. + +Link: https://lkml.kernel.org/r/20230208022400.28962-1-coolqyj@163.com +Fixes: cbd59c48ae2b ("mm/filemap: use head pages in generic_file_buffered_read") +Signed-off-by: Qian Yingjin +Reviewed-by: Matthew Wilcox (Oracle) +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman +--- + mm/filemap.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -2538,18 +2538,19 @@ static int filemap_get_pages(struct kioc + struct page *page; + int err = 0; + ++ /* "last_index" is the index of the page beyond the end of the read */ + last_index = DIV_ROUND_UP(iocb->ki_pos + iter->count, PAGE_SIZE); + retry: + if (fatal_signal_pending(current)) + return -EINTR; + +- filemap_get_read_batch(mapping, index, last_index, pvec); ++ filemap_get_read_batch(mapping, index, last_index - 1, pvec); + if (!pagevec_count(pvec)) { + if (iocb->ki_flags & IOCB_NOIO) + return -EAGAIN; + page_cache_sync_readahead(mapping, ra, filp, index, + last_index - index); +- filemap_get_read_batch(mapping, index, last_index, pvec); ++ filemap_get_read_batch(mapping, index, last_index - 1, pvec); + } + if (!pagevec_count(pvec)) { + if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ)) diff --git a/queue-5.15/series b/queue-5.15/series index b00b63edcb0..0f1e5290c8d 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -69,3 +69,4 @@ ixgbe-add-double-of-vlan-header-when-computing-the-max-mtu.patch ipv6-fix-datagram-socket-connection-with-dscp.patch ipv6-fix-tcp-socket-connection-with-dscp.patch nilfs2-fix-underflow-in-second-superblock-position-calculations.patch +mm-filemap-fix-page-end-in-filemap_get_read_batch.patch -- 2.47.2