]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Oct 2024 14:33:38 +0000 (16:33 +0200)
commit 3368597206dc3c6c3c2247ee146beada14c67380 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/extent-tree.c
fs/btrfs/ioctl.c

index 55be8a7f0bb18866dc560123a30e16192cbc60c3..79dd2d9a62d9df0e5ba6208d1395b6d4916e64cf 100644 (file)
@@ -6426,13 +6426,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 c1b0556e403683ecaef8e959d18b15b15aaf592b..4a30f34bc8300abd5f1964474346a2557cf46992 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(u8 *uuid)