mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [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®