* [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace
@ 2026-10-28 17:55 Luca Stefani via B4 Relay
2026-10-28 17:55 ` [PATCH 1/2] btrfs: account partially completed discards Luca Stefani via B4 Relay
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Luca Stefani via B4 Relay @ 2026-10-28 17:55 UTC (permalink / raw)
To: David Sterba, Chris Mason, Luca Stefani
Cc: Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel,
Zhiwei Liang, Qu Wenruo
trim can expose -ERESTARTSYS when the trim loops gets interrupted by
a freezer request.
Preserve byte counts of partially completed discards.
Consume cancellation at btrfs_trim_fs(), and report partial progress.
Link: https://lore.kernel.org/20261028-btrfs-fitrim-freezer-v1-1-0ad1d58aa94d@zliang.me/
---
Luca Stefani (2):
btrfs: account partially completed discards
btrfs: don't report failure when trim is interrupted
fs/btrfs/extent-tree.c | 10 ++++------
fs/btrfs/free-space-cache.c | 5 ++---
2 files changed, 6 insertions(+), 9 deletions(-)
---
base-commit: 65ba8f34ec886ec72b2c07ddc8cf3d815c32869d
change-id: 20261028-b4-btrfs-fitrim-interruption-48ae75801fa0
Best regards,
--
Luca Stefani <luca.stefani.ge1@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/2] btrfs: account partially completed discards 2026-10-28 17:55 [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace Luca Stefani via B4 Relay @ 2026-10-28 17:55 ` Luca Stefani via B4 Relay 2026-10-28 21:02 ` Qu Wenruo 2026-10-28 17:55 ` [PATCH 2/2] btrfs: don't report failure when trim is interrupted Luca Stefani via B4 Relay 2026-10-28 20:13 ` [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace zhiwei.liang 2 siblings, 1 reply; 7+ messages in thread From: Luca Stefani via B4 Relay @ 2026-10-28 17:55 UTC (permalink / raw) To: David Sterba, Chris Mason, Luca Stefani Cc: Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel From: Luca Stefani <luca.stefani.ge1@gmail.com> A discard can complete part of a range before a later chunk is interrupted or fails. btrfs_issue_discard() reports the bytes already discarded, but its callers only accumulate those bytes when the entire operation succeeds. Link: https://lore.kernel.org/20261028-btrfs-fitrim-freezer-v1-1-0ad1d58aa94d@zliang.me/ Signed-off-by: Luca Stefani <luca.stefani.ge1@gmail.com> --- fs/btrfs/extent-tree.c | 5 ++--- fs/btrfs/free-space-cache.c | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 9b0a5c6b96f3..242db255cf1c 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1463,6 +1463,7 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, continue; ret = do_discard_extent(stripe, &bytes); + discarded_bytes += bytes; if (ret) { /* * Keep going if discard is not supported by the @@ -1471,8 +1472,6 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, if (ret != -EOPNOTSUPP) break; ret = 0; - } else { - discarded_bytes += bytes; } } kfree(stripes); @@ -6703,6 +6702,7 @@ static int btrfs_trim_free_extents_throttle(struct btrfs_device *device, ret = btrfs_issue_discard(device->bdev, start, len, &bytes); + *trimmed += bytes; if (!ret) btrfs_set_extent_bit(&device->alloc_state, start, start + bytes - 1, CHUNK_TRIMMED, NULL); @@ -6712,7 +6712,6 @@ static int btrfs_trim_free_extents_throttle(struct btrfs_device *device, break; start += len; - *trimmed += bytes; trim_len += len; if (trim_len >= BTRFS_MAX_TRIM_LENGTH) { *ret_next_pos = start; diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index bff6e5b372d6..a85806bcf87a 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -2415,10 +2415,9 @@ static int do_trimming(struct btrfs_block_group *block_group, spin_unlock(&space_info->lock); ret = btrfs_discard_extent(fs_info, start, bytes, &trimmed, false); - if (!ret) { - *total_trimmed += trimmed; + *total_trimmed += trimmed; + if (!ret) trim_state = BTRFS_TRIM_STATE_TRIMMED; - } if (reserved_start < start) __btrfs_add_free_space(block_group, reserved_start, -- 2.56.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] btrfs: account partially completed discards 2026-10-28 17:55 ` [PATCH 1/2] btrfs: account partially completed discards Luca Stefani via B4 Relay @ 2026-10-28 21:02 ` Qu Wenruo 0 siblings, 0 replies; 7+ messages in thread From: Qu Wenruo @ 2026-10-28 21:02 UTC (permalink / raw) To: luca.stefani.ge1, David Sterba, Chris Mason Cc: Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel 在 2026/10/29 04:25, Luca Stefani via B4 Relay 写道: > From: Luca Stefani <luca.stefani.ge1@gmail.com> > > A discard can complete part of a range before a later chunk is interrupted > or fails. btrfs_issue_discard() reports the bytes already discarded, but > its callers only accumulate those bytes when the entire operation succeeds. > > Link: https://lore.kernel.org/20261028-btrfs-fitrim-freezer-v1-1-0ad1d58aa94d@zliang.me/ I don't think this link tag adds any value. This series is going a completely different, and more sane fix than that LLM generated one. Otherwise looks good to me. Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu > Signed-off-by: Luca Stefani <luca.stefani.ge1@gmail.com> > --- > fs/btrfs/extent-tree.c | 5 ++--- > fs/btrfs/free-space-cache.c | 5 ++--- > 2 files changed, 4 insertions(+), 6 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 9b0a5c6b96f3..242db255cf1c 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -1463,6 +1463,7 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, > continue; > > ret = do_discard_extent(stripe, &bytes); > + discarded_bytes += bytes; > if (ret) { > /* > * Keep going if discard is not supported by the > @@ -1471,8 +1472,6 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr, > if (ret != -EOPNOTSUPP) > break; > ret = 0; > - } else { > - discarded_bytes += bytes; > } > } > kfree(stripes); > @@ -6703,6 +6702,7 @@ static int btrfs_trim_free_extents_throttle(struct btrfs_device *device, > > ret = btrfs_issue_discard(device->bdev, start, len, > &bytes); > + *trimmed += bytes; > if (!ret) > btrfs_set_extent_bit(&device->alloc_state, start, > start + bytes - 1, CHUNK_TRIMMED, NULL); > @@ -6712,7 +6712,6 @@ static int btrfs_trim_free_extents_throttle(struct btrfs_device *device, > break; > > start += len; > - *trimmed += bytes; > trim_len += len; > if (trim_len >= BTRFS_MAX_TRIM_LENGTH) { > *ret_next_pos = start; > diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c > index bff6e5b372d6..a85806bcf87a 100644 > --- a/fs/btrfs/free-space-cache.c > +++ b/fs/btrfs/free-space-cache.c > @@ -2415,10 +2415,9 @@ static int do_trimming(struct btrfs_block_group *block_group, > spin_unlock(&space_info->lock); > > ret = btrfs_discard_extent(fs_info, start, bytes, &trimmed, false); > - if (!ret) { > - *total_trimmed += trimmed; > + *total_trimmed += trimmed; > + if (!ret) > trim_state = BTRFS_TRIM_STATE_TRIMMED; > - } > > if (reserved_start < start) > __btrfs_add_free_space(block_group, reserved_start, > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] btrfs: don't report failure when trim is interrupted 2026-10-28 17:55 [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace Luca Stefani via B4 Relay 2026-10-28 17:55 ` [PATCH 1/2] btrfs: account partially completed discards Luca Stefani via B4 Relay @ 2026-10-28 17:55 ` Luca Stefani via B4 Relay 2026-10-28 21:06 ` Qu Wenruo 2026-10-28 20:13 ` [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace zhiwei.liang 2 siblings, 1 reply; 7+ messages in thread From: Luca Stefani via B4 Relay @ 2026-10-28 17:55 UTC (permalink / raw) To: David Sterba, Chris Mason, Luca Stefani Cc: Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel, Zhiwei Liang, Qu Wenruo From: Luca Stefani <luca.stefani.ge1@gmail.com> Treat cancellation as a successful partial trim as ext4 and XFS do. Reported-by: Zhiwei Liang <zhiwei.liang@zliang.me> Closes: https://lore.kernel.org/20261028-btrfs-fitrim-freezer-v1-1-0ad1d58aa94d@zliang.me/ Suggested-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Luca Stefani <luca.stefani.ge1@gmail.com> --- fs/btrfs/extent-tree.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 242db255cf1c..90e581c29609 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -6926,7 +6926,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range) bg_failed, ERR_PTR(bg_ret)); if (ret == -ERESTARTSYS || ret == -EINTR) - return ret; + goto out; ret = btrfs_trim_free_extents(fs_info, &group_trimmed, &dev_failed, &dev_ret); trimmed += group_trimmed; @@ -6935,9 +6935,8 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range) btrfs_warn(fs_info, "failed to trim %llu device(s), first error %pe", dev_failed, ERR_PTR(dev_ret)); +out: range->len = trimmed; - if (ret == -ERESTARTSYS || ret == -EINTR) - return ret; if (bg_ret) return bg_ret; return dev_ret; -- 2.56.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] btrfs: don't report failure when trim is interrupted 2026-10-28 17:55 ` [PATCH 2/2] btrfs: don't report failure when trim is interrupted Luca Stefani via B4 Relay @ 2026-10-28 21:06 ` Qu Wenruo 2026-10-29 8:56 ` Luca Stefani 0 siblings, 1 reply; 7+ messages in thread From: Qu Wenruo @ 2026-10-28 21:06 UTC (permalink / raw) To: luca.stefani.ge1, David Sterba, Chris Mason Cc: Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel, Zhiwei Liang, Qu Wenruo 在 2026/10/29 04:25, Luca Stefani via B4 Relay 写道: > From: Luca Stefani <luca.stefani.ge1@gmail.com> > > Treat cancellation as a successful partial trim as ext4 and XFS do. > > Reported-by: Zhiwei Liang <zhiwei.liang@zliang.me> > Closes: https://lore.kernel.org/20261028-btrfs-fitrim-freezer-v1-1-0ad1d58aa94d@zliang.me/ In fact you should use Link tag here, for the original patch as a report. Not Closes tag. Otherwise looks good to me. I can change the tags at merge time, so you don't need to resend the series, unless there are other reviews that requires code changes. Thanks, Qu > Suggested-by: Qu Wenruo <wqu@suse.com> > Signed-off-by: Luca Stefani <luca.stefani.ge1@gmail.com> > --- > fs/btrfs/extent-tree.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 242db255cf1c..90e581c29609 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -6926,7 +6926,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range) > bg_failed, ERR_PTR(bg_ret)); > > if (ret == -ERESTARTSYS || ret == -EINTR) > - return ret; > + goto out; > > ret = btrfs_trim_free_extents(fs_info, &group_trimmed, &dev_failed, &dev_ret); > trimmed += group_trimmed; > @@ -6935,9 +6935,8 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range) > btrfs_warn(fs_info, > "failed to trim %llu device(s), first error %pe", > dev_failed, ERR_PTR(dev_ret)); > +out: > range->len = trimmed; > - if (ret == -ERESTARTSYS || ret == -EINTR) > - return ret; > if (bg_ret) > return bg_ret; > return dev_ret; > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] btrfs: don't report failure when trim is interrupted 2026-10-28 21:06 ` Qu Wenruo @ 2026-10-29 8:56 ` Luca Stefani 0 siblings, 0 replies; 7+ messages in thread From: Luca Stefani @ 2026-10-29 8:56 UTC (permalink / raw) To: Qu Wenruo Cc: David Sterba, Chris Mason, Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel, Zhiwei Liang, Qu Wenruo On Wed, 28 Oct 2026 at 22:07, Qu Wenruo <quwenruo.btrfs@gmx.com> wrote: > > > > 在 2026/10/29 04:25, Luca Stefani via B4 Relay 写道: > > From: Luca Stefani <luca.stefani.ge1@gmail.com> > > > > Treat cancellation as a successful partial trim as ext4 and XFS do. > > > > Reported-by: Zhiwei Liang <zhiwei.liang@zliang.me> > > Closes: https://lore.kernel.org/20261028-btrfs-fitrim-freezer-v1-1-0ad1d58aa94d@zliang.me/ > > In fact you should use Link tag here, for the original patch as a > report. Not Closes tag. I think that was my original intention, but I mixed up the patches. > > Otherwise looks good to me. > > I can change the tags at merge time, so you don't need to resend the > series, unless there are other reviews that requires code changes. Thanks! Will fix them up in case. > > Thanks, > Qu > > > Suggested-by: Qu Wenruo <wqu@suse.com> > > Signed-off-by: Luca Stefani <luca.stefani.ge1@gmail.com> > > --- > > fs/btrfs/extent-tree.c | 5 ++--- > > 1 file changed, 2 insertions(+), 3 deletions(-) > > > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > > index 242db255cf1c..90e581c29609 100644 > > --- a/fs/btrfs/extent-tree.c > > +++ b/fs/btrfs/extent-tree.c > > @@ -6926,7 +6926,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range) > > bg_failed, ERR_PTR(bg_ret)); > > > > if (ret == -ERESTARTSYS || ret == -EINTR) > > - return ret; > > + goto out; > > > > ret = btrfs_trim_free_extents(fs_info, &group_trimmed, &dev_failed, &dev_ret); > > trimmed += group_trimmed; > > @@ -6935,9 +6935,8 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range) > > btrfs_warn(fs_info, > > "failed to trim %llu device(s), first error %pe", > > dev_failed, ERR_PTR(dev_ret)); > > +out: > > range->len = trimmed; > > - if (ret == -ERESTARTSYS || ret == -EINTR) > > - return ret; > > if (bg_ret) > > return bg_ret; > > return dev_ret; > > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace 2026-10-28 17:55 [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace Luca Stefani via B4 Relay 2026-10-28 17:55 ` [PATCH 1/2] btrfs: account partially completed discards Luca Stefani via B4 Relay 2026-10-28 17:55 ` [PATCH 2/2] btrfs: don't report failure when trim is interrupted Luca Stefani via B4 Relay @ 2026-10-28 20:13 ` zhiwei.liang 2 siblings, 0 replies; 7+ messages in thread From: zhiwei.liang @ 2026-10-28 20:13 UTC (permalink / raw) To: luca.stefani.ge1 Cc: David Sterba, Chris Mason, Robbie Ko, Filipe Manana, linux-btrfs, linux-kernel, Qu Wenruo [-- Attachment #1.1: Type: text/plain, Size: 559 bytes --] > trim can expose -ERESTARTSYS when the trim loops gets interrupted by > a freezer request. Tested on top of misc-next with the pm_test=freezer reproducer from my patch, 30 freezes during a trim: no -ERESTARTSYS reached userspace, fstrim returned 0 with the partial count every time, and freezing stayed under 30 ms. Tested-by: Zhiwei Liang <zhiwei.liang@zliang.me> For 2/2, I think it wants Fixes: 69313850dce3 and CC: stable@vger.kernel.org # 6.6+, and the changelog could mention the "Unknown error 512" symptom for people searching the log. [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 343 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-10-29 8:57 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-10-28 17:55 [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace Luca Stefani via B4 Relay 2026-10-28 17:55 ` [PATCH 1/2] btrfs: account partially completed discards Luca Stefani via B4 Relay 2026-10-28 21:02 ` Qu Wenruo 2026-10-28 17:55 ` [PATCH 2/2] btrfs: don't report failure when trim is interrupted Luca Stefani via B4 Relay 2026-10-28 21:06 ` Qu Wenruo 2026-10-29 8:56 ` Luca Stefani 2026-10-28 20:13 ` [PATCH 0/2] btrfs: don't expose ERESTARTSYS to userspace zhiwei.liang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®