Message ID | 20220718190624.3087569-1-willy@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cifs: Fix memory leak when using fscache | expand |
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 --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)
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(-)