Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent()

submit_one_async_extent() calls btrfs_reserve_extent(), which decrements
bytes_may_use. If the call btrfs_create_io_em() fails, we jump to
out_free_reserve, which calls extent_clear_unlock_delalloc().

Because we're specifying EXTENT_DO_ACCOUNTING, i.e.
EXTENT_CLEAR_META_RESV | EXTENT_CLEAR_DATA_RESV, this decreases
bytes_may_use again. This can lead to problems later on, as an initial
write can fail only for the writeback to silently ENOSPC.

Fix this by replacing EXTENT_DO_ACCOUNTING with EXTENT_CLEAR_META_RESV.
This parallels a4fe134fc1d8eb ("btrfs: fix a double release on reserved
extents in cow_one_range()"), which is the same fix in cow_one_range().

Fixes: 151a41bc46df ("Btrfs: fix what bits we clear when erroring out from delalloc")
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Mark Harmstone <mark@harmstone.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by

Mark Harmstone and committed by
David Sterba
82323b1a a8d58a7c

+1 -1
+1 -1
fs/btrfs/inode.c
··· 1153 1153 NULL, &cached, 1154 1154 EXTENT_LOCKED | EXTENT_DELALLOC | 1155 1155 EXTENT_DELALLOC_NEW | 1156 - EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING, 1156 + EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV, 1157 1157 PAGE_UNLOCK | PAGE_START_WRITEBACK | 1158 1158 PAGE_END_WRITEBACK); 1159 1159 if (async_extent->cb)