Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[cascardo/linux.git] / net / sunrpc / clnt.c
index 393e70a..396cdbe 100644 (file)
@@ -249,6 +249,8 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
                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;
 }
@@ -414,7 +416,7 @@ struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old,
                rpc_shutdown_client(clnt);
                clnt = ERR_PTR(err);
        }
-out:   
+out:
        return clnt;
 }
 
@@ -435,7 +437,7 @@ static const struct rpc_call_ops rpc_default_ops = {
  *     sleeps on RPC calls
  */
 #define RPC_INTR_SIGNALS (sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT) | sigmask(SIGTERM))
+
 static void rpc_save_sigmask(sigset_t *oldset, int intr)
 {
        unsigned long   sigallow = sigmask(SIGKILL);
@@ -478,7 +480,7 @@ int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
        int             status;
 
        /* If this client is slain all further I/O fails */
-       if (clnt->cl_dead) 
+       if (clnt->cl_dead)
                return -EIO;
 
        BUG_ON(flags & RPC_TASK_ASYNC);
@@ -515,7 +517,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
 
        /* If this client is slain all further I/O fails */
        status = -EIO;
-       if (clnt->cl_dead) 
+       if (clnt->cl_dead)
                goto out_release;
 
        flags |= RPC_TASK_ASYNC;
@@ -526,7 +528,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
                goto out_release;
 
        /* Mask signals on GSS_AUTH upcalls */
-       rpc_task_sigmask(task, &oldset);                
+       rpc_task_sigmask(task, &oldset);
 
        rpc_call_setup(task, msg, 0);
 
@@ -537,7 +539,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
        else
                rpc_put_task(task);
 
-       rpc_restore_sigmask(&oldset);           
+       rpc_restore_sigmask(&oldset);
        return status;
 out_release:
        rpc_release_calldata(tk_ops, data);
@@ -1044,6 +1046,8 @@ call_status(struct rpc_task *task)
                rpc_delay(task, 3*HZ);
        case -ETIMEDOUT:
                task->tk_action = call_timeout;
+               if (task->tk_client->cl_discrtry)
+                       xprt_disconnect(task->tk_xprt);
                break;
        case -ECONNREFUSED:
        case -ENOTCONN:
@@ -1167,6 +1171,8 @@ call_decode(struct rpc_task *task)
 out_retry:
        req->rq_received = req->rq_private_buf.len = 0;
        task->tk_status = 0;
+       if (task->tk_client->cl_discrtry)
+               xprt_disconnect(task->tk_xprt);
 }
 
 /*