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;
}
rpc_shutdown_client(clnt);
clnt = ERR_PTR(err);
}
-out:
+out:
return clnt;
}
* 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);
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);
/* 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;
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);
else
rpc_put_task(task);
- rpc_restore_sigmask(&oldset);
+ rpc_restore_sigmask(&oldset);
return status;
out_release:
rpc_release_calldata(tk_ops, data);
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:
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);
}
/*