Skip to content

Commit 57e3220

Browse files
fdmananakdave
authored andcommitted
btrfs: fix changeset leak on mmap write after failure to reserve metadata
If the call to btrfs_delalloc_reserve_metadata() fails we jump to the 'out_noreserve' label and there we never free the extent_changeset allocated by the previous call to btrfs_check_data_free_space() (if qgroups are enabled). Fix this by calling extent_changeset_free() under the 'out_noreserve' label. Fixes: 6599716 ("btrfs: fix -ENOSPC mmap write failure on NOCOW files/extents") Reported-by: syzbot+2f8aa76e6acc9fce6638@syzkaller.appspotmail.com Link: https://lore.kernel.org/linux-btrfs/693a635a.a70a0220.33cd7b.0029.GAE@google.com/ Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 54489c5 commit 57e3220

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

fs/btrfs/file.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2019,13 +2019,14 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf)
20192019
else
20202020
btrfs_delalloc_release_space(inode, data_reserved, page_start,
20212021
reserved_space, true);
2022-
extent_changeset_free(data_reserved);
20232022
out_noreserve:
20242023
if (only_release_metadata)
20252024
btrfs_check_nocow_unlock(inode);
20262025

20272026
sb_end_pagefault(inode->vfs_inode.i_sb);
20282027

2028+
extent_changeset_free(data_reserved);
2029+
20292030
if (ret < 0)
20302031
return vmf_error(ret);
20312032

0 commit comments

Comments
 (0)