svc: Make svc_send transport neutral
authorTom Tucker <tom@opengridcomputing.com>
Mon, 31 Dec 2007 03:07:59 +0000 (21:07 -0600)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Fri, 1 Feb 2008 21:42:11 +0000 (16:42 -0500)
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: Tom Tucker <tom@opengridcomputing.com>
Acked-by: Neil Brown <neilb@suse.de>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Greg Banks <gnb@sgi.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
include/linux/sunrpc/svc_xprt.h
include/linux/sunrpc/svcsock.h
net/sunrpc/svc_xprt.c
net/sunrpc/svcsock.c

index 0b8ee06..1b8c596 100644 (file)
@@ -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 *);
index ba41f11..41c2dfa 100644 (file)
@@ -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 *);
index 95186b5..3e6a1c8 100644 (file)
@@ -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);
 
index d95a0c8..2016d9c 100644 (file)
@@ -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)