diff options
author | Thorsten Leemhuis <fedora@leemhuis.info> | 2019-03-05 21:46:04 +0100 |
---|---|---|
committer | Thorsten Leemhuis <fedora@leemhuis.info> | 2019-03-05 21:46:04 +0100 |
commit | 713e493f4d1efa95292ebf4fa3495e53e1eab8eb (patch) | |
tree | 07d7163bb55fdbe2eeeea094f758847f4520d2a8 | |
parent | 3964a86963f308cd8166ebffcabe1c882f3f8b7a (diff) | |
parent | 225f678346a5e7dcb725897fd36ae610185c6b28 (diff) | |
download | kernel-713e493f4d1efa95292ebf4fa3495e53e1eab8eb.tar.gz kernel-713e493f4d1efa95292ebf4fa3495e53e1eab8eb.tar.xz kernel-713e493f4d1efa95292ebf4fa3495e53e1eab8eb.zip |
merge originkernel-4.20.14-150.vanilla.knurd.1.fc28
-rw-r--r-- | 0001-Revert-drm-i915-fbdev-Actually-configure-untiled-dis.patch | 60 | ||||
-rw-r--r-- | configs/fedora/generic/CONFIG_GCC_PLUGIN_STACKLEAK | 2 | ||||
-rw-r--r-- | kernel-aarch64-debug.config | 2 | ||||
-rw-r--r-- | kernel-aarch64.config | 2 | ||||
-rw-r--r-- | kernel-armv7hl-debug.config | 2 | ||||
-rw-r--r-- | kernel-armv7hl-lpae-debug.config | 2 | ||||
-rw-r--r-- | kernel-armv7hl-lpae.config | 2 | ||||
-rw-r--r-- | kernel-armv7hl.config | 2 | ||||
-rw-r--r-- | kernel-i686-debug.config | 2 | ||||
-rw-r--r-- | kernel-i686.config | 2 | ||||
-rw-r--r-- | kernel-ppc64le-debug.config | 2 | ||||
-rw-r--r-- | kernel-ppc64le.config | 2 | ||||
-rw-r--r-- | kernel-s390x-debug.config | 2 | ||||
-rw-r--r-- | kernel-s390x.config | 2 | ||||
-rw-r--r-- | kernel-x86_64-debug.config | 2 | ||||
-rw-r--r-- | kernel-x86_64.config | 2 | ||||
-rw-r--r-- | kernel.spec | 15 | ||||
-rw-r--r-- | nfsv4.1-avoid-false-retries.patch | 267 | ||||
-rw-r--r-- | sources | 2 |
19 files changed, 357 insertions, 17 deletions
diff --git a/0001-Revert-drm-i915-fbdev-Actually-configure-untiled-dis.patch b/0001-Revert-drm-i915-fbdev-Actually-configure-untiled-dis.patch new file mode 100644 index 000000000..b6fa0783c --- /dev/null +++ b/0001-Revert-drm-i915-fbdev-Actually-configure-untiled-dis.patch @@ -0,0 +1,60 @@ +From e90ac616e4b1d49ec9092086b0e10108df12157d Mon Sep 17 00:00:00 2001 +From: Fedora Kernel Team <kernel-team@fedoraproject.org> +Date: Tue, 5 Mar 2019 12:56:35 -0600 +Subject: [PATCH] Revert drm/i915/fbdev: Actually configure untiled displays + +--- + drivers/gpu/drm/i915/intel_fbdev.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c +index e0c02a9..9e2e998 100644 +--- a/drivers/gpu/drm/i915/intel_fbdev.c ++++ b/drivers/gpu/drm/i915/intel_fbdev.c +@@ -336,8 +336,8 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper, + bool *enabled, int width, int height) + { + struct drm_i915_private *dev_priv = to_i915(fb_helper->dev); ++ unsigned long conn_configured, conn_seq, mask; + unsigned int count = min(fb_helper->connector_count, BITS_PER_LONG); +- unsigned long conn_configured, conn_seq; + int i, j; + bool *save_enabled; + bool fallback = true, ret = true; +@@ -355,9 +355,10 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper, + drm_modeset_backoff(&ctx); + + memcpy(save_enabled, enabled, count); +- conn_seq = GENMASK(count - 1, 0); ++ mask = GENMASK(count - 1, 0); + conn_configured = 0; + retry: ++ conn_seq = conn_configured; + for (i = 0; i < count; i++) { + struct drm_fb_helper_connector *fb_conn; + struct drm_connector *connector; +@@ -370,8 +371,7 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper, + if (conn_configured & BIT(i)) + continue; + +- /* First pass, only consider tiled connectors */ +- if (conn_seq == GENMASK(count - 1, 0) && !connector->has_tile) ++ if (conn_seq == 0 && !connector->has_tile) + continue; + + if (connector->status == connector_status_connected) +@@ -475,10 +475,8 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper, + conn_configured |= BIT(i); + } + +- if (conn_configured != conn_seq) { /* repeat until no more are found */ +- conn_seq = conn_configured; ++ if ((conn_configured & mask) != mask && conn_configured != conn_seq) + goto retry; +- } + + /* + * If the BIOS didn't enable everything it could, fall back to have the +-- +2.20.1 + diff --git a/configs/fedora/generic/CONFIG_GCC_PLUGIN_STACKLEAK b/configs/fedora/generic/CONFIG_GCC_PLUGIN_STACKLEAK index 66f7f1f22..701c49771 100644 --- a/configs/fedora/generic/CONFIG_GCC_PLUGIN_STACKLEAK +++ b/configs/fedora/generic/CONFIG_GCC_PLUGIN_STACKLEAK @@ -1 +1 @@ -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set diff --git a/kernel-aarch64-debug.config b/kernel-aarch64-debug.config index fa6dab204..94d386a53 100644 --- a/kernel-aarch64-debug.config +++ b/kernel-aarch64-debug.config @@ -1873,7 +1873,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-aarch64.config b/kernel-aarch64.config index 08fbdda85..d711a9464 100644 --- a/kernel-aarch64.config +++ b/kernel-aarch64.config @@ -1856,7 +1856,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-armv7hl-debug.config b/kernel-armv7hl-debug.config index d746bdca5..c7c9e9f81 100644 --- a/kernel-armv7hl-debug.config +++ b/kernel-armv7hl-debug.config @@ -1971,7 +1971,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-armv7hl-lpae-debug.config b/kernel-armv7hl-lpae-debug.config index d4564b82c..bc4e2b4e1 100644 --- a/kernel-armv7hl-lpae-debug.config +++ b/kernel-armv7hl-lpae-debug.config @@ -1878,7 +1878,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-armv7hl-lpae.config b/kernel-armv7hl-lpae.config index 068f65f01..a6122298f 100644 --- a/kernel-armv7hl-lpae.config +++ b/kernel-armv7hl-lpae.config @@ -1862,7 +1862,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-armv7hl.config b/kernel-armv7hl.config index ab2d22c0d..a40eb7889 100644 --- a/kernel-armv7hl.config +++ b/kernel-armv7hl.config @@ -1955,7 +1955,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-i686-debug.config b/kernel-i686-debug.config index a6bbf4c53..b7d469a29 100644 --- a/kernel-i686-debug.config +++ b/kernel-i686-debug.config @@ -1704,7 +1704,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-i686.config b/kernel-i686.config index 266474f3f..9c3e7b45d 100644 --- a/kernel-i686.config +++ b/kernel-i686.config @@ -1686,7 +1686,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-ppc64le-debug.config b/kernel-ppc64le-debug.config index f24d84ca9..307481422 100644 --- a/kernel-ppc64le-debug.config +++ b/kernel-ppc64le-debug.config @@ -1571,7 +1571,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-ppc64le.config b/kernel-ppc64le.config index 769889143..db9aab078 100644 --- a/kernel-ppc64le.config +++ b/kernel-ppc64le.config @@ -1553,7 +1553,7 @@ CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-s390x-debug.config b/kernel-s390x-debug.config index 2382d00b5..dbe2f92f7 100644 --- a/kernel-s390x-debug.config +++ b/kernel-s390x-debug.config @@ -1549,7 +1549,7 @@ CONFIG_GAMEPORT_L4=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-s390x.config b/kernel-s390x.config index 9747bd48a..4e5522877 100644 --- a/kernel-s390x.config +++ b/kernel-s390x.config @@ -1531,7 +1531,7 @@ CONFIG_GAMEPORT_L4=m CONFIG_GAMEPORT_NS558=m # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-x86_64-debug.config b/kernel-x86_64-debug.config index 05518c364..3876f701c 100644 --- a/kernel-x86_64-debug.config +++ b/kernel-x86_64-debug.config @@ -1748,7 +1748,7 @@ CONFIG_GAMEPORT_NS558=m # CONFIG_GART_IOMMU is not set # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel-x86_64.config b/kernel-x86_64.config index e07bb90cb..e70e071e2 100644 --- a/kernel-x86_64.config +++ b/kernel-x86_64.config @@ -1730,7 +1730,7 @@ CONFIG_GAMEPORT_NS558=m # CONFIG_GART_IOMMU is not set # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT is not set -CONFIG_GCC_PLUGIN_STACKLEAK=y +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_GCC_PLUGIN_STRUCTLEAK is not set CONFIG_GCC_PLUGINS=y # CONFIG_GCOV_KERNEL is not set diff --git a/kernel.spec b/kernel.spec index 15f566ab7..85464c529 100644 --- a/kernel.spec +++ b/kernel.spec @@ -58,7 +58,7 @@ Summary: The Linux kernel %define stable_rc 0 # Do we have a -stable update to apply? -%define stable_update 13 +%define stable_update 14 # Set rpm version accordingly %if 0%{?stable_update} %define stablerev %{stable_update} @@ -658,6 +658,12 @@ Patch508: 0001-drm-nouveau-register-backlight-on-pascal-and-newer.patch # CVE-2019-8980 rhbz 1679972 1679974 Patch510: CVE-2019-8980.patch +# rhbz 1683382 +Patch511: nfsv4.1-avoid-false-retries.patch + +# https://bugs.freedesktop.org/show_bug.cgi?id=109806 +Patch512: 0001-Revert-drm-i915-fbdev-Actually-configure-untiled-dis.patch + # END OF PATCH DEFINITIONS %endif @@ -1946,6 +1952,13 @@ fi # # %changelog +* Tue Mar 05 2019 Justin M. Forbes <jforbes@fedoraproject.org> - 4.20.14-100 +- Linux v4.20.14 + +* Wed Feb 27 2019 Justin M. Forbes <jforbes@fedoraproject.org> - 4.20.13-100 +- Linux v4.20.13 +- Fix for NFS issue (rhbz 1683382) + * Mon Feb 25 2019 Justin M. Forbes <jforbes@fedoraproject.org> - 4.20.12-100 - Linux v4.20.12 diff --git a/nfsv4.1-avoid-false-retries.patch b/nfsv4.1-avoid-false-retries.patch new file mode 100644 index 000000000..b136df0e7 --- /dev/null +++ b/nfsv4.1-avoid-false-retries.patch @@ -0,0 +1,267 @@ +From d72ad5fe4c2206458d127cc31e690318cf2e2731 Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust@hammerspace.com>
+Date: Wed, 20 Jun 2018 17:53:34 -0400
+Subject: [PATCH] NFSv4.1: Avoid false retries when RPC calls are interrupted
+
+A 'false retry' in NFSv4.1 occurs when the client attempts to transmit a
+new RPC call using a slot+sequence number combination that references an
+already cached one. Currently, the Linux NFS client will do this if a
+user process interrupts an RPC call that is in progress.
+The problem with doing so is that we defeat the main mechanism used by
+the server to differentiate between a new call and a replayed one. Even
+if the server is able to perfectly cache the arguments of the old call,
+it cannot know if the client intended to replay or send a new call.
+
+The obvious fix is to bump the sequence number pre-emptively if an
+RPC call is interrupted, but in order to deal with the corner cases
+where the interrupted call is not actually received and processed by
+the server, we need to interpret the error NFS4ERR_SEQ_MISORDERED
+as a sign that we need to either wait or locate a correct sequence
+number that lies between the value we sent, and the last value that
+was acked by a SEQUENCE call on that slot.
+
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+---
+ fs/nfs/nfs4proc.c | 105 ++++++++++++++++++++-----------------------
+ fs/nfs/nfs4session.c | 5 ++-
+ fs/nfs/nfs4session.h | 5 ++-
+ 3 files changed, 55 insertions(+), 60 deletions(-)
+
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 867457d..c11e059 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -730,13 +730,25 @@ static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res)
+ res->sr_slot = NULL;
+ }
+
++static void nfs4_slot_sequence_record_sent(struct nfs4_slot *slot,
++ u32 seqnr)
++{
++ if ((s32)(seqnr - slot->seq_nr_highest_sent) > 0)
++ slot->seq_nr_highest_sent = seqnr;
++}
++static void nfs4_slot_sequence_acked(struct nfs4_slot *slot,
++ u32 seqnr)
++{
++ slot->seq_nr_highest_sent = seqnr;
++ slot->seq_nr_last_acked = seqnr;
++}
++
+ static int nfs41_sequence_process(struct rpc_task *task,
+ struct nfs4_sequence_res *res)
+ {
+ struct nfs4_session *session;
+ struct nfs4_slot *slot = res->sr_slot;
+ struct nfs_client *clp;
+- bool interrupted = false;
+ int ret = 1;
+
+ if (slot == NULL)
+@@ -747,16 +759,12 @@ static int nfs41_sequence_process(struct rpc_task *task,
+
+ session = slot->table->session;
+
+- if (slot->interrupted) {
+- if (res->sr_status != -NFS4ERR_DELAY)
+- slot->interrupted = 0;
+- interrupted = true;
+- }
+-
+ trace_nfs4_sequence_done(session, res);
+ /* Check the SEQUENCE operation status */
+ switch (res->sr_status) {
+ case 0:
++ /* Mark this sequence number as having been acked */
++ nfs4_slot_sequence_acked(slot, slot->seq_nr);
+ /* Update the slot's sequence and clientid lease timer */
+ slot->seq_done = 1;
+ clp = session->clp;
+@@ -771,9 +779,9 @@ static int nfs41_sequence_process(struct rpc_task *task,
+ * sr_status remains 1 if an RPC level error occurred.
+ * The server may or may not have processed the sequence
+ * operation..
+- * Mark the slot as having hosted an interrupted RPC call.
+ */
+- slot->interrupted = 1;
++ nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
++ slot->seq_done = 1;
+ goto out;
+ case -NFS4ERR_DELAY:
+ /* The server detected a resend of the RPC call and
+@@ -784,6 +792,7 @@ static int nfs41_sequence_process(struct rpc_task *task,
+ __func__,
+ slot->slot_nr,
+ slot->seq_nr);
++ nfs4_slot_sequence_acked(slot, slot->seq_nr);
+ goto out_retry;
+ case -NFS4ERR_RETRY_UNCACHED_REP:
+ case -NFS4ERR_SEQ_FALSE_RETRY:
+@@ -791,6 +800,7 @@ static int nfs41_sequence_process(struct rpc_task *task,
+ * The server thinks we tried to replay a request.
+ * Retry the call after bumping the sequence ID.
+ */
++ nfs4_slot_sequence_acked(slot, slot->seq_nr);
+ goto retry_new_seq;
+ case -NFS4ERR_BADSLOT:
+ /*
+@@ -801,21 +811,28 @@ static int nfs41_sequence_process(struct rpc_task *task,
+ goto session_recover;
+ goto retry_nowait;
+ case -NFS4ERR_SEQ_MISORDERED:
++ nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
+ /*
+- * Was the last operation on this sequence interrupted?
+- * If so, retry after bumping the sequence number.
++ * Were one or more calls using this slot interrupted?
++ * If the server never received the request, then our
++ * transmitted slot sequence number may be too high.
+ */
+- if (interrupted)
+- goto retry_new_seq;
+- /*
+- * Could this slot have been previously retired?
+- * If so, then the server may be expecting seq_nr = 1!
+- */
+- if (slot->seq_nr != 1) {
+- slot->seq_nr = 1;
++ if ((s32)(slot->seq_nr - slot->seq_nr_last_acked) > 1) {
++ slot->seq_nr--;
+ goto retry_nowait;
+ }
+- goto session_recover;
++ /*
++ * RFC5661:
++ * A retry might be sent while the original request is
++ * still in progress on the replier. The replier SHOULD
++ * deal with the issue by returning NFS4ERR_DELAY as the
++ * reply to SEQUENCE or CB_SEQUENCE operation, but
++ * implementations MAY return NFS4ERR_SEQ_MISORDERED.
++ *
++ * Restart the search after a delay.
++ */
++ slot->seq_nr = slot->seq_nr_highest_sent;
++ goto out_retry;
+ default:
+ /* Just update the slot sequence no. */
+ slot->seq_done = 1;
+@@ -906,17 +923,6 @@ static const struct rpc_call_ops nfs41_call_sync_ops = {
+ .rpc_call_done = nfs41_call_sync_done,
+ };
+
+-static void
+-nfs4_sequence_process_interrupted(struct nfs_client *client,
+- struct nfs4_slot *slot, struct rpc_cred *cred)
+-{
+- struct rpc_task *task;
+-
+- task = _nfs41_proc_sequence(client, cred, slot, true);
+- if (!IS_ERR(task))
+- rpc_put_task_async(task);
+-}
+-
+ #else /* !CONFIG_NFS_V4_1 */
+
+ static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
+@@ -937,14 +943,6 @@ int nfs4_sequence_done(struct rpc_task *task,
+ }
+ EXPORT_SYMBOL_GPL(nfs4_sequence_done);
+
+-static void
+-nfs4_sequence_process_interrupted(struct nfs_client *client,
+- struct nfs4_slot *slot, struct rpc_cred *cred)
+-{
+- WARN_ON_ONCE(1);
+- slot->interrupted = 0;
+-}
+-
+ #endif /* !CONFIG_NFS_V4_1 */
+
+ static
+@@ -982,26 +980,19 @@ int nfs4_setup_sequence(struct nfs_client *client,
+ task->tk_timeout = 0;
+ }
+
+- for (;;) {
+- spin_lock(&tbl->slot_tbl_lock);
+- /* The state manager will wait until the slot table is empty */
+- if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
+- goto out_sleep;
+-
+- slot = nfs4_alloc_slot(tbl);
+- if (IS_ERR(slot)) {
+- /* Try again in 1/4 second */
+- if (slot == ERR_PTR(-ENOMEM))
+- task->tk_timeout = HZ >> 2;
+- goto out_sleep;
+- }
+- spin_unlock(&tbl->slot_tbl_lock);
++ spin_lock(&tbl->slot_tbl_lock);
++ /* The state manager will wait until the slot table is empty */
++ if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
++ goto out_sleep;
+
+- if (likely(!slot->interrupted))
+- break;
+- nfs4_sequence_process_interrupted(client,
+- slot, task->tk_msg.rpc_cred);
++ slot = nfs4_alloc_slot(tbl);
++ if (IS_ERR(slot)) {
++ /* Try again in 1/4 second */
++ if (slot == ERR_PTR(-ENOMEM))
++ task->tk_timeout = HZ >> 2;
++ goto out_sleep;
+ }
++ spin_unlock(&tbl->slot_tbl_lock);
+
+ nfs4_sequence_attach_slot(args, res, slot);
+
+diff --git a/fs/nfs/nfs4session.c b/fs/nfs/nfs4session.c
+index 769b856..fdb75da 100644
+--- a/fs/nfs/nfs4session.c
++++ b/fs/nfs/nfs4session.c
+@@ -110,6 +110,8 @@ static struct nfs4_slot *nfs4_new_slot(struct nfs4_slot_table *tbl,
+ slot->table = tbl;
+ slot->slot_nr = slotid;
+ slot->seq_nr = seq_init;
++ slot->seq_nr_highest_sent = seq_init;
++ slot->seq_nr_last_acked = seq_init - 1;
+ }
+ return slot;
+ }
+@@ -276,7 +278,8 @@ static void nfs4_reset_slot_table(struct nfs4_slot_table *tbl,
+ p = &tbl->slots;
+ while (*p) {
+ (*p)->seq_nr = ivalue;
+- (*p)->interrupted = 0;
++ (*p)->seq_nr_highest_sent = ivalue;
++ (*p)->seq_nr_last_acked = ivalue - 1;
+ p = &(*p)->next;
+ }
+ tbl->highest_used_slotid = NFS4_NO_SLOT;
+diff --git a/fs/nfs/nfs4session.h b/fs/nfs/nfs4session.h
+index 3c550f2..230509b 100644
+--- a/fs/nfs/nfs4session.h
++++ b/fs/nfs/nfs4session.h
+@@ -23,8 +23,9 @@ struct nfs4_slot {
+ unsigned long generation;
+ u32 slot_nr;
+ u32 seq_nr;
+- unsigned int interrupted : 1,
+- privileged : 1,
++ u32 seq_nr_last_acked;
++ u32 seq_nr_highest_sent;
++ unsigned int privileged : 1,
+ seq_done : 1;
+ };
+
+--
+2.20.1
+
+--
+Trond Myklebust
+Linux NFS client maintainer, Hammerspace
+trond.myklebust@hammerspace.com
+
+
+
@@ -1,2 +1,2 @@ SHA512 (linux-4.20.tar.xz) = e282399beea5da539701aed2bc131abd5bc74a970dcd344163e9d295106dfd700180e672ed546ae5e55bc6b9ac95efd5ca1de2039015c1b7a6fc9c01ea6583d4 -SHA512 (patch-4.20.13.xz) = 35e946071c985bc14643cfba7c717377921c71e89b0b4fa37792e176b4588953f582f426f3bf61bbe58c4f9c8869179829fd1956174ab743493098adbf6d9510 +SHA512 (patch-4.20.14.xz) = 2743963385f1a3ecac2a36978569bcea49df7db7d126aa37f807252eda419e3bba3b2444fab0c3e0a22da17d3adbd5b77e0637ccc025d54fe51b7cc6361d4db9 |