From: Greg Kroah-Hartman Date: Wed, 29 May 2019 18:33:29 +0000 (-0700) Subject: 4.9-stable patches X-Git-Tag: v5.1.6~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f34ffa6737d0224d6a6844caffa0ac269ea32fbd;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch --- diff --git a/queue-4.9/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch b/queue-4.9/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch new file mode 100644 index 00000000000..7af8b967a1f --- /dev/null +++ b/queue-4.9/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch @@ -0,0 +1,96 @@ +From dsterba@suse.com Wed May 29 11:29:35 2019 +From: David Sterba +Date: Wed, 29 May 2019 19:25:45 +0200 +Subject: Revert "btrfs: Honour FITRIM range constraints during free space trim" +To: stable@vger.kernel.org +Cc: David Sterba +Message-ID: <20190529172547.30563-3-dsterba@suse.com> + +From: David Sterba + +This reverts commit 038ec2c13e0d1f7b9d45a081786f18f75b65f11b. + +There is currently no corresponding patch in master due to additional +changes that would be significantly different from plain revert in the +respective stable branch. + +The range argument was not handled correctly and could cause trim to +overlap allocated areas or reach beyond the end of the device. The +address space that fitrim normally operates on is in logical +coordinates, while the discards are done on the physical device extents. +This distinction cannot be made with the current ioctl interface and +caused the confusion. + +The bug depends on the layout of block groups and does not always +happen. The whole-fs trim (run by default by the fstrim tool) is not +affected. + +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/extent-tree.c | 25 ++++++------------------- + 1 file changed, 6 insertions(+), 19 deletions(-) + +--- a/fs/btrfs/extent-tree.c ++++ b/fs/btrfs/extent-tree.c +@@ -11150,9 +11150,9 @@ int btrfs_error_unpin_extent_range(struc + * transaction. + */ + static int btrfs_trim_free_extents(struct btrfs_device *device, +- struct fstrim_range *range, u64 *trimmed) ++ u64 minlen, u64 *trimmed) + { +- u64 start = range->start, len = 0; ++ u64 start = 0, len = 0; + int ret; + + *trimmed = 0; +@@ -11188,8 +11188,8 @@ static int btrfs_trim_free_extents(struc + atomic_inc(&trans->use_count); + spin_unlock(&fs_info->trans_lock); + +- ret = find_free_dev_extent_start(trans, device, range->minlen, +- start, &start, &len); ++ ret = find_free_dev_extent_start(trans, device, minlen, start, ++ &start, &len); + if (trans) + btrfs_put_transaction(trans); + +@@ -11201,16 +11201,6 @@ static int btrfs_trim_free_extents(struc + break; + } + +- /* If we are out of the passed range break */ +- if (start > range->start + range->len - 1) { +- mutex_unlock(&fs_info->chunk_mutex); +- ret = 0; +- break; +- } +- +- start = max(range->start, start); +- len = min(range->len, len); +- + ret = btrfs_issue_discard(device->bdev, start, len, &bytes); + up_read(&fs_info->commit_root_sem); + mutex_unlock(&fs_info->chunk_mutex); +@@ -11221,10 +11211,6 @@ static int btrfs_trim_free_extents(struc + start += len; + *trimmed += bytes; + +- /* We've trimmed enough */ +- if (*trimmed >= range->len) +- break; +- + if (fatal_signal_pending(current)) { + ret = -ERESTARTSYS; + break; +@@ -11309,7 +11295,8 @@ int btrfs_trim_fs(struct btrfs_root *roo + 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, range->minlen, ++ &group_trimmed); + if (ret) { + dev_failed++; + dev_ret = ret; diff --git a/queue-4.9/series b/queue-4.9/series index f3c579f0805..589a896f470 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -19,3 +19,4 @@ ssb-fix-possible-null-pointer-dereference-in-ssb_host_pcmcia_exit.patch at76c50x-usb-don-t-register-led_trigger-if-usb_register_driver-failed.patch perf-tools-no-need-to-include-bitops.h-in-util.h.patch tools-include-adopt-linux-bits.h.patch +revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch