Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a50fea26 authored by Tom Tucker's avatar Tom Tucker Committed by J. Bruce Fields
Browse files

svc: Make svc_send transport neutral



Move the sk_mutex field to the transport independent svc_xprt structure.
Now all the fields that svc_send touches are transport neutral. Change the
svc_send function to use the transport independent svc_xprt directly instead
of the transport dependent svc_sock structure.

Signed-off-by: default avatarTom Tucker <tom@opengridcomputing.com>
Acked-by: default avatarNeil Brown <neilb@suse.de>
Reviewed-by: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarGreg Banks <gnb@sgi.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent f6150c3c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ struct svc_xprt {
	struct svc_pool		*xpt_pool;	/* current pool iff queued */
	struct svc_serv		*xpt_server;	/* service for transport */
	atomic_t    	    	xpt_reserved;	/* space on outq that is rsvd */
	struct mutex		xpt_mutex;	/* to serialize sending data */
};

int	svc_reg_xprt_class(struct svc_xprt_class *);
+0 −1
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ struct svc_sock {
						 * sk_info_authunix */
	struct list_head	sk_deferred;	/* deferred requests that need to
						 * be revisted */
	struct mutex		sk_mutex;	/* to serialize sending data */

	/* We keep the old state_change and data_ready CB's here */
	void			(*sk_ostate)(struct sock *);
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ void svc_xprt_init(struct svc_xprt_class *xcl, struct svc_xprt *xprt,
	xprt->xpt_server = serv;
	INIT_LIST_HEAD(&xprt->xpt_list);
	INIT_LIST_HEAD(&xprt->xpt_ready);
	mutex_init(&xprt->xpt_mutex);
}
EXPORT_SYMBOL_GPL(svc_xprt_init);

+8 −11
Original line number Diff line number Diff line
@@ -1632,15 +1632,13 @@ svc_drop(struct svc_rqst *rqstp)
int
svc_send(struct svc_rqst *rqstp)
{
	struct svc_sock	*svsk;
	struct svc_xprt	*xprt;
	int		len;
	struct xdr_buf	*xb;

	if ((svsk = rqstp->rq_sock) == NULL) {
		printk(KERN_WARNING "NULL socket pointer in %s:%d\n",
				__FILE__, __LINE__);
	xprt = rqstp->rq_xprt;
	if (!xprt)
		return -EFAULT;
	}

	/* release the receive skb before sending the reply */
	rqstp->rq_xprt->xpt_ops->xpo_release_rqst(rqstp);
@@ -1651,13 +1649,13 @@ svc_send(struct svc_rqst *rqstp)
		xb->page_len +
		xb->tail[0].iov_len;

	/* Grab svsk->sk_mutex to serialize outgoing data. */
	mutex_lock(&svsk->sk_mutex);
	if (test_bit(XPT_DEAD, &svsk->sk_xprt.xpt_flags))
	/* Grab mutex to serialize outgoing data. */
	mutex_lock(&xprt->xpt_mutex);
	if (test_bit(XPT_DEAD, &xprt->xpt_flags))
		len = -ENOTCONN;
	else
		len = svsk->sk_xprt.xpt_ops->xpo_sendto(rqstp);
	mutex_unlock(&svsk->sk_mutex);
		len = xprt->xpt_ops->xpo_sendto(rqstp);
	mutex_unlock(&xprt->xpt_mutex);
	svc_sock_release(rqstp);

	if (len == -ECONNREFUSED || len == -ENOTCONN || len == -EAGAIN)
@@ -1759,7 +1757,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
	svsk->sk_lastrecv = get_seconds();
	spin_lock_init(&svsk->sk_lock);
	INIT_LIST_HEAD(&svsk->sk_deferred);
	mutex_init(&svsk->sk_mutex);

	/* Initialize the socket */
	if (sock->type == SOCK_DGRAM)