From: Kinglong Mee <kinglongmee@gmail.com>
To: Chuck Lever <chuck.lever@oracle.com>, linux-nfs@vger.kernel.org
Subject: Re: [PATCH v3] rpc.nfsd: Squelch DNS errors when using the --host option
Date: Thu, 11 Jun 2015 09:37:32 +0800 [thread overview]
Message-ID: <5578E65C.6080802@gmail.com> (raw)
In-Reply-To: <20150610144349.19869.87412.stgit@manet.1015granger.net>
On 6/10/2015 10:46 PM, Chuck Lever wrote:
> Sean Elble <elbles@sessys.com> says:
>> [rpc.nfsd --host] throws an error/warning (where nfs-server is
>> defined in /etc/hosts for the IPv4 address of the interface I wish
>> for TCP port 2049 to be opened on):
>>
>> rpc.nfsd: unable to resolve nfs-server:nfs to inet6 address: Name
>> or service not known
>
> I think we can simplify the use of getaddrinfo(3) so that only one
> call is needed to gather both IPv4 and IPv6 addresses. The call
> should fail, and an error should be reported, only when there are
> _no_ addresses bound to a hostname.
>
> Reported-by: Sean Elble <elbles@sessys.com>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>
>
> Here is version 3. This version addresses both Jeff's and Kinglong's
> review comments. It has passed basic testing.
Yes, I'd like this one.
Reviewed-by: Kinglong Mee <kinglongmee@gmail.com>
thanks,
Kinglong Mee
>
>
> utils/nfsd/nfsd.c | 70 ++-------------------------------------------------
> utils/nfsd/nfssvc.c | 47 ++++++++++++++++++----------------
> utils/nfsd/nfssvc.h | 2 +
> 3 files changed, 29 insertions(+), 90 deletions(-)
>
> diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c
> index 201bb13..2165744 100644
> --- a/utils/nfsd/nfsd.c
> +++ b/utils/nfsd/nfsd.c
> @@ -52,50 +52,6 @@ static struct option longopts[] =
> { NULL, 0, 0, 0 }
> };
>
> -/* given a family and ctlbits, disable any that aren't listed in netconfig */
> -#ifdef HAVE_LIBTIRPC
> -static void
> -nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6)
> -{
> - struct netconfig *nconf;
> - unsigned int *famproto;
> - void *handle;
> -
> - xlog(D_GENERAL, "Checking netconfig for visible protocols.");
> -
> - handle = setnetconfig();
> - while((nconf = getnetconfig(handle))) {
> - if (!(nconf->nc_flag & NC_VISIBLE))
> - continue;
> -
> - if (!strcmp(nconf->nc_protofmly, NC_INET))
> - famproto = proto4;
> - else if (!strcmp(nconf->nc_protofmly, NC_INET6))
> - famproto = proto6;
> - else
> - continue;
> -
> - if (!strcmp(nconf->nc_proto, NC_TCP))
> - NFSCTL_TCPSET(*famproto);
> - else if (!strcmp(nconf->nc_proto, NC_UDP))
> - NFSCTL_UDPSET(*famproto);
> -
> - xlog(D_GENERAL, "Enabling %s %s.", nconf->nc_protofmly,
> - nconf->nc_proto);
> - }
> - endnetconfig(handle);
> - return;
> -}
> -#else /* HAVE_LIBTIRPC */
> -static void
> -nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6)
> -{
> - /* Enable all IPv4 protocols if no TIRPC support */
> - *proto4 = NFSCTL_ALLBITS;
> - *proto6 = 0;
> -}
> -#endif /* HAVE_LIBTIRPC */
> -
> int
> main(int argc, char **argv)
> {
> @@ -108,8 +64,6 @@ main(int argc, char **argv)
> unsigned int minorversset = 0;
> unsigned int versbits = NFSCTL_VERDEFAULT;
> unsigned int protobits = NFSCTL_ALLBITS;
> - unsigned int proto4 = 0;
> - unsigned int proto6 = 0;
> int grace = -1;
> int lease = -1;
>
> @@ -278,18 +232,6 @@ main(int argc, char **argv)
>
> xlog_open(progname);
>
> - nfsd_enable_protos(&proto4, &proto6);
> -
> - if (!NFSCTL_TCPISSET(protobits)) {
> - NFSCTL_TCPUNSET(proto4);
> - NFSCTL_TCPUNSET(proto6);
> - }
> -
> - if (!NFSCTL_UDPISSET(protobits)) {
> - NFSCTL_UDPUNSET(proto4);
> - NFSCTL_UDPUNSET(proto6);
> - }
> -
> /* make sure that at least one version is enabled */
> found_one = 0;
> for (c = NFSD_MINVERS; c <= NFSD_MAXVERS; c++) {
> @@ -302,8 +244,7 @@ main(int argc, char **argv)
> }
>
> if (NFSCTL_VERISSET(versbits, 4) &&
> - !NFSCTL_TCPISSET(proto4) &&
> - !NFSCTL_TCPISSET(proto6)) {
> + !NFSCTL_TCPISSET(protobits)) {
> xlog(L_ERROR, "version 4 requires the TCP protocol");
> exit(1);
> }
> @@ -337,15 +278,10 @@ main(int argc, char **argv)
>
> i = 0;
> do {
> - error = nfssvc_set_sockets(AF_INET, proto4, haddr[i], port);
> - if (!error)
> - socket_up = 1;
> -#ifdef IPV6_SUPPORTED
> - error = nfssvc_set_sockets(AF_INET6, proto6, haddr[i], port);
> + error = nfssvc_set_sockets(protobits, haddr[i], port);
> if (!error)
> socket_up = 1;
> -#endif /* IPV6_SUPPORTED */
> - } while (++i < hcounter);
> + } while (++i < hcounter);
>
> if (rdma_port) {
> error = nfssvc_set_rdmaport(rdma_port);
> diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c
> index 027e5ac..a2b11d8 100644
> --- a/utils/nfsd/nfssvc.c
> +++ b/utils/nfsd/nfssvc.c
> @@ -24,6 +24,7 @@
>
> #include "nfslib.h"
> #include "xlog.h"
> +#include "nfssvc.h"
>
> #ifndef NFSD_FS_DIR
> #define NFSD_FS_DIR "/proc/fs/nfsd"
> @@ -124,22 +125,6 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port)
> if (fd < 0)
> return 0;
>
> - switch(hints->ai_family) {
> - case AF_INET:
> - family = "inet";
> - break;
> -#ifdef IPV6_SUPPORTED
> - case AF_INET6:
> - family = "inet6";
> - break;
> -#endif /* IPV6_SUPPORTED */
> - default:
> - xlog(L_ERROR, "Unknown address family specified: %d\n",
> - hints->ai_family);
> - rc = EAFNOSUPPORT;
> - goto error;
> - }
> -
> rc = getaddrinfo(node, port, hints, &addrhead);
> if (rc == EAI_NONAME && !strcmp(port, "nfs")) {
> snprintf(buf, sizeof(buf), "%d", NFS_PORT);
> @@ -147,10 +132,10 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port)
> }
>
> if (rc != 0) {
> - xlog(L_ERROR, "unable to resolve %s:%s to %s address: "
> - "%s", node ? node : "ANYADDR", port, family,
> - rc == EAI_SYSTEM ? strerror(errno) :
> - gai_strerror(rc));
> + xlog(L_ERROR, "unable to resolve %s:%s: %s",
> + node ? node : "ANYADDR", port,
> + rc == EAI_SYSTEM ? strerror(errno) :
> + gai_strerror(rc));
> goto error;
> }
>
> @@ -169,6 +154,20 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port)
> continue;
> }
>
> + switch(addr->ai_addr->sa_family) {
> + case AF_INET:
> + family = "AF_INET";
> + break;
> +#ifdef IPV6_SUPPORTED
> + case AF_INET6:
> + family = "AF_INET6";
> + break;
> +#endif /* IPV6_SUPPORTED */
> + default:
> + addr = addr->ai_next;
> + continue;
> + }
> +
> xlog(D_GENERAL, "Creating %s %s socket.", family, proto);
>
> /* open socket and prepare to hand it off to kernel */
> @@ -252,12 +251,16 @@ error:
> }
>
> int
> -nfssvc_set_sockets(const int family, const unsigned int protobits,
> +nfssvc_set_sockets(const unsigned int protobits,
> const char *host, const char *port)
> {
> struct addrinfo hints = { .ai_flags = AI_PASSIVE };
>
> - hints.ai_family = family;
> +#ifdef IPV6_SUPPORTED
> + hints.ai_family = AF_UNSPEC;
> +#else /* IPV6_SUPPORTED */
> + hints.ai_family = AF_INET;
> +#endif /* IPV6_SUPPORTED */
>
> if (!NFSCTL_ANYPROTO(protobits))
> return EPROTOTYPE;
> diff --git a/utils/nfsd/nfssvc.h b/utils/nfsd/nfssvc.h
> index fbb89b2..7d70f0d 100644
> --- a/utils/nfsd/nfssvc.h
> +++ b/utils/nfsd/nfssvc.h
> @@ -22,7 +22,7 @@
>
> void nfssvc_mount_nfsdfs(char *progname);
> int nfssvc_inuse(void);
> -int nfssvc_set_sockets(const int family, const unsigned int protobits,
> +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);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2015-06-11 1:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-10 14:46 [PATCH v3] rpc.nfsd: Squelch DNS errors when using the --host option Chuck Lever
2015-06-11 1:37 ` Kinglong Mee [this message]
2015-07-14 18:07 ` Steve Dickson
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=5578E65C.6080802@gmail.com \
--to=kinglongmee@gmail.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox