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

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

diff --git a/queue-5.0/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch b/queue-5.0/revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch
new file mode 100644 (file)
index 0000000..14ba99f
--- /dev/null
@@ -0,0 +1,96 @@
+From dsterba@suse.com  Wed May 29 11:32:07 2019
+From: David Sterba <dsterba@suse.com>
+Date: Wed, 29 May 2019 19:25:46 +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-4-dsterba@suse.com>
+
+From: David Sterba <dsterba@suse.com>
+
+This reverts commit b9ee627187491547791aacf96d4dd8f4d9afbf1c.
+
+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
+@@ -11191,9 +11191,9 @@ int btrfs_error_unpin_extent_range(struc
+  * held back allocations.
+  */
+ 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;
+@@ -11236,8 +11236,8 @@ static int btrfs_trim_free_extents(struc
+               if (!trans)
+                       up_read(&fs_info->commit_root_sem);
+-              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) {
+                       up_read(&fs_info->commit_root_sem);
+                       btrfs_put_transaction(trans);
+@@ -11250,16 +11250,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);
+               mutex_unlock(&fs_info->chunk_mutex);
+@@ -11269,10 +11259,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;
+@@ -11356,7 +11342,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 9f41c91575d55f91e9bd3fb1f01143d644559c86..b6a5bfe181315e7205f1ad1b43b8adf2ef445720 100644 (file)
@@ -38,3 +38,4 @@ batman-adv-mcast-fix-multicast-tt-tvlv-worker-locking.patch
 at76c50x-usb-don-t-register-led_trigger-if-usb_register_driver-failed.patch
 acct_on-don-t-mess-with-freeze-protection.patch
 netfilter-ctnetlink-resolve-conntrack-l3-protocol-flush-regression.patch
+revert-btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch