| From f2a26a3cff27dfa456fef386fe5df56dcb4b47b6 Mon Sep 17 00:00:00 2001 |
| From: Steve French <stfrench@microsoft.com> |
| Date: Fri, 23 Jul 2021 18:35:15 -0500 |
| Subject: SMB3: fix readpage for large swap cache |
| |
| From: Steve French <stfrench@microsoft.com> |
| |
| commit f2a26a3cff27dfa456fef386fe5df56dcb4b47b6 upstream. |
| |
| readpage was calculating the offset of the page incorrectly |
| for the case of large swapcaches. |
| |
| loff_t offset = (loff_t)page->index << PAGE_SHIFT; |
| |
| As pointed out by Matthew Wilcox, this needs to use |
| page_file_offset() to calculate the offset instead. |
| Pages coming from the swap cache have page->index set |
| to their index within the swapcache, not within the backing |
| file. For a sufficiently large swapcache, we could have |
| overlapping values of page->index within the same backing file. |
| |
| Suggested by: Matthew Wilcox (Oracle) <willy@infradead.org> |
| Cc: <stable@vger.kernel.org> # v5.7+ |
| Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/cifs/file.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/cifs/file.c |
| +++ b/fs/cifs/file.c |
| @@ -4550,7 +4550,7 @@ read_complete: |
| |
| static int cifs_readpage(struct file *file, struct page *page) |
| { |
| - loff_t offset = (loff_t)page->index << PAGE_SHIFT; |
| + loff_t offset = page_file_offset(page); |
| int rc = -EACCES; |
| unsigned int xid; |
| |