summaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorBenjamin Coddington <bcodding@redhat.com>2019-10-02 10:40:55 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2019-10-10 16:14:28 -0400
commitaf84537dbd1b39505d1f3d8023029b4a59666513 (patch)
tree0c176e56553e0ac8c56b28794b6343128df56d6e /include/linux
parent1047ec868332034d1fbcb2fae19fe6d4cb869ff2 (diff)
downloadlinux-af84537dbd1b39505d1f3d8023029b4a59666513.tar.gz
linux-af84537dbd1b39505d1f3d8023029b4a59666513.tar.bz2
linux-af84537dbd1b39505d1f3d8023029b4a59666513.zip
SUNRPC: fix race to sk_err after xs_error_report
Since commit 4f8943f80883 ("SUNRPC: Replace direct task wakeups from softirq context") there has been a race to the value of the sk_err if both XPRT_SOCK_WAKE_ERROR and XPRT_SOCK_WAKE_DISCONNECT are set. In that case, we may end up losing the sk_err value that existed when xs_error_report was called. Fix this by reverting to the previous behavior: instead of using SO_ERROR to retrieve the value at a later time (which might also return sk_err_soft), copy the sk_err value onto struct sock_xprt, and use that value to wake pending tasks. Signed-off-by: Benjamin Coddington <bcodding@redhat.com> Fixes: 4f8943f80883 ("SUNRPC: Replace direct task wakeups from softirq context") Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/sunrpc/xprtsock.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h
index 7638dbe7bc50..a940de03808d 100644
--- a/include/linux/sunrpc/xprtsock.h
+++ b/include/linux/sunrpc/xprtsock.h
@@ -61,6 +61,7 @@ struct sock_xprt {
struct mutex recv_mutex;
struct sockaddr_storage srcaddr;
unsigned short srcport;
+ int xprt_err;
/*
* UDP socket buffer size parameters