* [PATCH] btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent()
@ 2026-04-16 17:43 Mark Harmstone
2026-04-16 21:28 ` Qu Wenruo
2026-04-21 3:12 ` David Sterba
0 siblings, 2 replies; 3+ messages in thread
From: Mark Harmstone @ 2026-04-16 17:43 UTC (permalink / raw)
To: linux-btrfs; +Cc: Mark Harmstone
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 a4fe134fc1d8, which is the same fix in cow_one_range().
Fixes: 151a41bc46df ("Btrfs: fix what bits we clear when erroring out from delalloc")
Signed-off-by: Mark Harmstone <mark@harmstone.com>
---
fs/btrfs/inode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 36bbf2297a9987..abedaeb45189a2 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1204,7 +1204,7 @@ static void submit_one_async_extent(struct async_chunk *async_chunk,
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)
--
2.52.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent()
2026-04-16 17:43 [PATCH] btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent() Mark Harmstone
@ 2026-04-16 21:28 ` Qu Wenruo
2026-04-21 3:12 ` David Sterba
1 sibling, 0 replies; 3+ messages in thread
From: Qu Wenruo @ 2026-04-16 21:28 UTC (permalink / raw)
To: Mark Harmstone, linux-btrfs
在 2026/4/17 03:13, Mark Harmstone 写道:
> 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 a4fe134fc1d8, which is the same fix in cow_one_range().
>
> Fixes: 151a41bc46df ("Btrfs: fix what bits we clear when erroring out from delalloc")
> Signed-off-by: Mark Harmstone <mark@harmstone.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Thanks,
Qu
> ---
> fs/btrfs/inode.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 36bbf2297a9987..abedaeb45189a2 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -1204,7 +1204,7 @@ static void submit_one_async_extent(struct async_chunk *async_chunk,
> 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)
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent()
2026-04-16 17:43 [PATCH] btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent() Mark Harmstone
2026-04-16 21:28 ` Qu Wenruo
@ 2026-04-21 3:12 ` David Sterba
1 sibling, 0 replies; 3+ messages in thread
From: David Sterba @ 2026-04-21 3:12 UTC (permalink / raw)
To: Mark Harmstone; +Cc: linux-btrfs
On Thu, Apr 16, 2026 at 06:43:51PM +0100, Mark Harmstone wrote:
> 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 a4fe134fc1d8, which is the same fix in cow_one_range().
^^^^^^^^^^^^
Please for first occurence put the full commit reference, the same one
as for the Fixes tag. Fixed in for-next.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-04-21 3:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-16 17:43 [PATCH] btrfs: fix double-decrement of bytes_may_use in submit_one_async_extent() Mark Harmstone
2026-04-16 21:28 ` Qu Wenruo
2026-04-21 3:12 ` David Sterba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox