diff mbox series

[2/2] btrfs: fix inode reserve space leak due to nowait buffered write

Message ID 4611e4d00d202f24c7c9d3581194b2d68a67c986.1667392727.git.fdmanana@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: fixes for nowait buffered writes | expand

Commit Message

Filipe Manana Nov. 2, 2022, 12:46 p.m. UTC
From: Filipe Manana <fdmanana@suse.com>

During a nowait buffered write, if we fail to balance dirty pages we exit
btrfs_buffered_write() without releasing the delalloc space reserved for
an extent, resulting in leaking space from the inode's block reserve.

So fix that by releasing the delalloc space for the extent when balancing
dirty pages fails.

Reported-by: kernel test robot <yujie.liu@intel.com>
Link: https://lore.kernel.org/all/202210111304.d369bc32-yujie.liu@intel.com
Fixes: 965f47aeb5de ("btrfs: make btrfs_buffered_write nowait compatible")
Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/file.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 75d4d0bc9d8f..f8be9d629e75 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1295,8 +1295,10 @@  static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb,
 		release_bytes = reserve_bytes;
 again:
 		ret = balance_dirty_pages_ratelimited_flags(inode->i_mapping, bdp_flags);
-		if (ret)
+		if (ret) {
+			btrfs_delalloc_release_extents(BTRFS_I(inode), reserve_bytes);
 			break;
+		}
 
 		/*
 		 * This is going to setup the pages array with the number of