static int nfs_create_rpc_client(struct nfs_client *clp, int proto,
                                                unsigned int timeo,
                                                unsigned int retrans,
-                                               rpc_authflavor_t flavor)
+                                               rpc_authflavor_t flavor,
+                                               int flags)
 {
        struct rpc_timeout      timeparms;
        struct rpc_clnt         *clnt = NULL;
                .program        = &nfs_program,
                .version        = clp->rpc_ops->version,
                .authflavor     = flavor,
+               .flags          = flags,
        };
 
        if (!IS_ERR(clp->cl_rpcclient))
         * - RFC 2623, sec 2.3.2
         */
        error = nfs_create_rpc_client(clp, proto, data->timeo, data->retrans,
-                       RPC_AUTH_UNIX);
+                                       RPC_AUTH_UNIX, 0);
        if (error < 0)
                goto error;
        nfs_mark_client_ready(clp, NFS_CS_READY);
        /* Check NFS protocol revision and initialize RPC op vector */
        clp->rpc_ops = &nfs_v4_clientops;
 
-       error = nfs_create_rpc_client(clp, proto, timeo, retrans, authflavour);
+       error = nfs_create_rpc_client(clp, proto, timeo, retrans, authflavour,
+                                       RPC_CLNT_CREATE_DISCRTRY);
        if (error < 0)
                goto error;
        memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
 
 
        unsigned int            cl_softrtry : 1,/* soft timeouts */
                                cl_intr     : 1,/* interruptible */
+                               cl_discrtry : 1,/* disconnect before retry */
                                cl_autobind : 1,/* use getport() */
                                cl_oneshot  : 1,/* dispose after use */
                                cl_dead     : 1;/* abandoned */
 #define RPC_CLNT_CREATE_ONESHOT                (1UL << 3)
 #define RPC_CLNT_CREATE_NONPRIVPORT    (1UL << 4)
 #define RPC_CLNT_CREATE_NOPING         (1UL << 5)
+#define RPC_CLNT_CREATE_DISCRTRY       (1UL << 6)
 
 struct rpc_clnt *rpc_create(struct rpc_create_args *args);
 struct rpc_clnt        *rpc_bind_new_program(struct rpc_clnt *,
 
                clnt->cl_autobind = 1;
        if (args->flags & RPC_CLNT_CREATE_ONESHOT)
                clnt->cl_oneshot = 1;
+       if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
+               clnt->cl_discrtry = 1;
 
        return clnt;
 }
 
                        xprt_reset_majortimeo(req);
                        /* Turn off autodisconnect */
                        del_singleshot_timer_sync(&xprt->timer);
+               } else {
+                       /* If all request bytes have been sent,
+                        * then we must be retransmitting this one */
+                       if (!req->rq_bytes_sent) {
+                               if (task->tk_client->cl_discrtry) {
+                                       xprt_disconnect(xprt);
+                                       task->tk_status = -ENOTCONN;
+                                       return;
+                               }
+                       }
                }
        } else if (!req->rq_bytes_sent)
                return;