summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobbie Ko <robbieko@synology.com>2020-07-20 09:42:09 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-07-29 10:18:30 +0200
commit38a66f3cdab4b256be1313b64c0394c6dc001b79 (patch)
tree8af8bff6ca8ae4b24ac86317c92e7a7104a60587
parentb04805a7e8a5c6b2298877b16c216abcd3e11438 (diff)
downloadlinux-stable-38a66f3cdab4b256be1313b64c0394c6dc001b79.tar.gz
linux-stable-38a66f3cdab4b256be1313b64c0394c6dc001b79.tar.bz2
linux-stable-38a66f3cdab4b256be1313b64c0394c6dc001b79.zip
btrfs: fix page leaks after failure to lock page for delalloc
commit 5909ca110b29aa16b23b52b8de8d3bb1035fd738 upstream. When locking pages for delalloc, we check if it's dirty and mapping still matches. If it does not match, we need to return -EAGAIN and release all pages. Only the current page was put though, iterate over all the remaining pages too. CC: stable@vger.kernel.org # 4.14+ Reviewed-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: Robbie Ko <robbieko@synology.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/btrfs/extent_io.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 9b214b14a3aa..1a089a642422 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -1923,7 +1923,8 @@ static int __process_pages_contig(struct address_space *mapping,
if (!PageDirty(pages[i]) ||
pages[i]->mapping != mapping) {
unlock_page(pages[i]);
- put_page(pages[i]);
+ for (; i < ret; i++)
+ put_page(pages[i]);
err = -EAGAIN;
goto out;
}