Linux NFS development
 help / color / mirror / Atom feed
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

  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