]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent()
authorMark Harmstone <mark@harmstone.com>
Thu, 16 Apr 2026 17:15:23 +0000 (18:15 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 21 Apr 2026 02:03:08 +0000 (04:03 +0200)
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>
fs/btrfs/inode.c

index 55133a364305074e143d54cf4cdf4eac06fb4301..906d5c21ebc477b4b6abd2cb2fc53e0c6091b9a2 100644 (file)
@@ -1153,7 +1153,7 @@ out_free_reserve:
                                     NULL, &cached,
                                     EXTENT_LOCKED | EXTENT_DELALLOC |
                                     EXTENT_DELALLOC_NEW |
-                                    EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING,
+                                    EXTENT_DEFRAG | EXTENT_CLEAR_META_RESV,
                                     PAGE_UNLOCK | PAGE_START_WRITEBACK |
                                     PAGE_END_WRITEBACK);
        if (async_extent->cb)