]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 May 2019 18:01:13 +0000 (20:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 May 2019 18:01:13 +0000 (20:01 +0200)
added patches:
btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch
md-raid-raid5-preserve-the-writeback-action-after-the-parity-check.patch
revert-don-t-jump-to-compute_result-state-from-check_result-state.patch

queue-4.9/btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch [new file with mode: 0644]
queue-4.9/md-raid-raid5-preserve-the-writeback-action-after-the-parity-check.patch [new file with mode: 0644]
queue-4.9/revert-don-t-jump-to-compute_result-state-from-check_result-state.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch b/queue-4.9/btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch
new file mode 100644 (file)
index 0000000..a680b2b
--- /dev/null
@@ -0,0 +1,91 @@
+From c2d1b3aae33605a61cbab445d8ae1c708ccd2698 Mon Sep 17 00:00:00 2001
+From: Nikolay Borisov <nborisov@suse.com>
+Date: Mon, 25 Mar 2019 14:31:21 +0200
+Subject: btrfs: Honour FITRIM range constraints during free space trim
+
+From: Nikolay Borisov <nborisov@suse.com>
+
+commit c2d1b3aae33605a61cbab445d8ae1c708ccd2698 upstream.
+
+Up until now trimming the freespace was done irrespective of what the
+arguments of the FITRIM ioctl were. For example fstrim's -o/-l arguments
+will be entirely ignored. Fix it by correctly handling those paramter.
+This requires breaking if the found freespace extent is after the end of
+the passed range as well as completing trim after trimming
+fstrim_range::len bytes.
+
+Fixes: 499f377f49f0 ("btrfs: iterate over unused chunk space in FITRIM")
+CC: stable@vger.kernel.org # 4.4+
+Signed-off-by: Nikolay Borisov <nborisov@suse.com>
+Reviewed-by: David Sterba <dsterba@suse.com>
+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, 19 insertions(+), 6 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,
+-                                 u64 minlen, u64 *trimmed)
++                                 struct fstrim_range *range, u64 *trimmed)
+ {
+-      u64 start = 0, len = 0;
++      u64 start = range->start, 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, minlen, start,
+-                                               &start, &len);
++              ret = find_free_dev_extent_start(trans, device, range->minlen,
++                                               start, &start, &len);
+               if (trans)
+                       btrfs_put_transaction(trans);
+@@ -11201,6 +11201,16 @@ 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);
+@@ -11211,6 +11221,10 @@ 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;
+@@ -11295,8 +11309,7 @@ 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->minlen,
+-                                            &group_trimmed);
++              ret = btrfs_trim_free_extents(device, range, &group_trimmed);
+               if (ret) {
+                       dev_failed++;
+                       dev_ret = ret;
diff --git a/queue-4.9/md-raid-raid5-preserve-the-writeback-action-after-the-parity-check.patch b/queue-4.9/md-raid-raid5-preserve-the-writeback-action-after-the-parity-check.patch
new file mode 100644 (file)
index 0000000..291f8fd
--- /dev/null
@@ -0,0 +1,52 @@
+From b2176a1dfb518d870ee073445d27055fea64dfb8 Mon Sep 17 00:00:00 2001
+From: Nigel Croxon <ncroxon@redhat.com>
+Date: Tue, 16 Apr 2019 09:50:09 -0700
+Subject: md/raid: raid5 preserve the writeback action after the parity check
+
+From: Nigel Croxon <ncroxon@redhat.com>
+
+commit b2176a1dfb518d870ee073445d27055fea64dfb8 upstream.
+
+The problem is that any 'uptodate' vs 'disks' check is not precise
+in this path. Put a "WARN_ON(!test_bit(R5_UPTODATE, &dev->flags)" on the
+device that might try to kick off writes and then skip the action.
+Better to prevent the raid driver from taking unexpected action *and* keep
+the system alive vs killing the machine with BUG_ON.
+
+Note: fixed warning reported by kbuild test robot <lkp@intel.com>
+
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
+Signed-off-by: Song Liu <songliubraving@fb.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/raid5.c |   10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3878,7 +3878,7 @@ static void handle_parity_checks6(struct
+               /* now write out any block on a failed drive,
+                * or P or Q if they were recomputed
+                */
+-              BUG_ON(s->uptodate < disks - 1); /* We don't need Q to recover */
++              dev = NULL;
+               if (s->failed == 2) {
+                       dev = &sh->dev[s->failed_num[1]];
+                       s->locked++;
+@@ -3903,6 +3903,14 @@ static void handle_parity_checks6(struct
+                       set_bit(R5_LOCKED, &dev->flags);
+                       set_bit(R5_Wantwrite, &dev->flags);
+               }
++              if (WARN_ONCE(dev && !test_bit(R5_UPTODATE, &dev->flags),
++                            "%s: disk%td not up to date\n",
++                            mdname(conf->mddev),
++                            dev - (struct r5dev *) &sh->dev)) {
++                      clear_bit(R5_LOCKED, &dev->flags);
++                      clear_bit(R5_Wantwrite, &dev->flags);
++                      s->locked--;
++              }
+               clear_bit(STRIPE_DEGRADED, &sh->state);
+               set_bit(STRIPE_INSYNC, &sh->state);
diff --git a/queue-4.9/revert-don-t-jump-to-compute_result-state-from-check_result-state.patch b/queue-4.9/revert-don-t-jump-to-compute_result-state-from-check_result-state.patch
new file mode 100644 (file)
index 0000000..5a7dd23
--- /dev/null
@@ -0,0 +1,54 @@
+From a25d8c327bb41742dbd59f8c545f59f3b9c39983 Mon Sep 17 00:00:00 2001
+From: Song Liu <songliubraving@fb.com>
+Date: Tue, 16 Apr 2019 09:34:21 -0700
+Subject: Revert "Don't jump to compute_result state from check_result state"
+
+From: Song Liu <songliubraving@fb.com>
+
+commit a25d8c327bb41742dbd59f8c545f59f3b9c39983 upstream.
+
+This reverts commit 4f4fd7c5798bbdd5a03a60f6269cf1177fbd11ef.
+
+Cc: Dan Williams <dan.j.williams@intel.com>
+Cc: Nigel Croxon <ncroxon@redhat.com>
+Cc: Xiao Ni <xni@redhat.com>
+Signed-off-by: Song Liu <songliubraving@fb.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/raid5.c |   19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3914,15 +3914,26 @@ static void handle_parity_checks6(struct
+       case check_state_check_result:
+               sh->check_state = check_state_idle;
+-              if (s->failed > 1)
+-                      break;
+               /* handle a successful check operation, if parity is correct
+                * we are done.  Otherwise update the mismatch count and repair
+                * parity if !MD_RECOVERY_CHECK
+                */
+               if (sh->ops.zero_sum_result == 0) {
+-                      /* Any parity checked was correct */
+-                      set_bit(STRIPE_INSYNC, &sh->state);
++                      /* both parities are correct */
++                      if (!s->failed)
++                              set_bit(STRIPE_INSYNC, &sh->state);
++                      else {
++                              /* in contrast to the raid5 case we can validate
++                               * parity, but still have a failure to write
++                               * back
++                               */
++                              sh->check_state = check_state_compute_result;
++                              /* Returning at this point means that we may go
++                               * off and bring p and/or q uptodate again so
++                               * we make sure to check zero_sum_result again
++                               * to verify if p or q need writeback
++                               */
++                      }
+               } else {
+                       atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches);
+                       if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery))
index a6fd4e88884461a9621df68dde675a535eb42911..b185dc7efa0be5a52b4b4a476e6ada068ba1566b 100644 (file)
@@ -48,3 +48,6 @@ kvm-arm-arm64-ensure-vcpu-target-is-unset-on-reset-f.patch
 power-supply-sysfs-prevent-endless-uevent-loop-with-.patch
 ufs-fix-braino-in-ufs_get_inode_gid-for-solaris-ufs-.patch
 perf-bench-numa-add-define-for-rusage_thread-if-not-.patch
+revert-don-t-jump-to-compute_result-state-from-check_result-state.patch
+md-raid-raid5-preserve-the-writeback-action-after-the-parity-check.patch
+btrfs-honour-fitrim-range-constraints-during-free-space-trim.patch