diff mbox series

cifs: Fix memory leak when using fscache

Message ID 20220718190624.3087569-1-willy@infradead.org
State New
Headers show
Series cifs: Fix memory leak when using fscache | expand

Commit Message

Matthew Wilcox July 18, 2022, 7:06 p.m. UTC
If we hit the 'index == next_cached' case, we leak a refcount on the
struct page.  Fix this by using readahead_folio() which takes care of
the refcount for you.

Fixes: 0174ee9947bd ("cifs: Implement cache I/O by accessing the cache directly")
Cc: David Howells <dhowells@redhat.com>
Cc: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/cifs/file.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Steve French July 19, 2022, 3:56 a.m. UTC | #1
tentatively merged into cifs-2.6.git for-next pending testing

On Mon, Jul 18, 2022 at 2:07 PM Matthew Wilcox (Oracle)
<willy@infradead.org> wrote:
>
> If we hit the 'index == next_cached' case, we leak a refcount on the
> struct page.  Fix this by using readahead_folio() which takes care of
> the refcount for you.
>
> Fixes: 0174ee9947bd ("cifs: Implement cache I/O by accessing the cache directly")
> Cc: David Howells <dhowells@redhat.com>
> Cc: Jeff Layton <jlayton@kernel.org>
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  fs/cifs/file.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index e64cda7a7610..6985710e14c2 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -4459,10 +4459,10 @@ static void cifs_readahead(struct readahead_control *ractl)
>                                  * TODO: Send a whole batch of pages to be read
>                                  * by the cache.
>                                  */
> -                               page = readahead_page(ractl);
> -                               last_batch_size = 1 << thp_order(page);
> +                               struct folio *folio = readahead_folio(ractl);
> +                               last_batch_size = folio_nr_pages(folio);
>                                 if (cifs_readpage_from_fscache(ractl->mapping->host,
> -                                                              page) < 0) {
> +                                                              &folio->page) < 0) {
>                                         /*
>                                          * TODO: Deal with cache read failure
>                                          * here, but for the moment, delegate
> @@ -4470,7 +4470,7 @@ static void cifs_readahead(struct readahead_control *ractl)
>                                          */
>                                         caching = false;
>                                 }
> -                               unlock_page(page);
> +                               folio_unlock(folio);
>                                 next_cached++;
>                                 cache_nr_pages--;
>                                 if (cache_nr_pages == 0)
> --
> 2.35.1
>
diff mbox series

Patch

diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index e64cda7a7610..6985710e14c2 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -4459,10 +4459,10 @@  static void cifs_readahead(struct readahead_control *ractl)
 				 * TODO: Send a whole batch of pages to be read
 				 * by the cache.
 				 */
-				page = readahead_page(ractl);
-				last_batch_size = 1 << thp_order(page);
+				struct folio *folio = readahead_folio(ractl);
+				last_batch_size = folio_nr_pages(folio);
 				if (cifs_readpage_from_fscache(ractl->mapping->host,
-							       page) < 0) {
+							       &folio->page) < 0) {
 					/*
 					 * TODO: Deal with cache read failure
 					 * here, but for the moment, delegate
@@ -4470,7 +4470,7 @@  static void cifs_readahead(struct readahead_control *ractl)
 					 */
 					caching = false;
 				}
-				unlock_page(page);
+				folio_unlock(folio);
 				next_cached++;
 				cache_nr_pages--;
 				if (cache_nr_pages == 0)