* [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files
@ 2026-03-23 3:43 Dave Chen
2026-03-23 14:07 ` David Sterba
0 siblings, 1 reply; 5+ messages in thread
From: Dave Chen @ 2026-03-23 3:43 UTC (permalink / raw)
To: linux-btrfs, dsterba; +Cc: cccheng, robbieko, Dave Chen
In btrfs_setsize(), when a file is truncated to size 0, the
BTRFS_INODE_FLUSH_ON_CLOSE flag is unconditionally set to ensure
pending writes get flushed on close. This flag was designed to protect
the "truncate-then-rewrite" pattern, where an application truncates a
file with existing data down to zero and writes new content, ensuring
the new data reaches disk on close.
However, when a file already has a size of 0 (e.g., a newly created
file opened with O_CREAT | O_TRUNC), oldsize and newsize are both 0.
In this case, setting BTRFS_INODE_FLUSH_ON_CLOSE is unnecessary because
no "good data" was truncated away. The subsequent filemap_flush() in
btrfs_release_file() then triggers avoidable writeback that disrupts
the normal delayed writeback batching, adding I/O overhead.
Fixes: a41ad394a03b ("Btrfs: convert to the new truncate sequence")
Signed-off-by: Dave Chen <davechen@synology.com>
Signed-off-by: Robbie Ko <robbieko@synology.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 a6da98435ef7c..73902056c1c50 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5434,7 +5434,7 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr)
* zero. Make sure any new writes to the file get on disk
* on close.
*/
- if (newsize == 0)
+ if (newsize == 0 && oldsize != 0)
set_bit(BTRFS_INODE_FLUSH_ON_CLOSE,
&BTRFS_I(inode)->runtime_flags);
--
2.43.0
Disclaimer: The contents of this e-mail message and any attachments are confidential and are intended solely for addressee. The information may also be legally privileged. This transmission is sent in trust, for the sole purpose of delivery to the intended recipient. If you have received this transmission in error, any use, reproduction or dissemination of this transmission is strictly prohibited. If you are not the intended recipient, please immediately notify the sender by reply e-mail or phone and delete this message and its attachments, if any.
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files
2026-03-23 3:43 [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files Dave Chen
@ 2026-03-23 14:07 ` David Sterba
2026-03-24 5:39 ` Dave Chen
2026-03-24 5:40 ` Dave Chen
0 siblings, 2 replies; 5+ messages in thread
From: David Sterba @ 2026-03-23 14:07 UTC (permalink / raw)
To: Dave Chen; +Cc: linux-btrfs, dsterba, cccheng, robbieko
On Mon, Mar 23, 2026 at 11:43:22AM +0800, Dave Chen wrote:
> In btrfs_setsize(), when a file is truncated to size 0, the
> BTRFS_INODE_FLUSH_ON_CLOSE flag is unconditionally set to ensure
> pending writes get flushed on close. This flag was designed to protect
> the "truncate-then-rewrite" pattern, where an application truncates a
> file with existing data down to zero and writes new content, ensuring
> the new data reaches disk on close.
>
> However, when a file already has a size of 0 (e.g., a newly created
> file opened with O_CREAT | O_TRUNC), oldsize and newsize are both 0.
> In this case, setting BTRFS_INODE_FLUSH_ON_CLOSE is unnecessary because
> no "good data" was truncated away. The subsequent filemap_flush() in
> btrfs_release_file() then triggers avoidable writeback that disrupts
> the normal delayed writeback batching, adding I/O overhead.
Does this have a measurable impact? Truncating 0 -> 0 without any
intermediate writes could happen but I kind of doubt it's worth
optimizing. I'm not against adding the patch but would like to know if
it's fixing some problem for you. Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files
2026-03-23 14:07 ` David Sterba
@ 2026-03-24 5:39 ` Dave Chen
2026-03-24 5:40 ` Dave Chen
1 sibling, 0 replies; 5+ messages in thread
From: Dave Chen @ 2026-03-24 5:39 UTC (permalink / raw)
To: dsterba; +Cc: cccheng, davechen, dsterba, linux-btrfs, robbieko
On Mon, Mar 23, 2026 at 03:07:48PM +0100, David Sterba wrote:
> Does this have a measurable impact? Truncating 0 -> 0 without any
> intermediate writes could happen but I kind of doubt it's worth
> optimizing. I'm not against adding the patch but would like to know if
> it's fixing some problem for you. Thanks.
Yes, this comes from a real workload. We have a backup service that
creates temporary files via mkstemp(), closes them, and later reopens
them with O_TRUNC for writing. The O_TRUNC is defensive -- the file is
always empty at that point, but the temp file creation and usage are in
separate components, so removing it from userspace isn't straightforward.
This pattern repeats for a large number of files per backup job, and
each close() triggers an unnecessary filemap_flush().
When oldsize is already 0, the flag provides no protection -- there is
no data being truncated away, so the filemap_flush() on close serves
no purpose. The fix simply makes the condition match what the comment
already describes.
Thanks.
Disclaimer: The contents of this e-mail message and any attachments are confidential and are intended solely for addressee. The information may also be legally privileged. This transmission is sent in trust, for the sole purpose of delivery to the intended recipient. If you have received this transmission in error, any use, reproduction or dissemination of this transmission is strictly prohibited. If you are not the intended recipient, please immediately notify the sender by reply e-mail or phone and delete this message and its attachments, if any.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files
2026-03-23 14:07 ` David Sterba
2026-03-24 5:39 ` Dave Chen
@ 2026-03-24 5:40 ` Dave Chen
2026-03-24 15:26 ` David Sterba
1 sibling, 1 reply; 5+ messages in thread
From: Dave Chen @ 2026-03-24 5:40 UTC (permalink / raw)
To: dsterba; +Cc: cccheng, davechen, dsterba, linux-btrfs, robbieko
On Mon, Mar 23, 2026 at 03:07:48PM +0100, David Sterba wrote:
> Does this have a measurable impact? Truncating 0 -> 0 without any
> intermediate writes could happen but I kind of doubt it's worth
> optimizing. I'm not against adding the patch but would like to know if
> it's fixing some problem for you. Thanks.
Yes, this comes from a real workload. We have a backup service that
creates temporary files via mkstemp(), closes them, and later reopens
them with O_TRUNC for writing. The O_TRUNC is defensive -- the file is
always empty at that point, but the temp file creation and usage are in
separate components, so removing it from userspace isn't straightforward.
This pattern repeats for a large number of files per backup job, and
each close() triggers an unnecessary filemap_flush().
When oldsize is already 0, the flag provides no protection -- there is
no data being truncated away, so the filemap_flush() on close serves
no purpose. The fix simply makes the condition match what the comment
already describes.
Thanks.
Disclaimer: The contents of this e-mail message and any attachments are confidential and are intended solely for addressee. The information may also be legally privileged. This transmission is sent in trust, for the sole purpose of delivery to the intended recipient. If you have received this transmission in error, any use, reproduction or dissemination of this transmission is strictly prohibited. If you are not the intended recipient, please immediately notify the sender by reply e-mail or phone and delete this message and its attachments, if any.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files
2026-03-24 5:40 ` Dave Chen
@ 2026-03-24 15:26 ` David Sterba
0 siblings, 0 replies; 5+ messages in thread
From: David Sterba @ 2026-03-24 15:26 UTC (permalink / raw)
To: Dave Chen; +Cc: dsterba, cccheng, dsterba, linux-btrfs, robbieko
On Tue, Mar 24, 2026 at 01:40:39PM +0800, Dave Chen wrote:
> On Mon, Mar 23, 2026 at 03:07:48PM +0100, David Sterba wrote:
> > Does this have a measurable impact? Truncating 0 -> 0 without any
> > intermediate writes could happen but I kind of doubt it's worth
> > optimizing. I'm not against adding the patch but would like to know if
> > it's fixing some problem for you. Thanks.
>
> Yes, this comes from a real workload. We have a backup service that
> creates temporary files via mkstemp(), closes them, and later reopens
> them with O_TRUNC for writing. The O_TRUNC is defensive -- the file is
> always empty at that point, but the temp file creation and usage are in
> separate components, so removing it from userspace isn't straightforward.
>
> This pattern repeats for a large number of files per backup job, and
> each close() triggers an unnecessary filemap_flush().
>
> When oldsize is already 0, the flag provides no protection -- there is
> no data being truncated away, so the filemap_flush() on close serves
> no purpose. The fix simply makes the condition match what the comment
> already describes.
Thanks, I'll add the workload description to changelog.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-03-24 15:26 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-23 3:43 [PATCH] btrfs: fix unnecessary flush on close when truncating zero-sized files Dave Chen
2026-03-23 14:07 ` David Sterba
2026-03-24 5:39 ` Dave Chen
2026-03-24 5:40 ` Dave Chen
2026-03-24 15:26 ` David Sterba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox