/* * Release a socket after use. */ static inline void svc_sock_release(struct svc_rqst *rqstp) { struct svc_sock *svsk = rqstp->rq_sock; if (!svsk) return; svc_release_skb(rqstp); rqstp->rq_sock = NULL; if (!--(svsk->sk_inuse) && svsk->sk_dead) { dprintk("svc: releasing dead socket\n"); sock_release(svsk->sk_sock); kfree(svsk); } }
/* * Release a socket after use. */ static inline void svc_sock_release(struct svc_rqst *rqstp) { struct svc_sock *svsk = rqstp->rq_sock; struct svc_serv *serv = svsk->sk_server; svc_release_skb(rqstp); rqstp->rq_sock = NULL; spin_lock_bh(&serv->sv_lock); if (!--(svsk->sk_inuse) && svsk->sk_dead) { spin_unlock_bh(&serv->sv_lock); dprintk("svc: releasing dead socket\n"); sock_release(svsk->sk_sock); kfree(svsk); } else spin_unlock_bh(&serv->sv_lock); }
/* * Return reply to client. */ int svc_send(struct svc_rqst *rqstp) { struct svc_sock *svsk; int len; if ((svsk = rqstp->rq_sock) == NULL) { printk(KERN_WARNING "NULL socket pointer in %s:%d\n", __FILE__, __LINE__); return -EFAULT; } /* release the receive skb before sending the reply */ svc_release_skb(rqstp); len = svsk->sk_sendto(rqstp); svc_sock_release(rqstp); if (len == -ECONNREFUSED || len == -ENOTCONN || len == -EAGAIN) return 0; return len; }