diff options
author | Tom Tucker <tom@opengridcomputing.com> | 2007-12-30 22:07:17 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2008-02-01 16:42:07 -0500 |
commit | 360d873864c8903a650b227758b49dd50e6ecc9f (patch) | |
tree | 806631491e4848b194abd539293f124b366a49de | |
parent | 1d8206b97a09e7ff2fbef17d8d1ea008d764eeaa (diff) |
svc: Make svc_sock the tcp/udp transport
Make TCP and UDP svc_sock transports, and register them
with the svc transport core.
A transport type (svc_sock) has an svc_xprt as its first member,
and calls svc_xprt_init to initialize this field.
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>
-rw-r--r-- | include/linux/sunrpc/debug.h | 1 | ||||
-rw-r--r-- | include/linux/sunrpc/svcsock.h | 4 | ||||
-rw-r--r-- | net/sunrpc/sunrpc_syms.c | 4 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 32 |
4 files changed, 38 insertions, 3 deletions
diff --git a/include/linux/sunrpc/debug.h b/include/linux/sunrpc/debug.h index 092fcfa9ceb9..10709cbe96fd 100644 --- a/include/linux/sunrpc/debug.h +++ b/include/linux/sunrpc/debug.h | |||
@@ -20,7 +20,6 @@ | |||
20 | #define RPCDBG_BIND 0x0020 | 20 | #define RPCDBG_BIND 0x0020 |
21 | #define RPCDBG_SCHED 0x0040 | 21 | #define RPCDBG_SCHED 0x0040 |
22 | #define RPCDBG_TRANS 0x0080 | 22 | #define RPCDBG_TRANS 0x0080 |
23 | #define RPCDBG_SVCSOCK 0x0100 | ||
24 | #define RPCDBG_SVCXPRT 0x0100 | 23 | #define RPCDBG_SVCXPRT 0x0100 |
25 | #define RPCDBG_SVCDSP 0x0200 | 24 | #define RPCDBG_SVCDSP 0x0200 |
26 | #define RPCDBG_MISC 0x0400 | 25 | #define RPCDBG_MISC 0x0400 |
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h index a53e0fa855d2..1878cbe1aa4f 100644 --- a/include/linux/sunrpc/svcsock.h +++ b/include/linux/sunrpc/svcsock.h | |||
@@ -10,11 +10,13 @@ | |||
10 | #define SUNRPC_SVCSOCK_H | 10 | #define SUNRPC_SVCSOCK_H |
11 | 11 | ||
12 | #include <linux/sunrpc/svc.h> | 12 | #include <linux/sunrpc/svc.h> |
13 | #include <linux/sunrpc/svc_xprt.h> | ||
13 | 14 | ||
14 | /* | 15 | /* |
15 | * RPC server socket. | 16 | * RPC server socket. |
16 | */ | 17 | */ |
17 | struct svc_sock { | 18 | struct svc_sock { |
19 | struct svc_xprt sk_xprt; | ||
18 | struct list_head sk_ready; /* list of ready sockets */ | 20 | struct list_head sk_ready; /* list of ready sockets */ |
19 | struct list_head sk_list; /* list of all sockets */ | 21 | struct list_head sk_list; /* list of all sockets */ |
20 | struct socket * sk_sock; /* berkeley socket layer */ | 22 | struct socket * sk_sock; /* berkeley socket layer */ |
@@ -78,6 +80,8 @@ int svc_addsock(struct svc_serv *serv, | |||
78 | int fd, | 80 | int fd, |
79 | char *name_return, | 81 | char *name_return, |
80 | int *proto); | 82 | int *proto); |
83 | void svc_init_xprt_sock(void); | ||
84 | void svc_cleanup_xprt_sock(void); | ||
81 | 85 | ||
82 | /* | 86 | /* |
83 | * svc_makesock socket characteristics | 87 | * svc_makesock socket characteristics |
diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c index ef7dc78e2c7b..11b309817b8f 100644 --- a/net/sunrpc/sunrpc_syms.c +++ b/net/sunrpc/sunrpc_syms.c | |||
@@ -85,7 +85,8 @@ init_sunrpc(void) | |||
85 | #endif | 85 | #endif |
86 | cache_register(&ip_map_cache); | 86 | cache_register(&ip_map_cache); |
87 | cache_register(&unix_gid_cache); | 87 | cache_register(&unix_gid_cache); |
88 | init_socket_xprt(); | 88 | svc_init_xprt_sock(); /* svc sock transport */ |
89 | init_socket_xprt(); /* clnt sock transport */ | ||
89 | rpcauth_init_module(); | 90 | rpcauth_init_module(); |
90 | out: | 91 | out: |
91 | return err; | 92 | return err; |
@@ -96,6 +97,7 @@ cleanup_sunrpc(void) | |||
96 | { | 97 | { |
97 | rpcauth_remove_module(); | 98 | rpcauth_remove_module(); |
98 | cleanup_socket_xprt(); | 99 | cleanup_socket_xprt(); |
100 | svc_cleanup_xprt_sock(); | ||
99 | unregister_rpc_pipefs(); | 101 | unregister_rpc_pipefs(); |
100 | rpc_destroy_mempool(); | 102 | rpc_destroy_mempool(); |
101 | cache_unregister(&ip_map_cache); | 103 | cache_unregister(&ip_map_cache); |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index c75bffeb89eb..54f1b3d993a6 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -75,7 +75,7 @@ | |||
75 | * | 75 | * |
76 | */ | 76 | */ |
77 | 77 | ||
78 | #define RPCDBG_FACILITY RPCDBG_SVCSOCK | 78 | #define RPCDBG_FACILITY RPCDBG_SVCXPRT |
79 | 79 | ||
80 | 80 | ||
81 | static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *, | 81 | static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *, |
@@ -900,12 +900,21 @@ svc_udp_sendto(struct svc_rqst *rqstp) | |||
900 | return error; | 900 | return error; |
901 | } | 901 | } |
902 | 902 | ||
903 | static struct svc_xprt_ops svc_udp_ops = { | ||
904 | }; | ||
905 | |||
906 | static struct svc_xprt_class svc_udp_class = { | ||
907 | .xcl_name = "udp", | ||
908 | .xcl_ops = &svc_udp_ops, | ||
909 | }; | ||
910 | |||
903 | static void | 911 | static void |
904 | svc_udp_init(struct svc_sock *svsk) | 912 | svc_udp_init(struct svc_sock *svsk) |
905 | { | 913 | { |
906 | int one = 1; | 914 | int one = 1; |
907 | mm_segment_t oldfs; | 915 | mm_segment_t oldfs; |
908 | 916 | ||
917 | svc_xprt_init(&svc_udp_class, &svsk->sk_xprt); | ||
909 | svsk->sk_sk->sk_data_ready = svc_udp_data_ready; | 918 | svsk->sk_sk->sk_data_ready = svc_udp_data_ready; |
910 | svsk->sk_sk->sk_write_space = svc_write_space; | 919 | svsk->sk_sk->sk_write_space = svc_write_space; |
911 | svsk->sk_recvfrom = svc_udp_recvfrom; | 920 | svsk->sk_recvfrom = svc_udp_recvfrom; |
@@ -1344,12 +1353,33 @@ svc_tcp_sendto(struct svc_rqst *rqstp) | |||
1344 | return sent; | 1353 | return sent; |
1345 | } | 1354 | } |
1346 | 1355 | ||
1356 | static struct svc_xprt_ops svc_tcp_ops = { | ||
1357 | }; | ||
1358 | |||
1359 | static struct svc_xprt_class svc_tcp_class = { | ||
1360 | .xcl_name = "tcp", | ||
1361 | .xcl_ops = &svc_tcp_ops, | ||
1362 | }; | ||
1363 | |||
1364 | void svc_init_xprt_sock(void) | ||
1365 | { | ||
1366 | svc_reg_xprt_class(&svc_tcp_class); | ||
1367 | svc_reg_xprt_class(&svc_udp_class); | ||
1368 | } | ||
1369 | |||
1370 | void svc_cleanup_xprt_sock(void) | ||
1371 | { | ||
1372 | svc_unreg_xprt_class(&svc_tcp_class); | ||
1373 | svc_unreg_xprt_class(&svc_udp_class); | ||
1374 | } | ||
1375 | |||
1347 | static void | 1376 | static void |
1348 | svc_tcp_init(struct svc_sock *svsk) | 1377 | svc_tcp_init(struct svc_sock *svsk) |
1349 | { | 1378 | { |
1350 | struct sock *sk = svsk->sk_sk; | 1379 | struct sock *sk = svsk->sk_sk; |
1351 | struct tcp_sock *tp = tcp_sk(sk); | 1380 | struct tcp_sock *tp = tcp_sk(sk); |
1352 | 1381 | ||
1382 | svc_xprt_init(&svc_tcp_class, &svsk->sk_xprt); | ||
1353 | svsk->sk_recvfrom = svc_tcp_recvfrom; | 1383 | svsk->sk_recvfrom = svc_tcp_recvfrom; |
1354 | svsk->sk_sendto = svc_tcp_sendto; | 1384 | svsk->sk_sendto = svc_tcp_sendto; |
1355 | 1385 | ||