diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-06-30 13:42:19 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-06-30 13:42:19 -0400 |
commit | 3601c4a91ebbbf1cf69f66a2abeffc6c64a4fe64 (patch) | |
tree | 33ab0e11e49872bb851957ada502f58a04690d6c /net | |
parent | f15b5041440c502726f121b37cf3923562f8dc6f (diff) |
SUNRPC: Ensure that we handle ENOBUFS errors correctly.
Currently, an ENOBUFS error will result in a fatal error for the RPC
call. Normally, we will just want to wait and then retry.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/clnt.c | 4 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 5 |
2 files changed, 9 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 2e6ab10734f6..575e63f6c13e 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -1746,6 +1746,7 @@ call_bind_status(struct rpc_task *task) | |||
1746 | case -EHOSTDOWN: | 1746 | case -EHOSTDOWN: |
1747 | case -EHOSTUNREACH: | 1747 | case -EHOSTUNREACH: |
1748 | case -ENETUNREACH: | 1748 | case -ENETUNREACH: |
1749 | case -ENOBUFS: | ||
1749 | case -EPIPE: | 1750 | case -EPIPE: |
1750 | dprintk("RPC: %5u remote rpcbind unreachable: %d\n", | 1751 | dprintk("RPC: %5u remote rpcbind unreachable: %d\n", |
1751 | task->tk_pid, task->tk_status); | 1752 | task->tk_pid, task->tk_status); |
@@ -1812,6 +1813,7 @@ call_connect_status(struct rpc_task *task) | |||
1812 | case -ECONNABORTED: | 1813 | case -ECONNABORTED: |
1813 | case -ENETUNREACH: | 1814 | case -ENETUNREACH: |
1814 | case -EHOSTUNREACH: | 1815 | case -EHOSTUNREACH: |
1816 | case -ENOBUFS: | ||
1815 | if (RPC_IS_SOFTCONN(task)) | 1817 | if (RPC_IS_SOFTCONN(task)) |
1816 | break; | 1818 | break; |
1817 | /* retry with existing socket, after a delay */ | 1819 | /* retry with existing socket, after a delay */ |
@@ -1918,6 +1920,7 @@ call_transmit_status(struct rpc_task *task) | |||
1918 | case -ECONNRESET: | 1920 | case -ECONNRESET: |
1919 | case -ECONNABORTED: | 1921 | case -ECONNABORTED: |
1920 | case -ENOTCONN: | 1922 | case -ENOTCONN: |
1923 | case -ENOBUFS: | ||
1921 | case -EPIPE: | 1924 | case -EPIPE: |
1922 | rpc_task_force_reencode(task); | 1925 | rpc_task_force_reencode(task); |
1923 | } | 1926 | } |
@@ -2034,6 +2037,7 @@ call_status(struct rpc_task *task) | |||
2034 | case -ECONNRESET: | 2037 | case -ECONNRESET: |
2035 | case -ECONNABORTED: | 2038 | case -ECONNABORTED: |
2036 | rpc_force_rebind(clnt); | 2039 | rpc_force_rebind(clnt); |
2040 | case -ENOBUFS: | ||
2037 | rpc_delay(task, 3*HZ); | 2041 | rpc_delay(task, 3*HZ); |
2038 | case -EPIPE: | 2042 | case -EPIPE: |
2039 | case -ENOTCONN: | 2043 | case -ENOTCONN: |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index be8bbd5d65ec..8f8589fedfdd 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -594,6 +594,7 @@ static int xs_local_send_request(struct rpc_task *task) | |||
594 | } | 594 | } |
595 | 595 | ||
596 | switch (status) { | 596 | switch (status) { |
597 | case -ENOBUFS: | ||
597 | case -EAGAIN: | 598 | case -EAGAIN: |
598 | status = xs_nospace(task); | 599 | status = xs_nospace(task); |
599 | break; | 600 | break; |
@@ -661,6 +662,7 @@ static int xs_udp_send_request(struct rpc_task *task) | |||
661 | dprintk("RPC: sendmsg returned unrecognized error %d\n", | 662 | dprintk("RPC: sendmsg returned unrecognized error %d\n", |
662 | -status); | 663 | -status); |
663 | case -ENETUNREACH: | 664 | case -ENETUNREACH: |
665 | case -ENOBUFS: | ||
664 | case -EPIPE: | 666 | case -EPIPE: |
665 | case -ECONNREFUSED: | 667 | case -ECONNREFUSED: |
666 | /* When the server has died, an ICMP port unreachable message | 668 | /* When the server has died, an ICMP port unreachable message |
@@ -758,6 +760,7 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
758 | status = -ENOTCONN; | 760 | status = -ENOTCONN; |
759 | /* Should we call xs_close() here? */ | 761 | /* Should we call xs_close() here? */ |
760 | break; | 762 | break; |
763 | case -ENOBUFS: | ||
761 | case -EAGAIN: | 764 | case -EAGAIN: |
762 | status = xs_nospace(task); | 765 | status = xs_nospace(task); |
763 | break; | 766 | break; |
@@ -1946,6 +1949,7 @@ static int xs_local_setup_socket(struct sock_xprt *transport) | |||
1946 | dprintk("RPC: xprt %p connected to %s\n", | 1949 | dprintk("RPC: xprt %p connected to %s\n", |
1947 | xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); | 1950 | xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); |
1948 | xprt_set_connected(xprt); | 1951 | xprt_set_connected(xprt); |
1952 | case -ENOBUFS: | ||
1949 | break; | 1953 | break; |
1950 | case -ENOENT: | 1954 | case -ENOENT: |
1951 | dprintk("RPC: xprt %p: socket %s does not exist\n", | 1955 | dprintk("RPC: xprt %p: socket %s does not exist\n", |
@@ -2281,6 +2285,7 @@ static void xs_tcp_setup_socket(struct work_struct *work) | |||
2281 | case -ECONNREFUSED: | 2285 | case -ECONNREFUSED: |
2282 | case -ECONNRESET: | 2286 | case -ECONNRESET: |
2283 | case -ENETUNREACH: | 2287 | case -ENETUNREACH: |
2288 | case -ENOBUFS: | ||
2284 | /* retry with existing socket, after a delay */ | 2289 | /* retry with existing socket, after a delay */ |
2285 | goto out; | 2290 | goto out; |
2286 | } | 2291 | } |