|
@@ -491,7 +491,6 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg)
|
|
|
struct fstrim_range range;
|
|
|
u64 minlen = ULLONG_MAX;
|
|
|
u64 num_devices = 0;
|
|
|
- u64 total_bytes = btrfs_super_total_bytes(fs_info->super_copy);
|
|
|
int ret;
|
|
|
|
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
@@ -515,11 +514,15 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg)
|
|
|
return -EOPNOTSUPP;
|
|
|
if (copy_from_user(&range, arg, sizeof(range)))
|
|
|
return -EFAULT;
|
|
|
- if (range.start > total_bytes ||
|
|
|
- range.len < fs_info->sb->s_blocksize)
|
|
|
+
|
|
|
+ /*
|
|
|
+ * NOTE: Don't truncate the range using super->total_bytes. Bytenr of
|
|
|
+ * block group is in the logical address space, which can be any
|
|
|
+ * sectorsize aligned bytenr in the range [0, U64_MAX].
|
|
|
+ */
|
|
|
+ if (range.len < fs_info->sb->s_blocksize)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- range.len = min(range.len, total_bytes - range.start);
|
|
|
range.minlen = max(range.minlen, minlen);
|
|
|
ret = btrfs_trim_fs(fs_info, &range);
|
|
|
if (ret < 0)
|