diff options
author | Filipe Manana <fdmanana@suse.com> | 2019-10-09 18:43:45 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2019-10-11 19:49:11 +0200 |
commit | 44db1216efe37bf670f8d1019cdc41658d84baf5 (patch) | |
tree | 584d4dac8097603a5c850955546151b5618216d6 /fs | |
parent | btrfs: silence maybe-uninitialized warning in clone_range (diff) | |
download | linux-44db1216efe37bf670f8d1019cdc41658d84baf5.tar.xz linux-44db1216efe37bf670f8d1019cdc41658d84baf5.zip |
Btrfs: add missing extents release on file extent cluster relocation error
If we error out when finding a page at relocate_file_extent_cluster(), we
need to release the outstanding extents counter on the relocation inode,
set by the previous call to btrfs_delalloc_reserve_metadata(), otherwise
the inode's block reserve size can never decrease to zero and metadata
space is leaked. Therefore add a call to btrfs_delalloc_release_extents()
in case we can't find the target page.
Fixes: 8b62f87bad9c ("Btrfs: rework outstanding_extents")
CC: stable@vger.kernel.org # 4.19+
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/relocation.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 00504657b602..7b883239fa7e 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -3277,6 +3277,8 @@ static int relocate_file_extent_cluster(struct inode *inode, if (!page) { btrfs_delalloc_release_metadata(BTRFS_I(inode), PAGE_SIZE, true); + btrfs_delalloc_release_extents(BTRFS_I(inode), + PAGE_SIZE, true); ret = -ENOMEM; goto out; } |