for-5.2-rc4-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAlz/z0wACgkQxWXV+ddt WDt/4g//eS+USsVpHV65AoOC+LWHQFvKHVNX97l53yy7GvINxgCO5+X7MctvCP1P cEhhyGhapTFWinOj2zoMSz+mk1//wkqPsC9KzN+ha1fx0ktj+IKms+xbh3kFsygq dbqLMBHobGpCVV1z7kg+YN0OnG3W90qv/5TqeYhPADBEzEDffXuj+5qEul88J47h n4GP309mJcJwO1SmYOMFTchZDKJJnFMejr+KS+hOvzh3i5C6ZVOLeEs2yksdFvUi X9zeM9sbzshPonzRQVR9xazzW3JKP69rgkz+fo5TLnKqYwXiGN9ObCCjtKm/rck6 pkJbvSmqV6QpX/pBUwdI/8DjgQyrPlfVyVcv5lU960mwya0eCkJYTa95bMC7N4UJ NNfROq9aJHKmct/rHECLsOwRTy2KuAqpX7+Ktjy6Sarw9bvlPwpgBep7PvYR9DXf mC9QHcRTYDCoKR5SF5xzB5lQHVOfWe6dduCugW8BhvO8t3ty+IW8p9WfcNXkTVu8 SQWuxF2Y9uOEuTJMmyw6gbl1KRppg+U95r7vpKKbPFXMrsJDcGy2eUhMHfChwnkO brI2scsAaJg+UMvTjjO/8DVw4qpR9UDZaDgPqsGcFCNIQv65bPlL/UnQD112M2Ba w9FsvwbyI1AgUC0JsslLoHQVcOqHl2DnxFyvtbFTy0zcJK8fPxY= =UByh -----END PGP SIGNATURE----- Merge tag 'for-5.2-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fix from David Sterba: "One regression fix to TRIM ioctl. The range cannot be used as its meaning can be confusing regarding physical and logical addresses. This confusion in code led to potential corruptions when the range overlapped data. The original patch made it to several stable kernels and was promptly reverted, the version for master branch is different due to additional changes but the change is effectively the same" * tag 'for-5.2-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: Always trim all unallocated space in btrfs_trim_free_extents
This commit is contained in:
commit
6fa425a265
|
@ -11137,13 +11137,11 @@ int btrfs_error_unpin_extent_range(struct btrfs_fs_info *fs_info,
|
|||
* it while performing the free space search since we have already
|
||||
* held back allocations.
|
||||
*/
|
||||
static int btrfs_trim_free_extents(struct btrfs_device *device,
|
||||
struct fstrim_range *range, u64 *trimmed)
|
||||
static int btrfs_trim_free_extents(struct btrfs_device *device, u64 *trimmed)
|
||||
{
|
||||
u64 start, len = 0, end = 0;
|
||||
u64 start = SZ_1M, len = 0, end = 0;
|
||||
int ret;
|
||||
|
||||
start = max_t(u64, range->start, SZ_1M);
|
||||
*trimmed = 0;
|
||||
|
||||
/* Discard not supported = nothing to do. */
|
||||
|
@ -11186,22 +11184,6 @@ static int btrfs_trim_free_extents(struct btrfs_device *device,
|
|||
break;
|
||||
}
|
||||
|
||||
/* Keep going until we satisfy minlen or reach end of space */
|
||||
if (len < range->minlen) {
|
||||
mutex_unlock(&fs_info->chunk_mutex);
|
||||
start += len;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If we are out of the passed range break */
|
||||
if (start > range->start + range->len - 1) {
|
||||
mutex_unlock(&fs_info->chunk_mutex);
|
||||
break;
|
||||
}
|
||||
|
||||
start = max(range->start, start);
|
||||
len = min(range->len, len);
|
||||
|
||||
ret = btrfs_issue_discard(device->bdev, start, len,
|
||||
&bytes);
|
||||
if (!ret)
|
||||
|
@ -11216,10 +11198,6 @@ static int btrfs_trim_free_extents(struct btrfs_device *device,
|
|||
start += len;
|
||||
*trimmed += bytes;
|
||||
|
||||
/* We've trimmed enough */
|
||||
if (*trimmed >= range->len)
|
||||
break;
|
||||
|
||||
if (fatal_signal_pending(current)) {
|
||||
ret = -ERESTARTSYS;
|
||||
break;
|
||||
|
@ -11303,7 +11281,7 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)
|
|||
mutex_lock(&fs_info->fs_devices->device_list_mutex);
|
||||
devices = &fs_info->fs_devices->devices;
|
||||
list_for_each_entry(device, devices, dev_list) {
|
||||
ret = btrfs_trim_free_extents(device, range, &group_trimmed);
|
||||
ret = btrfs_trim_free_extents(device, &group_trimmed);
|
||||
if (ret) {
|
||||
dev_failed++;
|
||||
dev_ret = ret;
|
||||
|
|
Loading…
Reference in a new issue