--- /dev/null
+From bcodding@redhat.com Wed Feb 13 15:24:58 2019
+From: Benjamin Coddington <bcodding@redhat.com>
+Date: Wed, 6 Feb 2019 06:42:15 -0500
+Subject: [STABLE PATCH] SUNRPC: Always drop the XPRT_LOCK on XPRT_CLOSE_WAIT
+To: stable@vger.kernel.org
+Cc: dwysocha@redhat.com, linux-nfs@vger.kernel.org, smayhew@redhat.com, trondmy@hammerspace.com
+Message-ID: <f3dda1a55b9a5d5a7416925358379608cc3a431e.1549453044.git.bcodding@redhat.com>
+
+From: Benjamin Coddington <bcodding@redhat.com>
+
+This patch is only appropriate for stable kernels v4.16 - v4.19
+
+Since commit 9b30889c548a ("SUNRPC: Ensure we always close the socket after
+a connection shuts down"), and until commit c544577daddb ("SUNRPC: Clean up
+transport write space handling"), it is possible for the NFS client to spin
+in the following tight loop:
+
+269.964083: rpc_task_run_action: task:43@0 flags=5a81 state=0005 status=0 action=call_bind [sunrpc]
+269.964083: rpc_task_run_action: task:43@0 flags=5a81 state=0005 status=0 action=call_connect [sunrpc]
+269.964083: rpc_task_run_action: task:43@0 flags=5a81 state=0005 status=0 action=call_transmit [sunrpc]
+269.964085: xprt_transmit: peer=[10.0.1.82]:2049 xid=0x761d3f77 status=-32
+269.964085: rpc_task_run_action: task:43@0 flags=5a81 state=0005 status=-32 action=call_transmit_status [sunrpc]
+269.964085: rpc_task_run_action: task:43@0 flags=5a81 state=0005 status=-32 action=call_status [sunrpc]
+269.964085: rpc_call_status: task:43@0 status=-32
+
+The issue is that the path through call_transmit_status does not release
+the XPRT_LOCK when the transmit result is -EPIPE, so the socket cannot be
+properly shut down.
+
+The below commit fixed things up in mainline by unconditionally calling
+xprt_end_transmit() and releasing the XPRT_LOCK after every pass through
+call_transmit. However, the entirety of this commit is not appropriate for
+stable kernels because its original inclusion was part of a series that
+modifies the sunrpc code to use a different queueing model. As a result,
+there are machinations within this patch that are not needed for a stable
+fix and will not make sense without a larger backport of the mainline
+series.
+
+In this patch, we take the slightly modified bit of the mainline patch
+below, which is to release the XPRT_LOCK on transmission error should we
+detect that the transport is waiting to close.
+
+commit c544577daddb618c7dd5fa7fb98d6a41782f020e upstream
+Author: Trond Myklebust <trond.myklebust@hammerspace.com>
+Date: Mon Sep 3 23:39:27 2018 -0400
+
+ SUNRPC: Clean up transport write space handling
+
+ Treat socket write space handling in the same way we now treat transport
+ congestion: by denying the XPRT_LOCK until the transport signals that it
+ has free buffer space.
+
+ Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+
+The original discussion of the problem is here:
+
+ https://lore.kernel.org/linux-nfs/20181212135157.4489-1-dwysocha@redhat.com/T/#t
+
+This passes my usual cthon and xfstests on NFS as applied on v4.19 mainline.
+
+Reported-by: Dave Wysochanski <dwysocha@redhat.com>
+Suggested-by: Trond Myklebust <trondmy@hammerspace.com>
+Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/linux/sunrpc/xprt.h | 5 +++++
+ net/sunrpc/clnt.c | 6 ++++--
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+--- a/include/linux/sunrpc/xprt.h
++++ b/include/linux/sunrpc/xprt.h
+@@ -443,6 +443,11 @@ static inline int xprt_test_and_set_conn
+ return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
+ }
+
++static inline int xprt_close_wait(struct rpc_xprt *xprt)
++{
++ return test_bit(XPRT_CLOSE_WAIT, &xprt->state);
++}
++
+ static inline void xprt_set_bound(struct rpc_xprt *xprt)
+ {
+ test_and_set_bit(XPRT_BOUND, &xprt->state);
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -1992,13 +1992,15 @@ call_transmit(struct rpc_task *task)
+ static void
+ call_transmit_status(struct rpc_task *task)
+ {
++ struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;
+ task->tk_action = call_status;
+
+ /*
+ * Common case: success. Force the compiler to put this
+- * test first.
++ * test first. Or, if any error and xprt_close_wait,
++ * release the xprt lock so the socket can close.
+ */
+- if (task->tk_status == 0) {
++ if (task->tk_status == 0 || xprt_close_wait(xprt)) {
+ xprt_end_transmit(task);
+ rpc_task_force_reencode(task);
+ return;
--- /dev/null
+From e2612cd496e7b465711d219ea6118893d7253f52 Mon Sep 17 00:00:00 2001
+From: Benedict Wong <benedictwong@google.com>
+Date: Mon, 14 Jan 2019 11:24:38 -0800
+Subject: xfrm: Make set-mark default behavior backward compatible
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benedict Wong <benedictwong@google.com>
+
+commit e2612cd496e7b465711d219ea6118893d7253f52 upstream.
+
+Fixes 9b42c1f179a6, which changed the default route lookup behavior for
+tunnel mode SAs in the outbound direction to use the skb mark, whereas
+previously mark=0 was used if the output mark was unspecified. In
+mark-based routing schemes such as Android’s, this change in default
+behavior causes routing loops or lookup failures.
+
+This patch restores the default behavior of using a 0 mark while still
+incorporating the skb mark if the SET_MARK (and SET_MARK_MASK) is
+specified.
+
+Tested with additions to Android's kernel unit test suite:
+https://android-review.googlesource.com/c/kernel/tests/+/860150
+
+Fixes: 9b42c1f179a6 ("xfrm: Extend the output_mark to support input direction and masking")
+Signed-off-by: Benedict Wong <benedictwong@google.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/xfrm/xfrm_policy.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -1628,7 +1628,10 @@ static struct dst_entry *xfrm_bundle_cre
+ dst_copy_metrics(dst1, dst);
+
+ if (xfrm[i]->props.mode != XFRM_MODE_TRANSPORT) {
+- __u32 mark = xfrm_smark_get(fl->flowi_mark, xfrm[i]);
++ __u32 mark = 0;
++
++ if (xfrm[i]->props.smark.v || xfrm[i]->props.smark.m)
++ mark = xfrm_smark_get(fl->flowi_mark, xfrm[i]);
+
+ family = xfrm[i]->props.family;
+ dst = xfrm_dst_lookup(xfrm[i], tos, fl->flowi_oif,