diff options
| -rw-r--r-- | fs/nfs/nfs4namespace.c | 4 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 22 |
3 files changed, 20 insertions, 8 deletions
diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c index 017b4b01a69c..4fdeb1b7042e 100644 --- a/fs/nfs/nfs4namespace.c +++ b/fs/nfs/nfs4namespace.c | |||
| @@ -198,14 +198,14 @@ struct rpc_clnt *nfs4_create_sec_client(struct rpc_clnt *clnt, struct inode *ino | |||
| 198 | 198 | ||
| 199 | flavor = nfs4_negotiate_security(inode, name); | 199 | flavor = nfs4_negotiate_security(inode, name); |
| 200 | if ((int)flavor < 0) | 200 | if ((int)flavor < 0) |
| 201 | return ERR_PTR(flavor); | 201 | return ERR_PTR((int)flavor); |
| 202 | 202 | ||
| 203 | clone = rpc_clone_client(clnt); | 203 | clone = rpc_clone_client(clnt); |
| 204 | if (IS_ERR(clone)) | 204 | if (IS_ERR(clone)) |
| 205 | return clone; | 205 | return clone; |
| 206 | 206 | ||
| 207 | auth = rpcauth_create(flavor, clone); | 207 | auth = rpcauth_create(flavor, clone); |
| 208 | if (!auth) { | 208 | if (IS_ERR(auth)) { |
| 209 | rpc_shutdown_client(clone); | 209 | rpc_shutdown_client(clone); |
| 210 | clone = ERR_PTR(-EIO); | 210 | clone = ERR_PTR(-EIO); |
| 211 | } | 211 | } |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 1e50326d00dd..ddfebb128017 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -2399,7 +2399,7 @@ static int nfs4_lookup_root_sec(struct nfs_server *server, struct nfs_fh *fhandl | |||
| 2399 | int ret; | 2399 | int ret; |
| 2400 | 2400 | ||
| 2401 | auth = rpcauth_create(flavor, server->client); | 2401 | auth = rpcauth_create(flavor, server->client); |
| 2402 | if (!auth) { | 2402 | if (IS_ERR(auth)) { |
| 2403 | ret = -EIO; | 2403 | ret = -EIO; |
| 2404 | goto out; | 2404 | goto out; |
| 2405 | } | 2405 | } |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index a35b8e52e551..97f8918169ed 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -1025,6 +1025,16 @@ static void xs_udp_data_ready(struct sock *sk, int len) | |||
| 1025 | read_unlock_bh(&sk->sk_callback_lock); | 1025 | read_unlock_bh(&sk->sk_callback_lock); |
| 1026 | } | 1026 | } |
| 1027 | 1027 | ||
| 1028 | /* | ||
| 1029 | * Helper function to force a TCP close if the server is sending | ||
| 1030 | * junk and/or it has put us in CLOSE_WAIT | ||
| 1031 | */ | ||
| 1032 | static void xs_tcp_force_close(struct rpc_xprt *xprt) | ||
| 1033 | { | ||
| 1034 | set_bit(XPRT_CONNECTION_CLOSE, &xprt->state); | ||
| 1035 | xprt_force_disconnect(xprt); | ||
| 1036 | } | ||
| 1037 | |||
| 1028 | static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_reader *desc) | 1038 | static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_reader *desc) |
| 1029 | { | 1039 | { |
| 1030 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | 1040 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
| @@ -1051,7 +1061,7 @@ static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_rea | |||
| 1051 | /* Sanity check of the record length */ | 1061 | /* Sanity check of the record length */ |
| 1052 | if (unlikely(transport->tcp_reclen < 8)) { | 1062 | if (unlikely(transport->tcp_reclen < 8)) { |
| 1053 | dprintk("RPC: invalid TCP record fragment length\n"); | 1063 | dprintk("RPC: invalid TCP record fragment length\n"); |
| 1054 | xprt_force_disconnect(xprt); | 1064 | xs_tcp_force_close(xprt); |
| 1055 | return; | 1065 | return; |
| 1056 | } | 1066 | } |
| 1057 | dprintk("RPC: reading TCP record fragment of length %d\n", | 1067 | dprintk("RPC: reading TCP record fragment of length %d\n", |
| @@ -1132,7 +1142,7 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport, | |||
| 1132 | break; | 1142 | break; |
| 1133 | default: | 1143 | default: |
| 1134 | dprintk("RPC: invalid request message type\n"); | 1144 | dprintk("RPC: invalid request message type\n"); |
| 1135 | xprt_force_disconnect(&transport->xprt); | 1145 | xs_tcp_force_close(&transport->xprt); |
| 1136 | } | 1146 | } |
| 1137 | xs_tcp_check_fraghdr(transport); | 1147 | xs_tcp_check_fraghdr(transport); |
| 1138 | } | 1148 | } |
| @@ -1455,6 +1465,8 @@ static void xs_tcp_cancel_linger_timeout(struct rpc_xprt *xprt) | |||
| 1455 | static void xs_sock_mark_closed(struct rpc_xprt *xprt) | 1465 | static void xs_sock_mark_closed(struct rpc_xprt *xprt) |
| 1456 | { | 1466 | { |
| 1457 | smp_mb__before_clear_bit(); | 1467 | smp_mb__before_clear_bit(); |
| 1468 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); | ||
| 1469 | clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state); | ||
| 1458 | clear_bit(XPRT_CLOSE_WAIT, &xprt->state); | 1470 | clear_bit(XPRT_CLOSE_WAIT, &xprt->state); |
| 1459 | clear_bit(XPRT_CLOSING, &xprt->state); | 1471 | clear_bit(XPRT_CLOSING, &xprt->state); |
| 1460 | smp_mb__after_clear_bit(); | 1472 | smp_mb__after_clear_bit(); |
| @@ -1512,8 +1524,8 @@ static void xs_tcp_state_change(struct sock *sk) | |||
| 1512 | break; | 1524 | break; |
| 1513 | case TCP_CLOSE_WAIT: | 1525 | case TCP_CLOSE_WAIT: |
| 1514 | /* The server initiated a shutdown of the socket */ | 1526 | /* The server initiated a shutdown of the socket */ |
| 1515 | xprt_force_disconnect(xprt); | ||
| 1516 | xprt->connect_cookie++; | 1527 | xprt->connect_cookie++; |
| 1528 | xs_tcp_force_close(xprt); | ||
| 1517 | case TCP_CLOSING: | 1529 | case TCP_CLOSING: |
| 1518 | /* | 1530 | /* |
| 1519 | * If the server closed down the connection, make sure that | 1531 | * If the server closed down the connection, make sure that |
| @@ -2199,8 +2211,7 @@ static void xs_tcp_setup_socket(struct work_struct *work) | |||
| 2199 | /* We're probably in TIME_WAIT. Get rid of existing socket, | 2211 | /* We're probably in TIME_WAIT. Get rid of existing socket, |
| 2200 | * and retry | 2212 | * and retry |
| 2201 | */ | 2213 | */ |
| 2202 | set_bit(XPRT_CONNECTION_CLOSE, &xprt->state); | 2214 | xs_tcp_force_close(xprt); |
| 2203 | xprt_force_disconnect(xprt); | ||
| 2204 | break; | 2215 | break; |
| 2205 | case -ECONNREFUSED: | 2216 | case -ECONNREFUSED: |
| 2206 | case -ECONNRESET: | 2217 | case -ECONNRESET: |
| @@ -2528,6 +2539,7 @@ static struct rpc_xprt_ops xs_tcp_ops = { | |||
| 2528 | static struct rpc_xprt_ops bc_tcp_ops = { | 2539 | static struct rpc_xprt_ops bc_tcp_ops = { |
| 2529 | .reserve_xprt = xprt_reserve_xprt, | 2540 | .reserve_xprt = xprt_reserve_xprt, |
| 2530 | .release_xprt = xprt_release_xprt, | 2541 | .release_xprt = xprt_release_xprt, |
| 2542 | .alloc_slot = xprt_alloc_slot, | ||
| 2531 | .rpcbind = xs_local_rpcbind, | 2543 | .rpcbind = xs_local_rpcbind, |
| 2532 | .buf_alloc = bc_malloc, | 2544 | .buf_alloc = bc_malloc, |
| 2533 | .buf_free = bc_free, | 2545 | .buf_free = bc_free, |
