* [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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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
0 siblings, 0 replies; 6+ 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] 6+ messages in thread
end of thread, other threads:[~2026-10-28 21:07 UTC | newest]
Thread overview: 6+ 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-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®