Commit 1cc4ada4 authored by jinbaohong's avatar jinbaohong Committed by David Sterba
Browse files

btrfs: preserve first error in btrfs_trim_fs()



When multiple block groups or devices fail during trim, preserve the
first error encountered rather than the last one. The first error is
typically more useful for debugging as it represents the original
failure, while subsequent errors may be cascading effects.

Signed-off-by: default avatarRobbie Ko <robbieko@synology.com>
Signed-off-by: default avatarjinbaohong <jinbaohong@synology.com>
Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 912d1c66
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -6608,7 +6608,7 @@ static int btrfs_trim_free_extents(struct btrfs_device *device, u64 *trimmed)
 * 2) trimming the unallocated space on each device
 *
 * This will also continue trimming even if a block group or device encounters
 * an error.  The return value will be the last error, or 0 if nothing bad
 * an error.  The return value will be the first error, or 0 if nothing bad
 * happens.
 */
int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
@@ -6653,6 +6653,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
				ret = btrfs_cache_block_group(cache, true);
				if (ret) {
					bg_failed++;
					if (!bg_ret)
						bg_ret = ret;
					continue;
				}
@@ -6666,6 +6667,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
			trimmed += group_trimmed;
			if (ret) {
				bg_failed++;
				if (!bg_ret)
					bg_ret = ret;
				continue;
			}
@@ -6674,7 +6676,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)

	if (bg_failed)
		btrfs_warn(fs_info,
			"failed to trim %llu block group(s), last error %d",
			"failed to trim %llu block group(s), first error %d",
			bg_failed, bg_ret);

	mutex_lock(&fs_devices->device_list_mutex);
@@ -6687,6 +6689,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
		trimmed += group_trimmed;
		if (ret) {
			dev_failed++;
			if (!dev_ret)
				dev_ret = ret;
			continue;
		}
@@ -6695,7 +6698,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)

	if (dev_failed)
		btrfs_warn(fs_info,
			"failed to trim %llu device(s), last error %d",
			"failed to trim %llu device(s), first error %d",
			dev_failed, dev_ret);
	range->len = trimmed;
	if (bg_ret)