X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fsunrpc%2Fclnt.c;h=441c5de1bbb8e3076d581c19d80089cf1a0345cd;hb=eb643825dab24bf61fe40ea800c5be013315220d;hp=1696c16b2bc91ad96d3aacc681b998b15956c967;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 1696c16b2..441c5de1b 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -214,17 +214,24 @@ out_no_clnt: int rpc_shutdown_client(struct rpc_clnt *clnt) { + wait_queue_t __wait; + init_waitqueue_entry(&__wait, current); dprintk("RPC: shutting down %s client for %s, tasks=%d\n", clnt->cl_protname, clnt->cl_server, atomic_read(&clnt->cl_users)); + add_wait_queue(&destroy_wait, &__wait); + set_current_state(TASK_UNINTERRUPTIBLE); while (atomic_read(&clnt->cl_users) > 0) { /* Don't let rpc_release_client destroy us */ clnt->cl_oneshot = 0; clnt->cl_dead = 0; rpc_killall_tasks(clnt); - sleep_on_timeout(&destroy_wait, 1*HZ); + schedule_timeout(1*HZ); + set_current_state(TASK_UNINTERRUPTIBLE); } + current->state = TASK_RUNNING; + remove_wait_queue(&destroy_wait, &__wait); if (atomic_read(&clnt->cl_users) < 0) { printk(KERN_ERR "RPC: rpc_shutdown_client clnt %p tasks=%d\n", @@ -788,13 +795,11 @@ static void call_timeout(struct rpc_task *task) { struct rpc_clnt *clnt = task->tk_client; - struct rpc_timeout *to = &task->tk_rqstp->rq_timeout; - if (xprt_adjust_timeout(to)) { + if (xprt_adjust_timeout(task->tk_rqstp) == 0) { dprintk("RPC: %4d call_timeout (minor)\n", task->tk_pid); goto retry; } - to->to_retries = clnt->cl_timeout.to_retries; dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid); if (RPC_IS_SOFT(task)) {