]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/sunrpc/xprtsock.c
Merge tag 'nfs-for-3.10-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[mirror_ubuntu-bionic-kernel.git] / net / sunrpc / xprtsock.c
index c1d8476b76929b4300d967dd795aa6c2ce38f7a0..9c2825827decfb1a0b6fd2f4a80c0cd66fe36eb7 100644 (file)
@@ -849,6 +849,14 @@ static void xs_tcp_close(struct rpc_xprt *xprt)
                xs_tcp_shutdown(xprt);
 }
 
+static void xs_local_destroy(struct rpc_xprt *xprt)
+{
+       xs_close(xprt);
+       xs_free_peer_addresses(xprt);
+       xprt_free(xprt);
+       module_put(THIS_MODULE);
+}
+
 /**
  * xs_destroy - prepare to shutdown a transport
  * @xprt: doomed transport
@@ -862,10 +870,7 @@ static void xs_destroy(struct rpc_xprt *xprt)
 
        cancel_delayed_work_sync(&transport->connect_worker);
 
-       xs_close(xprt);
-       xs_free_peer_addresses(xprt);
-       xprt_free(xprt);
-       module_put(THIS_MODULE);
+       xs_local_destroy(xprt);
 }
 
 static inline struct rpc_xprt *xprt_from_sock(struct sock *sk)
@@ -2202,10 +2207,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)
                 */
                xs_tcp_force_close(xprt);
                break;
-       case -ECONNREFUSED:
-       case -ECONNRESET:
-       case -ENETUNREACH:
-               /* retry with existing socket, after a delay */
        case 0:
        case -EINPROGRESS:
        case -EALREADY:
@@ -2216,6 +2217,10 @@ static void xs_tcp_setup_socket(struct work_struct *work)
                /* Happens, for instance, if the user specified a link
                 * local IPv6 address without a scope-id.
                 */
+       case -ECONNREFUSED:
+       case -ECONNRESET:
+       case -ENETUNREACH:
+               /* retry with existing socket, after a delay */
                goto out;
        }
 out_eagain:
@@ -2482,7 +2487,7 @@ static struct rpc_xprt_ops xs_local_ops = {
        .send_request           = xs_local_send_request,
        .set_retrans_timeout    = xprt_set_retrans_timeout_def,
        .close                  = xs_close,
-       .destroy                = xs_destroy,
+       .destroy                = xs_local_destroy,
        .print_stats            = xs_local_print_stats,
 };
 
@@ -2762,9 +2767,13 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
        struct rpc_xprt *xprt;
        struct sock_xprt *transport;
        struct rpc_xprt *ret;
+       unsigned int max_slot_table_size = xprt_max_tcp_slot_table_entries;
+
+       if (args->flags & XPRT_CREATE_INFINITE_SLOTS)
+               max_slot_table_size = RPC_MAX_SLOT_TABLE_LIMIT;
 
        xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries,
-                       xprt_max_tcp_slot_table_entries);
+                       max_slot_table_size);
        if (IS_ERR(xprt))
                return xprt;
        transport = container_of(xprt, struct sock_xprt, xprt);