diff options
author | Steve French <stfrench@microsoft.com> | 2021-07-24 02:35:15 +0300 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2021-07-27 06:35:25 +0300 |
commit | f2a26a3cff27dfa456fef386fe5df56dcb4b47b6 (patch) | |
tree | d22437eae1f459da59249ac50f0a195ac058df3a /fs/cifs/file.c | |
parent | ff1176468d368232b684f75e82563369208bc371 (diff) | |
download | linux-f2a26a3cff27dfa456fef386fe5df56dcb4b47b6.tar.xz |
SMB3: fix readpage for large swap cache
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>
Diffstat (limited to 'fs/cifs/file.c')
-rw-r--r-- | fs/cifs/file.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index cd108607a070..0a72840a88f1 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -4619,7 +4619,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; |