svc: Move sk_sendto and sk_recvfrom to svc_xprt_class
The sk_sendto and sk_recvfrom are function pointers that allow svc_sock to be used for both UDP and TCP. Move these function pointers to the svc_xprt_ops 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>
This commit is contained in:
committed by
J. Bruce Fields
parent
490231558e
commit
5d137990f5
@@ -10,6 +10,8 @@
|
|||||||
#include <linux/sunrpc/svc.h>
|
#include <linux/sunrpc/svc.h>
|
||||||
|
|
||||||
struct svc_xprt_ops {
|
struct svc_xprt_ops {
|
||||||
|
int (*xpo_recvfrom)(struct svc_rqst *);
|
||||||
|
int (*xpo_sendto)(struct svc_rqst *);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct svc_xprt_class {
|
struct svc_xprt_class {
|
||||||
|
@@ -45,9 +45,6 @@ struct svc_sock {
|
|||||||
* be revisted */
|
* be revisted */
|
||||||
struct mutex sk_mutex; /* to serialize sending data */
|
struct mutex sk_mutex; /* to serialize sending data */
|
||||||
|
|
||||||
int (*sk_recvfrom)(struct svc_rqst *rqstp);
|
|
||||||
int (*sk_sendto)(struct svc_rqst *rqstp);
|
|
||||||
|
|
||||||
/* We keep the old state_change and data_ready CB's here */
|
/* We keep the old state_change and data_ready CB's here */
|
||||||
void (*sk_ostate)(struct sock *);
|
void (*sk_ostate)(struct sock *);
|
||||||
void (*sk_odata)(struct sock *, int bytes);
|
void (*sk_odata)(struct sock *, int bytes);
|
||||||
|
@@ -901,6 +901,8 @@ svc_udp_sendto(struct svc_rqst *rqstp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct svc_xprt_ops svc_udp_ops = {
|
static struct svc_xprt_ops svc_udp_ops = {
|
||||||
|
.xpo_recvfrom = svc_udp_recvfrom,
|
||||||
|
.xpo_sendto = svc_udp_sendto,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct svc_xprt_class svc_udp_class = {
|
static struct svc_xprt_class svc_udp_class = {
|
||||||
@@ -918,8 +920,6 @@ svc_udp_init(struct svc_sock *svsk)
|
|||||||
svc_xprt_init(&svc_udp_class, &svsk->sk_xprt);
|
svc_xprt_init(&svc_udp_class, &svsk->sk_xprt);
|
||||||
svsk->sk_sk->sk_data_ready = svc_udp_data_ready;
|
svsk->sk_sk->sk_data_ready = svc_udp_data_ready;
|
||||||
svsk->sk_sk->sk_write_space = svc_write_space;
|
svsk->sk_sk->sk_write_space = svc_write_space;
|
||||||
svsk->sk_recvfrom = svc_udp_recvfrom;
|
|
||||||
svsk->sk_sendto = svc_udp_sendto;
|
|
||||||
|
|
||||||
/* initialise setting must have enough space to
|
/* initialise setting must have enough space to
|
||||||
* receive and respond to one request.
|
* receive and respond to one request.
|
||||||
@@ -1355,6 +1355,8 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct svc_xprt_ops svc_tcp_ops = {
|
static struct svc_xprt_ops svc_tcp_ops = {
|
||||||
|
.xpo_recvfrom = svc_tcp_recvfrom,
|
||||||
|
.xpo_sendto = svc_tcp_sendto,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct svc_xprt_class svc_tcp_class = {
|
static struct svc_xprt_class svc_tcp_class = {
|
||||||
@@ -1382,8 +1384,6 @@ svc_tcp_init(struct svc_sock *svsk)
|
|||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
|
|
||||||
svc_xprt_init(&svc_tcp_class, &svsk->sk_xprt);
|
svc_xprt_init(&svc_tcp_class, &svsk->sk_xprt);
|
||||||
svsk->sk_recvfrom = svc_tcp_recvfrom;
|
|
||||||
svsk->sk_sendto = svc_tcp_sendto;
|
|
||||||
|
|
||||||
if (sk->sk_state == TCP_LISTEN) {
|
if (sk->sk_state == TCP_LISTEN) {
|
||||||
dprintk("setting up TCP socket for listening\n");
|
dprintk("setting up TCP socket for listening\n");
|
||||||
@@ -1531,7 +1531,7 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
|
|||||||
|
|
||||||
dprintk("svc: server %p, pool %u, socket %p, inuse=%d\n",
|
dprintk("svc: server %p, pool %u, socket %p, inuse=%d\n",
|
||||||
rqstp, pool->sp_id, svsk, atomic_read(&svsk->sk_inuse));
|
rqstp, pool->sp_id, svsk, atomic_read(&svsk->sk_inuse));
|
||||||
len = svsk->sk_recvfrom(rqstp);
|
len = svsk->sk_xprt.xpt_ops->xpo_recvfrom(rqstp);
|
||||||
dprintk("svc: got len=%d\n", len);
|
dprintk("svc: got len=%d\n", len);
|
||||||
|
|
||||||
/* No data, incomplete (TCP) read, or accept() */
|
/* No data, incomplete (TCP) read, or accept() */
|
||||||
@@ -1591,7 +1591,7 @@ svc_send(struct svc_rqst *rqstp)
|
|||||||
if (test_bit(SK_DEAD, &svsk->sk_flags))
|
if (test_bit(SK_DEAD, &svsk->sk_flags))
|
||||||
len = -ENOTCONN;
|
len = -ENOTCONN;
|
||||||
else
|
else
|
||||||
len = svsk->sk_sendto(rqstp);
|
len = svsk->sk_xprt.xpt_ops->xpo_sendto(rqstp);
|
||||||
mutex_unlock(&svsk->sk_mutex);
|
mutex_unlock(&svsk->sk_mutex);
|
||||||
svc_sock_release(rqstp);
|
svc_sock_release(rqstp);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user