From: Tom Tucker <tom@opengridcomputing.com>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: neilb@suse.de, bfields@fieldses.org, nfs@lists.sourceforge.net,
gnb@sgi.com
Subject: Re: [RFC, PATCH 12/35] svc: Add a generic transport svc_create_xprt function
Date: Wed, 03 Oct 2007 15:01:09 -0500 [thread overview]
Message-ID: <1191441669.1918.8.camel@trinity.ogc.int> (raw)
In-Reply-To: <383DDDA6-29E5-41CF-A2F7-9C45BB26CE64@oracle.com>
On Tue, 2007-10-02 at 11:39 -0400, Chuck Lever wrote:
> On Oct 1, 2007, at 3:27 PM, Tom Tucker wrote:
> >
[...snip...]
> >
> > struct svc_xprt_ops {
> > + struct svc_xprt *(*xpo_create)(struct svc_serv *,
> > + struct sockaddr *,
> > + int);
>
> Should xpo_create also have a length argument, as in (struct sockaddr
> *, socklen_t) ?
I think socklen_t is only defined in userland.
>
> (or whatever the type of sockaddr lengths are: size_t perhaps?)
>
I've seen it both ways. I just copied kernel_bind which takes an int for
the length. Does anyone know what the preferred type is for sockaddr
len?
> > struct svc_xprt *(*xpo_accept)(struct svc_xprt *);
> > int (*xpo_has_wspace)(struct svc_xprt *);
> > int (*xpo_recvfrom)(struct svc_rqst *);
> > @@ -37,5 +40,6 @@ struct svc_xprt {
> > int svc_reg_xprt_class(struct svc_xprt_class *);
> > int svc_unreg_xprt_class(struct svc_xprt_class *);
> > void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *);
> > +int svc_create_xprt(struct svc_serv *, char *, unsigned short, int);
> >
> > #endif /* SUNRPC_SVC_XPRT_H */
> > diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
> > index 8ea65c3..d57064f 100644
> > --- a/net/sunrpc/svc_xprt.c
> > +++ b/net/sunrpc/svc_xprt.c
> > @@ -93,3 +93,38 @@ void svc_xprt_init(struct svc_xprt_class
> > xpt->xpt_max_payload = xcl->xcl_max_payload;
> > }
> > EXPORT_SYMBOL_GPL(svc_xprt_init);
> > +
> > +int svc_create_xprt(struct svc_serv *serv, char *xprt_name,
> > unsigned short port,
> > + int flags)
> > +{
> > + struct svc_xprt_class *xcl;
> > + int ret = -ENOENT;
> > + struct sockaddr_in sin = {
> > + .sin_family = AF_INET,
> > + .sin_addr.s_addr = INADDR_ANY,
> > + .sin_port = htons(port),
> > + };
> > + dprintk("svc: creating transport %s[%d]\n", xprt_name, port);
> > + spin_lock(&svc_xprt_class_lock);
> > + list_for_each_entry(xcl, &svc_xprt_class_list, xcl_list) {
> > + if (strcmp(xprt_name, xcl->xcl_name) == 0) {
> > + spin_unlock(&svc_xprt_class_lock);
> > + if (try_module_get(xcl->xcl_owner)) {
> > + struct svc_xprt *newxprt;
> > + ret = 0;
> > + newxprt = xcl->xcl_ops->xpo_create
> > + (serv, (struct sockaddr *)&sin, flags);
> > + if (IS_ERR(newxprt)) {
> > + module_put(xcl->xcl_owner);
> > + ret = PTR_ERR(newxprt);
> > + }
> > + }
> > + goto out;
> > + }
> > + }
> > + spin_unlock(&svc_xprt_class_lock);
> > + dprintk("svc: transport %s not found\n", xprt_name);
> > + out:
> > + return ret;
> > +}
> > +EXPORT_SYMBOL_GPL(svc_create_xprt);
> > diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
> > index ffc54a1..e3c74e0 100644
> > --- a/net/sunrpc/svcsock.c
> > +++ b/net/sunrpc/svcsock.c
> > @@ -90,6 +90,8 @@ static void svc_sock_free(struct svc_xp
> > static struct svc_deferred_req *svc_deferred_dequeue(struct
> > svc_sock *svsk);
> > static int svc_deferred_recv(struct svc_rqst *rqstp);
> > static struct cache_deferred_req *svc_defer(struct cache_req *req);
> > +static struct svc_xprt *
> > +svc_create_socket(struct svc_serv *, int, struct sockaddr *, int,
> > int);
> >
> > /* apparently the "standard" is that clients close
> > * idle connections after 5 minutes, servers after
> > @@ -381,6 +383,7 @@ svc_sock_put(struct svc_sock *svsk)
> > {
> > if (atomic_dec_and_test(&svsk->sk_inuse)) {
> > BUG_ON(!test_bit(SK_DEAD, &svsk->sk_flags));
> > + module_put(svsk->sk_xprt.xpt_class->xcl_owner);
> > svsk->sk_xprt.xpt_ops.xpo_free(&svsk->sk_xprt);
> > }
> > }
> > @@ -921,7 +924,15 @@ svc_udp_accept(struct svc_xprt *xprt)
> > return NULL;
> > }
> >
> > +static struct svc_xprt *
> > +svc_udp_create(struct svc_serv *serv, struct sockaddr *sa, int flags)
> > +{
> > + return svc_create_socket(serv, IPPROTO_UDP, sa,
> > + sizeof(struct sockaddr_in), flags);
> > +}
> > +
> > static struct svc_xprt_ops svc_udp_ops = {
> > + .xpo_create = svc_udp_create,
> > .xpo_recvfrom = svc_udp_recvfrom,
> > .xpo_sendto = svc_udp_sendto,
> > .xpo_release = svc_release_skb,
> > @@ -934,6 +945,7 @@ static struct svc_xprt_ops svc_udp_ops =
> >
> > static struct svc_xprt_class svc_udp_class = {
> > .xcl_name = "udp",
> > + .xcl_owner = THIS_MODULE,
> > .xcl_ops = &svc_udp_ops,
> > .xcl_max_payload = RPCSVC_MAXPAYLOAD_UDP,
> > };
> > @@ -1357,7 +1369,15 @@ svc_tcp_has_wspace(struct svc_xprt *xprt
> > return 1;
> > }
> >
> > +static struct svc_xprt *
> > +svc_tcp_create(struct svc_serv *serv, struct sockaddr *sa, int flags)
> > +{
> > + return svc_create_socket(serv, IPPROTO_TCP, sa,
> > + sizeof(struct sockaddr_in), flags);
> > +}
> > +
> > static struct svc_xprt_ops svc_tcp_ops = {
> > + .xpo_create = svc_tcp_create,
> > .xpo_recvfrom = svc_tcp_recvfrom,
> > .xpo_sendto = svc_tcp_sendto,
> > .xpo_release = svc_release_skb,
> > @@ -1370,6 +1390,7 @@ static struct svc_xprt_ops svc_tcp_ops =
> >
> > static struct svc_xprt_class svc_tcp_class = {
> > .xcl_name = "tcp",
> > + .xcl_owner = THIS_MODULE,
> > .xcl_ops = &svc_tcp_ops,
> > .xcl_max_payload = RPCSVC_MAXPAYLOAD_TCP,
> > };
> > @@ -1594,8 +1615,14 @@ svc_recv(struct svc_rqst *rqstp, long ti
> > } else if (test_bit(SK_LISTENER, &svsk->sk_flags)) {
> > struct svc_xprt *newxpt;
> > newxpt = svsk->sk_xprt.xpt_ops.xpo_accept(&svsk->sk_xprt);
> > - if (newxpt)
> > + if (newxpt) {
> > + /*
> > + * We know this module_get will succeed because the
> > + * listener holds a reference too
> > + */
> > + __module_get(newxpt->xpt_class->xcl_owner);
> > svc_check_conn_limits(svsk->sk_server);
> > + }
> > svc_sock_received(svsk);
> > } else {
> > dprintk("svc: server %p, pool %u, socket %p, inuse=%d\n",
> > @@ -1835,8 +1862,9 @@ EXPORT_SYMBOL_GPL(svc_addsock);
> > /*
> > * Create socket for RPC service.
> > */
> > -static int svc_create_socket(struct svc_serv *serv, int protocol,
> > - struct sockaddr *sin, int len, int flags)
> > +static struct svc_xprt *
> > +svc_create_socket(struct svc_serv *serv, int protocol,
> > + struct sockaddr *sin, int len, int flags)
> > {
> > struct svc_sock *svsk;
> > struct socket *sock;
> > @@ -1851,13 +1879,13 @@ static int svc_create_socket(struct svc_
> > if (protocol != IPPROTO_UDP && protocol != IPPROTO_TCP) {
> > printk(KERN_WARNING "svc: only UDP and TCP "
> > "sockets supported\n");
> > - return -EINVAL;
> > + return ERR_PTR(-EINVAL);
> > }
> > type = (protocol == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM;
> >
> > error = sock_create_kern(sin->sa_family, type, protocol, &sock);
> > if (error < 0)
> > - return error;
> > + return ERR_PTR(error);
> >
> > svc_reclassify_socket(sock);
> >
> > @@ -1876,13 +1904,13 @@ static int svc_create_socket(struct svc_
> > if (protocol == IPPROTO_TCP)
> > set_bit(SK_LISTENER, &svsk->sk_flags);
> > svc_sock_received(svsk);
> > - return ntohs(inet_sk(svsk->sk_sk)->sport);
> > + return (struct svc_xprt *)svsk;
> > }
> >
> > bummer:
> > dprintk("svc: svc_create_socket error = %d\n", -error);
> > sock_release(sock);
> > - return error;
> > + return ERR_PTR(error);
> > }
> >
> > /*
> > @@ -1995,15 +2023,15 @@ void svc_force_close_socket(struct svc_s
> > int svc_makesock(struct svc_serv *serv, int protocol, unsigned
> > short port,
> > int flags)
> > {
> > - struct sockaddr_in sin = {
> > - .sin_family = AF_INET,
> > - .sin_addr.s_addr = INADDR_ANY,
> > - .sin_port = htons(port),
> > - };
> > -
> > dprintk("svc: creating socket proto = %d\n", protocol);
> > - return svc_create_socket(serv, protocol, (struct sockaddr *) &sin,
> > - sizeof(sin), flags);
> > + switch (protocol) {
> > + case IPPROTO_TCP:
> > + return svc_create_xprt(serv, "tcp", port, flags);
> > + case IPPROTO_UDP:
> > + return svc_create_xprt(serv, "udp", port, flags);
> > + default:
> > + return -EINVAL;
> > + }
> > }
> >
> > /*
>
> Chuck Lever
> chuck.lever@oracle.com
>
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs
next prev parent reply other threads:[~2007-10-03 20:02 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-01 19:14 [RFC,PATCH 00/35] SVC Transport Switch Tom Tucker
2007-10-01 19:27 ` [RFC,PATCH 01/35] svc: Add an svc transport class Tom Tucker
2007-10-01 19:27 ` [RFC,PATCH 02/35] svc: Make svc_sock the tcp/udp transport Tom Tucker
2007-10-01 19:27 ` [RFC, PATCH 03/35] svc: Change the svc_sock in the rqstp structure to a transport Tom Tucker
2007-10-01 19:27 ` [RFC, PATCH 04/35] svc: Add a max payload value to the transport Tom Tucker
2007-10-02 14:54 ` Chuck Lever
2007-10-02 16:28 ` Tom Tucker
2007-10-03 11:09 ` Greg Banks
2007-10-03 14:26 ` Tom Tucker
2007-10-03 15:18 ` Chuck Lever
2007-10-04 1:10 ` Greg Banks
2007-10-01 19:27 ` [RFC, PATCH 05/35] svc: Move sk_sendto and sk_recvfrom to svc_xprt_class Tom Tucker
2007-10-02 15:04 ` Chuck Lever
2007-10-02 16:29 ` Tom Tucker
2007-10-02 16:57 ` Chuck Lever
2007-10-02 18:24 ` Tom Tucker
2007-10-02 18:30 ` Tom Tucker
2007-10-02 18:47 ` Chuck Lever
2007-10-02 19:55 ` Tom Tucker
2007-10-02 20:29 ` Chuck Lever
2007-10-02 20:35 ` Tom Tucker
2007-10-02 20:38 ` Tom Tucker
2007-10-04 1:34 ` Greg Banks
2007-10-04 1:21 ` Greg Banks
2007-10-03 11:13 ` Greg Banks
2007-10-01 19:27 ` [RFC, PATCH 06/35] svc: Add transport specific xpo_release function Tom Tucker
2007-10-02 15:18 ` Chuck Lever
2007-10-02 16:35 ` Tom Tucker
2007-10-04 1:48 ` Greg Banks
2007-10-01 19:27 ` [RFC,PATCH 07/35] svc: Add per-transport delete functions Tom Tucker
2007-10-01 19:27 ` [RFC,PATCH 08/35] svc: Add xpo_prep_reply_hdr Tom Tucker
2007-10-01 19:27 ` [RFC, PATCH 09/35] svc: Add a transport function that checks for write space Tom Tucker
2007-10-01 19:27 ` [RFC, PATCH 10/35] svc: Move close processing to a single place Tom Tucker
2007-10-01 19:27 ` [RFC,PATCH 11/35] svc: Add xpo_accept transport function Tom Tucker
2007-10-02 15:33 ` Chuck Lever
2007-10-02 16:41 ` Tom Tucker
2007-10-02 17:07 ` Chuck Lever
2007-10-02 18:28 ` Tom Tucker
2007-10-02 18:49 ` Chuck Lever
2007-10-04 1:54 ` Greg Banks
2007-10-01 19:27 ` [RFC, PATCH 12/35] svc: Add a generic transport svc_create_xprt function Tom Tucker
2007-10-02 15:39 ` Chuck Lever
2007-10-03 20:01 ` Tom Tucker [this message]
2007-10-03 20:04 ` Tom Tucker
2007-10-04 2:30 ` Greg Banks
2007-10-04 15:18 ` Chuck Lever
2007-10-01 19:27 ` [RFC, PATCH 13/35] svc: Change services to use new svc_create_xprt service Tom Tucker
2007-10-02 15:44 ` Chuck Lever
2007-10-02 16:45 ` Tom Tucker
2007-10-03 15:25 ` Chuck Lever
2007-10-03 16:23 ` Tom Tucker
2007-10-04 2:35 ` Greg Banks
2007-10-04 14:27 ` Tom Tucker
2007-10-09 17:09 ` J. Bruce Fields
2007-10-09 18:32 ` Tom Tucker
2007-10-09 19:49 ` J. Bruce Fields
2007-10-09 20:19 ` J. Bruce Fields
2007-10-01 19:28 ` [RFC,PATCH 14/35] svc: Change sk_inuse to a kref Tom Tucker
2007-10-03 11:12 ` Christoph Hellwig
2007-10-03 14:39 ` Tom Tucker
2007-10-03 14:45 ` J. Bruce Fields
2007-10-03 14:52 ` Christoph Hellwig
2007-10-03 15:11 ` J. Bruce Fields
2007-10-03 15:15 ` Christoph Hellwig
2007-10-08 3:52 ` Neil Brown
2007-10-03 15:13 ` Chuck Lever
2007-10-03 15:34 ` J. Bruce Fields
2007-10-04 2:51 ` Greg Banks
2007-10-01 19:28 ` [RFC, PATCH 15/35] svc: Move sk_flags to the svc_xprt structure Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 16/35] svc: Move sk_server and sk_pool to svc_xprt Tom Tucker
2007-10-01 19:28 ` [RFC,PATCH 17/35] svc: Make close transport independent Tom Tucker
2007-10-01 19:28 ` [RFC,PATCH 18/35] svc: Move sk_reserved to svc_xprt Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 19/35] svc: Make the enqueue service transport neutral and export it Tom Tucker
2007-10-01 19:28 ` [RFC,PATCH 20/35] svc: Make svc_send transport neutral Tom Tucker
2007-10-02 16:15 ` Chuck Lever
2007-10-02 16:46 ` Tom Tucker
2007-10-02 16:54 ` Chuck Lever
2007-10-04 2:59 ` Greg Banks
2007-10-01 19:28 ` [RFC, PATCH 21/35] svc: Change svc_sock_received to svc_xprt_received and export it Tom Tucker
2007-10-02 16:18 ` Chuck Lever
2007-10-01 19:28 ` [RFC,PATCH 22/35] svc: Remove sk_lastrecv Tom Tucker
2007-10-01 19:28 ` [RFC,PATCH 23/35] svc: Move the authinfo cache to svc_xprt Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 24/35] svc: Make deferral processing xprt independent Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 25/35] svc: Move the sockaddr information to svc_xprt Tom Tucker
2007-10-02 16:34 ` Chuck Lever
2007-10-02 16:50 ` Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 26/35] svc: Make svc_sock_release svc_xprt_release Tom Tucker
2007-10-01 19:28 ` [RFC,PATCH 27/35] svc: Make svc_recv transport neutral Tom Tucker
2007-10-02 16:36 ` Chuck Lever
2007-10-01 19:28 ` [RFC, PATCH 28/35] svc: Make svc_age_temp_sockets svc_age_temp_transports Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 29/35] svc: Move common create logic to common code Tom Tucker
2007-10-02 16:42 ` Chuck Lever
2007-10-02 16:51 ` Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 30/35] svc: Removing remaining references to rq_sock in rqstp Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 31/35] svc: Make svc_check_conn_limits xprt independent Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 32/35] svc: Move the xprt independent code to the svc_xprt.c file Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 33/35] svc: Add transport hdr size for defer/revisit Tom Tucker
2007-10-01 19:28 ` [RFC,PATCH 34/35] svc: Add /proc/sys/sunrpc/transport files Tom Tucker
2007-10-01 19:28 ` [RFC, PATCH 35/35] knfsd: Support adding transports by writing portlist file Tom Tucker
2007-10-02 15:25 ` [RFC,PATCH 00/35] SVC Transport Switch J. Bruce Fields
2007-10-02 16:18 ` Tom Tucker
2007-10-03 11:03 ` Greg Banks
2007-10-03 14:02 ` Tom Tucker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1191441669.1918.8.camel@trinity.ogc.int \
--to=tom@opengridcomputing.com \
--cc=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=gnb@sgi.com \
--cc=neilb@suse.de \
--cc=nfs@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox