Re: [PATCH nfs-utils v2 11/12] nfsd: add --vsock (-v) option to nfsd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 06/30/2017 09:21 AM, Stefan Hajnoczi wrote:
> The following command-line serves NFSv4.1 over AF_VSOCK:
> 
>   nfsd -TU -N3 -V4.1 -v 2049
So this specifying no-tcp, no-udp (which is no longer needed since 
udp is off by default), no-v3, only-v4.1, vsock listiner,
and you are missing a -p because I don't think you want to
start up 2049 process. 

How does this work with the standard NFS server? Are the
co-compatible?

Also the --vsock needs to be documented. Also can the
--vsock flag just mean all of these specifics... Meaning
so they don't have to be specified on the command line?

steved.
  
> 
> Signed-off-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx>
> ---
>  utils/nfsd/nfssvc.h |  1 +
>  utils/nfsd/nfsd.c   | 18 +++++++++++++---
>  utils/nfsd/nfssvc.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 78 insertions(+), 3 deletions(-)
> 
> diff --git a/utils/nfsd/nfssvc.h b/utils/nfsd/nfssvc.h
> index 39ebf37..1d251ca 100644
> --- a/utils/nfsd/nfssvc.h
> +++ b/utils/nfsd/nfssvc.h
> @@ -26,6 +26,7 @@ int	nfssvc_set_sockets(const unsigned int protobits,
>  			   const char *host, const char *port);
>  void	nfssvc_set_time(const char *type, const int seconds);
>  int	nfssvc_set_rdmaport(const char *port);
> +int	nfssvc_set_vsock(const char *port);
>  void	nfssvc_setvers(unsigned int ctlbits, unsigned int minorvers4, unsigned int minorvers4set);
>  int	nfssvc_threads(int nrservs);
>  void	nfssvc_get_minormask(unsigned int *mask);
> diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c
> index 2b38249..f969da0 100644
> --- a/utils/nfsd/nfsd.c
> +++ b/utils/nfsd/nfsd.c
> @@ -53,6 +53,7 @@ static struct option longopts[] =
>  	{ "rdma", 2, 0, 'R' },
>  	{ "grace-time", 1, 0, 'G'},
>  	{ "lease-time", 1, 0, 'L'},
> +	{ "vsock", 1, 0, 'v' },
>  	{ NULL, 0, 0, 0 }
>  };
>  
> @@ -61,6 +62,7 @@ main(int argc, char **argv)
>  {
>  	int	count = NFSD_NPROC, c, i, error = 0, portnum, fd, found_one;
>  	char *p, *progname, *port, *rdma_port = NULL;
> +	char *vsock_port = NULL;
>  	char **haddr = NULL;
>  	int hcounter = 0;
>  	struct conf_list *hosts;
> @@ -145,7 +147,7 @@ main(int argc, char **argv)
>  		}
>  	}
>  
> -	while ((c = getopt_long(argc, argv, "dH:hN:V:p:P:stTituUrG:L:", longopts, NULL)) != EOF) {
> +	while ((c = getopt_long(argc, argv, "dH:hN:V:p:P:stTituUrG:L:v:", longopts, NULL)) != EOF) {
>  		switch(c) {
>  		case 'd':
>  			xlog_config(D_ALL, 1);
> @@ -180,7 +182,9 @@ main(int argc, char **argv)
>  			else
>  				rdma_port = "nfsrdma";
>  			break;
> -
> +		case 'v': /* --vsock */
> +			vsock_port = optarg;
> +			break;
>  		case 'N':
>  			switch((c = strtol(optarg, &p, 0))) {
>  			case 4:
> @@ -306,7 +310,8 @@ main(int argc, char **argv)
>  	}
>  
>  	if (NFSCTL_VERISSET(versbits, 4) &&
> -	    !NFSCTL_TCPISSET(protobits)) {
> +	    !NFSCTL_TCPISSET(protobits) &&
> +	    !vsock_port) {
>  		xlog(L_ERROR, "version 4 requires the TCP protocol");
>  		exit(1);
>  	}
> @@ -350,6 +355,13 @@ main(int argc, char **argv)
>  		if (!error)
>  			socket_up = 1;
>  	}
> +
> +	if (vsock_port) {
> +		error = nfssvc_set_vsock(vsock_port);
> +		if (!error)
> +			socket_up = 1;
> +	}
> +
>  set_threads:
>  	/* don't start any threads if unable to hand off any sockets */
>  	if (!socket_up) {
> diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c
> index e8609c1..e867454 100644
> --- a/utils/nfsd/nfssvc.c
> +++ b/utils/nfsd/nfssvc.c
> @@ -15,6 +15,7 @@
>  #include <netdb.h>
>  #include <netinet/in.h>
>  #include <arpa/inet.h>
> +#include <linux/vm_sockets.h>
>  #include <sys/stat.h>
>  #include <unistd.h>
>  #include <fcntl.h>
> @@ -304,6 +305,67 @@ nfssvc_set_rdmaport(const char *port)
>  	return ret;
>  }
>  
> +int
> +nfssvc_set_vsock(const char *port)
> +{
> +	struct sockaddr_vm svm;
> +	int nport;
> +	char buf[20];
> +	int rc = 1;
> +	int sockfd = -1;
> +	int fd = -1;
> +	char *ep;
> +
> +	nport = strtol(port, &ep, 10);
> +	if (!*port || *ep) {
> +		xlog(L_ERROR, "unable to interpret port name %s",
> +		     port);
> +		goto out;
> +	}
> +
> +	sockfd = socket(AF_VSOCK, SOCK_STREAM, 0);
> +	if (sockfd < 0) {
> +		xlog(L_ERROR, "unable to create AF_VSOCK socket: "
> +			      "errno %d (%m)", errno);
> +		goto out;
> +	}
> +
> +	svm.svm_family = AF_VSOCK;
> +	svm.svm_port = nport;
> +	svm.svm_cid = VMADDR_CID_ANY;
> +
> +	if (bind(sockfd, (struct sockaddr*)&svm, sizeof(svm))) {
> +		xlog(L_ERROR, "unable to bind AF_VSOCK socket: "
> +			      "errno %d (%m)", errno);
> +		goto out;
> +	}
> +
> +	if (listen(sockfd, 64)) {
> +		xlog(L_ERROR, "unable to create listening socket: "
> +			      "errno %d (%m)", errno);
> +		goto out;
> +	}
> +
> +	fd = open(NFSD_PORTS_FILE, O_WRONLY);
> +	if (fd < 0) {
> +		xlog(L_ERROR, "couldn't open ports file: errno "
> +		     "%d (%m)", errno);
> +		goto out;
> +	}
> +	snprintf(buf, sizeof(buf), "%d\n", sockfd);
> +	if (write(fd, buf, strlen(buf)) != (ssize_t)strlen(buf)) {
> +		xlog(L_ERROR, "unable to request vsock services: %m");
> +		goto out;
> +	}
> +	rc = 0;
> +out:
> +	if (fd != -1)
> +		close(fd);
> +	if (sockfd != -1)
> +		close(sockfd);
> +	return rc;
> +}
> +
>  void
>  nfssvc_set_time(const char *type, const int seconds)
>  {
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux