Exemple #1
0
/*
 * 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; */
	}
}
Exemple #2
0
/*
 * 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));
}
Exemple #3
0
/*
 * 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;
}
Exemple #4
0
/*
 * 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);
}