dprintk("RPC: creating %s client for %s (xprt %p)\n",
program->name, servname, xprt);
+ err = rpciod_up();
+ if (err)
+ goto out_no_rpciod;
err = -EINVAL;
if (!xprt)
goto out_no_xprt;
out_err:
xprt_put(xprt);
out_no_xprt:
+ rpciod_down();
+out_no_rpciod:
return ERR_PTR(err);
}
xprt_get(clnt->cl_xprt);
kref_get(&clnt->cl_kref);
rpc_register_client(new);
+ rpciod_up();
return new;
out_no_path:
rpc_free_iostats(new->cl_metrics);
rpc_free_iostats(clnt->cl_metrics);
clnt->cl_metrics = NULL;
xprt_put(clnt->cl_xprt);
+ rpciod_down();
kfree(clnt);
}
static mempool_t *rpc_buffer_mempool __read_mostly;
static void __rpc_default_timer(struct rpc_task *task);
-static void rpciod_killall(void);
static void rpc_async_schedule(struct work_struct *);
static void rpc_release_task(struct rpc_task *task);
* All RPC clients are linked into this list
*/
static LIST_HEAD(all_clients);
-static DECLARE_WAIT_QUEUE_HEAD(client_kill_wait);
/*
* rpciod-related stuff
spin_unlock(&clnt->cl_lock);
}
-static void rpciod_killall(void)
-{
- struct rpc_clnt *clnt;
- unsigned long flags;
-
- for(;;) {
- clear_thread_flag(TIF_SIGPENDING);
-
- spin_lock(&rpc_sched_lock);
- list_for_each_entry(clnt, &all_clients, cl_clients)
- rpc_killall_tasks(clnt);
- spin_unlock(&rpc_sched_lock);
- flush_workqueue(rpciod_workqueue);
- if (!list_empty(&all_clients))
- break;
- dprintk("RPC: rpciod_killall: waiting for tasks "
- "to exit\n");
- wait_event_timeout(client_kill_wait,
- list_empty(&all_clients), 1*HZ);
- }
-
- spin_lock_irqsave(¤t->sighand->siglock, flags);
- recalc_sigpending();
- spin_unlock_irqrestore(¤t->sighand->siglock, flags);
-}
-
void rpc_register_client(struct rpc_clnt *clnt)
{
spin_lock(&rpc_sched_lock);
{
spin_lock(&rpc_sched_lock);
list_del(&clnt->cl_clients);
- if (list_empty(&all_clients))
- wake_up(&client_kill_wait);
spin_unlock(&rpc_sched_lock);
}
dprintk("RPC: destroying workqueue rpciod\n");
if (atomic_read(&rpciod_users) == 0 && rpciod_workqueue != NULL) {
- rpciod_killall();
destroy_workqueue(rpciod_workqueue);
rpciod_workqueue = NULL;
}