All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: aime.le-rouzic@bull.net, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 08/22] SUNRPC: pass buffer size to svc_addsock() and svc_sock_names()
Date: Wed, 24 Dec 2008 23:43:06 -0500	[thread overview]
Message-ID: <20081225044306.GC17998@fieldses.org> (raw)
In-Reply-To: <20081212215804.24332.24605.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>

On Fri, Dec 12, 2008 at 04:58:05PM -0500, Chuck Lever wrote:
> Pass the size of the output buffer to the RPC functions that construct
> the list of socket names in that buffer.  Add documenting comments to
> these functions.
> 
> This is a cosmetic change for now.  A subsequent patch will make sure
> the buffer length is passed to one_sock_name(), where the length will
> actually be useful.
> 
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
> 
>  fs/nfsd/nfsctl.c               |   12 ++++++++----
>  include/linux/sunrpc/svcsock.h |    6 ++++--
>  net/sunrpc/svcsock.c           |   34 +++++++++++++++++++++++++++++-----
>  3 files changed, 41 insertions(+), 11 deletions(-)
> 
> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> index 22fc8e5..19db9f4 100644
> --- a/fs/nfsd/nfsctl.c
> +++ b/fs/nfsd/nfsctl.c
> @@ -898,7 +898,7 @@ static ssize_t __write_ports_names(char *buf, size_t size)
>  static ssize_t __write_ports_addfd(char *buf, size_t size)
>  {
>  	char *mesg = buf;
> -	int fd, err;
> +	int fd, err, len;
>  
>  	err = get_int(&mesg, &fd);
>  	if (err || fd < 0)
> @@ -908,13 +908,16 @@ static ssize_t __write_ports_addfd(char *buf, size_t size)
>  	if (err)
>  		return err;
>  
> -	err = svc_addsock(nfsd_serv, fd, buf);
> +	len = SIMPLE_TRANSACTION_LIMIT;
> +	err = svc_addsock(nfsd_serv, fd, buf, len);
>  	if (err < 0)
>  		return err;
> +	len -= err;
>  
>  	err = lockd_up();
>  	if (err < 0)
> -		svc_sock_names(buf + strlen(buf) + 1, nfsd_serv, buf);
> +		svc_sock_names(nfsd_serv, buf + strlen(buf) + 1,
> +				len - strlen(buf) - 1, buf);

Since you already did len -= err above, aren't you effectly subtracing
off strlen(buf) twice here?  (And should that "len -= err" actually have
been a "len -= err + 1"?)

>  
>  	/* Decrease the count, but don't shut down the the service */
>  	nfsd_serv->sv_nrthreads--;
> @@ -935,7 +938,8 @@ static ssize_t __write_ports_delfd(char *buf, size_t size)
>  		return -ENOMEM;
>  
>  	if (nfsd_serv)
> -		len = svc_sock_names(buf, nfsd_serv, toclose);
> +		len = svc_sock_names(nfsd_serv, buf,
> +					SIMPLE_TRANSACTION_LIMIT, toclose);
>  	if (len >= 0)
>  		lockd_down();
>  
> diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h
> index 483e103..f57ce85 100644
> --- a/include/linux/sunrpc/svcsock.h
> +++ b/include/linux/sunrpc/svcsock.h
> @@ -38,8 +38,10 @@ int		svc_recv(struct svc_rqst *, long);
>  int		svc_send(struct svc_rqst *);
>  void		svc_drop(struct svc_rqst *);
>  void		svc_sock_update_bufs(struct svc_serv *serv);
> -int		svc_sock_names(char *buf, struct svc_serv *serv, char *toclose);
> -int		svc_addsock(struct svc_serv *serv, int fd, char *name_return);
> +int		svc_sock_names(struct svc_serv *serv, char *buf, size_t buflen,
> +					char *toclose);
> +int		svc_addsock(struct svc_serv *serv, int fd, char *name_return,
> +					size_t len);
>  void		svc_init_xprt_sock(void);
>  void		svc_cleanup_xprt_sock(void);
>  
> diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
> index a1951dc..39f5015 100644
> --- a/net/sunrpc/svcsock.c
> +++ b/net/sunrpc/svcsock.c
> @@ -263,8 +263,23 @@ static int one_sock_name(char *buf, struct svc_sock *svsk)
>  	return len;
>  }
>  
> -int
> -svc_sock_names(char *buf, struct svc_serv *serv, char *toclose)
> +/**
> + * svc_sock_names - construct a list of listener names in a string
> + * @serv: pointer to RPC service
> + * @buf: pointer to a buffer to fill in with socket names
> + * @buflen: size of the buffer to be filled
> + * @toclose: pointer to '\0'-terminated C string containing the name
> + *		of a listener to be closed
> + *
> + * Fills in @buf with a '\n'-separated list of names of listener
> + * sockets.  If @toclose is not NULL, the socket named by @toclose
> + * is closed, and is not included in the output list.
> + *
> + * Returns positive length of the socket name string, or a negative
> + * errno value on error.
> + */
> +int svc_sock_names(struct svc_serv *serv, char *buf, size_t buflen,
> +		   char *toclose)
>  {
>  	struct svc_sock *svsk, *closesk = NULL;
>  	int len = 0;
> @@ -1165,9 +1180,18 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
>  	return svsk;
>  }
>  
> -int svc_addsock(struct svc_serv *serv,
> -		int fd,
> -		char *name_return)
> +/**
> + * svc_addsock - add a listener socket to an RPC service
> + * @serv: pointer to RPC service to which to add a new listener
> + * @fd: file descriptor of the new listener
> + * @name_return: pointer to buffer to pass back name of listener
> + * @len: size of the buffer
> + *
> + * Fills in socket name and returns positive length of name if successful.
> + * Name is terminated with '\n'.  On error, returns a negative errno
> + * value.
> + */
> +int svc_addsock(struct svc_serv *serv, int fd, char *name_return, size_t len)
>  {
>  	int err = 0;
>  	struct socket *so = sockfd_lookup(fd, &err);
> 

  parent reply	other threads:[~2008-12-25  4:43 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-12 21:57 [PATCH 00/22] IPv6 support NFSD Chuck Lever
     [not found] ` <20081212215340.24332.88416.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-12 21:57   ` [PATCH 01/22] NFSD: clean up failover sysctl function naming Chuck Lever
2008-12-12 21:57   ` [PATCH 02/22] NFSD: Fix a handful of coding style issues in write_filehandle() Chuck Lever
2008-12-12 21:57   ` [PATCH 03/22] NFSD: Replace open-coded integer with macro Chuck Lever
2008-12-12 21:57   ` [PATCH 04/22] NFSD: Add documenting comments for nfsctl interface Chuck Lever
2008-12-12 21:57   ` [PATCH 05/22] NFSD: Add helper functions for __write_ports() Chuck Lever
     [not found]     ` <20081212215742.24332.36578.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-25  4:15       ` J. Bruce Fields
2008-12-29 17:04         ` Chuck Lever
2008-12-29 18:42           ` J. Bruce Fields
2008-12-12 21:57   ` [PATCH 06/22] NFSD: Refactor __write_ports() Chuck Lever
2008-12-12 21:57   ` [PATCH 07/22] NFSD: Prevent a buffer overflow in svc_xprt_names() Chuck Lever
     [not found]     ` <20081212215757.24332.77904.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-25  4:32       ` J. Bruce Fields
2008-12-12 21:58   ` [PATCH 08/22] SUNRPC: pass buffer size to svc_addsock() and svc_sock_names() Chuck Lever
     [not found]     ` <20081212215804.24332.24605.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-14 17:33       ` Tom Tucker
2008-12-15 16:40         ` Chuck Lever
2008-12-15 21:05           ` Tom Tucker
2008-12-15 21:17             ` J. Bruce Fields
2008-12-25  4:43       ` J. Bruce Fields [this message]
2008-12-29 19:24         ` Chuck Lever
2008-12-30 19:38           ` J. Bruce Fields
2008-12-12 21:58   ` [PATCH 09/22] SUNRPC: Switch one_sock_name() to use snprintf() Chuck Lever
2008-12-12 21:58   ` [PATCH 10/22] SUNRPC: Support AF_INET6 in one_sock_name() Chuck Lever
2008-12-12 21:58   ` [PATCH 11/22] SUNRPC: Clean up one_sock_name() Chuck Lever
2008-12-12 21:58   ` [PATCH 12/22] NFSD: Support AF_INET6 in svc_addsock() function Chuck Lever
2008-12-12 21:58   ` [PATCH 13/22] NFS: Move NFS client's IP address parser to nfs_common/ Chuck Lever
     [not found]     ` <20081212215842.24332.47093.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-25  4:47       ` J. Bruce Fields
2008-12-12 21:58   ` [PATCH 14/22] NFSD: Support IPv6 addresses in write_failover_ip() Chuck Lever
2008-12-12 21:58   ` [PATCH 15/22] NFSD: Enable NFS server use of AF_INET6 Chuck Lever
2008-12-12 21:59   ` [PATCH 16/22] NFSD: Prevent buffer overflow in write_threads() Chuck Lever
2008-12-12 21:59   ` [PATCH 17/22] NFSD: Prevent buffer overflow in write_versions() Chuck Lever
2008-12-12 21:59   ` [PATCH 18/22] NFSD: Prevent buffer overflow in write_maxblksize() Chuck Lever
2008-12-12 21:59   ` [PATCH 19/22] NFSD: Prevent buffer overflow in write_leasetime() Chuck Lever
2008-12-12 21:59   ` [PATCH 20/22] NFSD: Prevent buffer overflow in write_recoverydir() Chuck Lever
2008-12-12 21:59   ` [PATCH 21/22] NLM: Refactor make_socks() function Chuck Lever
2008-12-12 21:59   ` [PATCH 22/22] NLM: Clean up flow of control in " Chuck Lever
2008-12-16 16:53   ` [PATCH 00/22] IPv6 support NFSD J. Bruce Fields
2008-12-25  5:01   ` J. Bruce Fields

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=20081225044306.GC17998@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=aime.le-rouzic@bull.net \
    --cc=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.