static void rpc_child_exit(struct rpc_task *child) { struct rpc_task *parent; if ((parent = rpc_find_parent(child)) != NULL) { parent->tk_status = child->tk_status; rpc_wake_up_task(parent); } rpc_release_task(child); }
/* * Kill all tasks for the given client. * XXX: kill their descendants as well? */ void rpc_killall_tasks(struct rpc_clnt *clnt) { struct rpc_task **q, *rovr; dprintk("RPC: killing all tasks for client %p\n", clnt); /* N.B. Why bother to inhibit? Nothing blocks here ... */ rpc_inhibit++; for (q = &all_tasks; (rovr = *q); q = &rovr->tk_next_task) { if (!clnt || rovr->tk_client == clnt) { rovr->tk_flags |= RPC_TASK_KILLED; rpc_exit(rovr, -EIO); rpc_wake_up_task(rovr); } } rpc_inhibit--; }
void nfs_reqlist_exit(struct nfs_server *server) { struct nfs_reqlist *cache; lock_kernel(); cache = server->rw_requests; if (!cache) goto out; dprintk("NFS: reqlist_exit (ptr %p rpc %p)\n", cache, cache->task); while (cache->task) { rpc_exit(cache->task, 0); rpc_wake_up_task(cache->task); interruptible_sleep_on_timeout(&cache->request_wait, 1 * HZ); } out: unlock_kernel(); }