/* * Remove a dead socket */ void svc_delete_socket(struct svc_sock *svsk) { struct svc_sock **rsk; struct svc_serv *serv; struct sock *sk; dprintk("svc: svc_delete_socket(%p)\n", svsk); serv = svsk->sk_server; sk = svsk->sk_sk; sk->state_change = svsk->sk_ostate; sk->data_ready = svsk->sk_odata; for (rsk = &serv->sv_allsocks; *rsk; rsk = &(*rsk)->sk_list) { if (*rsk == svsk) break; } if (!*rsk) return; *rsk = svsk->sk_list; if (svsk->sk_qued) rpc_remove_list(&serv->sv_sockets, svsk); svsk->sk_dead = 1; if (!svsk->sk_inuse) { sock_release(svsk->sk_sock); kfree(svsk); } else { printk(KERN_NOTICE "svc: server socket destroy delayed\n"); /* svsk->sk_server = NULL; */ } }
/* * Remove request from queue. * Note: must be called with interrupts disabled. */ void rpc_remove_wait_queue(struct rpc_task *task) { struct rpc_wait_queue *queue; if (!(queue = task->tk_rpcwait)) return; rpc_remove_list(&queue->task, task); task->tk_rpcwait = NULL; dprintk("RPC: %4d removed from queue %p \"%s\"\n", task->tk_pid, queue, rpc_qname(queue)); }
/* * Dequeue the first socket. Must be called with the serv->sv_lock held. */ static inline struct svc_sock * svc_sock_dequeue(struct svc_serv *serv) { struct svc_sock *svsk; if ((svsk = serv->sv_sockets) != NULL) rpc_remove_list(&serv->sv_sockets, svsk); if (svsk) { dprintk("svc: socket %p dequeued, inuse=%d\n", svsk->sk_sk, svsk->sk_inuse); svsk->sk_qued = 0; } return svsk; }
/* * Dequeue an nfsd thread. Must have serv->sv_lock held. */ static inline void svc_serv_dequeue(struct svc_serv *serv, struct svc_rqst *rqstp) { rpc_remove_list(&serv->sv_threads, rqstp); }