btrfs: always update fstrim_range on failure in FITRIM ioctl
authorLuca Stefani <luca.stefani.ge1@gmail.com>
Mon, 2 Sep 2024 11:10:53 +0000 (13:10 +0200)
committerDavid Sterba <dsterba@suse.com>
Tue, 10 Sep 2024 14:51:21 +0000 (16:51 +0200)
Even in case of failure we could've discarded some data and userspace
should be made aware of it, so copy fstrim_range to userspace
regardless.

Also make sure to update the trimmed bytes amount even if
btrfs_trim_free_extents fails.

CC: stable@vger.kernel.org # 5.15+
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Luca Stefani <luca.stefani.ge1@gmail.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c
fs/btrfs/ioctl.c

index feec49e..a596632 100644 (file)
@@ -6551,13 +6551,13 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
                        continue;
 
                ret = btrfs_trim_free_extents(device, &group_trimmed);
+
+               trimmed += group_trimmed;
                if (ret) {
                        dev_failed++;
                        dev_ret = ret;
                        break;
                }
-
-               trimmed += group_trimmed;
        }
        mutex_unlock(&fs_devices->device_list_mutex);
 
index ee01cc8..8537eb9 100644 (file)
@@ -543,13 +543,11 @@ static noinline int btrfs_ioctl_fitrim(struct btrfs_fs_info *fs_info,
 
        range.minlen = max(range.minlen, minlen);
        ret = btrfs_trim_fs(fs_info, &range);
-       if (ret < 0)
-               return ret;
 
        if (copy_to_user(arg, &range, sizeof(range)))
                return -EFAULT;
 
-       return 0;
+       return ret;
 }
 
 int __pure btrfs_is_empty_uuid(const u8 *uuid)