]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 May 2019 18:33:38 +0000 (11:33 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 May 2019 18:33:38 +0000 (11:33 -0700)
added patches:
revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch

queue-4.14/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch b/queue-4.14/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch
new file mode 100644 (file)
index 0000000..a3ff30f
--- /dev/null
@@ -0,0 +1,96 @@
+From dsterba@suse.com  Wed May 29 11:30:12 2019
+From: David Sterba <dsterba@suse.com>
+Date: Wed, 29 May 2019 19:25:43 +0200
+Subject: Revert "btrfs: Honour FITRIM range constraints during free space trim"
+To: stable@vger.kernel.org
+Cc: David Sterba <dsterba@suse.com>
+Message-ID: <20190529172547.30563-1-dsterba@suse.com>
+
+From: David Sterba <dsterba@suse.com>
+
+This reverts commit b327ff8a9b5767ce39db650d468fb124b48974a5.
+
+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 <dsterba@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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
+@@ -11057,9 +11057,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;
+@@ -11095,8 +11095,8 @@ static int btrfs_trim_free_extents(struc
+                       refcount_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);
+@@ -11108,16 +11108,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);
+@@ -11128,10 +11118,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;
+@@ -11215,7 +11201,8 @@ int btrfs_trim_fs(struct btrfs_fs_info *
+       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;
index 2096f903367796ac02090a05315b920891df2683..bdc8d157ef00fbbaa4b87ada1ce8dd0a629b489e 100644 (file)
@@ -32,3 +32,4 @@ bpf-devmap-fix-use-after-free-read-in-__dev_map_entry_free.patch
 batman-adv-mcast-fix-multicast-tt-tvlv-worker-locking.patch
 at76c50x-usb-don-t-register-led_trigger-if-usb_register_driver-failed.patch
 net-erspan-fix-use-after-free.patch
+revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch