Re: [PATCH] mount.nfs: set the default family for lookups based on Defaultproto= setting

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

 



On Fri, 05 Feb 2010 13:11:45 -0500
Chuck Lever <chuck.lever@xxxxxxxxxx> wrote:

> On 02/05/2010 12:43 PM, Jeff Layton wrote:
> > On Fri, 05 Feb 2010 12:13:08 -0500
> > Chuck Lever<chuck.lever@xxxxxxxxxx>  wrote:
> >
> >> Hi Jeff-
> >>
> >> On 02/05/2010 11:30 AM, Jeff Layton wrote:
> >>> On Fri, 05 Feb 2010 10:31:28 -0500
> >>> Chuck Lever<chuck.lever@xxxxxxxxxx>   wrote:
> >>>
> >>>> On 02/05/2010 09:27 AM, Jeff Layton wrote:
> >>>>> When IPv6 is enabled, the Proto= config file option is treated as a
> >>>>> netid, and the address family for lookups is selected based on that
> >>>>> setting. The Defaultproto= option however still only affects the
> >>>>> protocol setting for the sockets (IPPROTO_*) and not the address family.
> >>>>>
> >>>>> This patch makes it so that if someone sets the "Defaultproto=" option
> >>>>> in the nfsmount.conf, it's used to determine the default address family
> >>>>> for lookups as well as the protocol type.
> >>>>>
> >>>>> This gives users a way to force a particular address family to be used
> >>>>> universally for mounts and brings the behavior of the Defaultproto=
> >>>>> option in line with the Proto= option.
> >>>>>
> >>>>> Signed-off-by: Jeff Layton<jlayton@xxxxxxxxxx>
> >>>>> ---
> >>>>>     utils/mount/configfile.c |    8 ++++++++
> >>>>>     utils/mount/network.c    |   18 ++++++++----------
> >>>>>     2 files changed, 16 insertions(+), 10 deletions(-)
> >>>>>
> >>>>> diff --git a/utils/mount/configfile.c b/utils/mount/configfile.c
> >>>>> index 6843098..71d3627 100644
> >>>>> --- a/utils/mount/configfile.c
> >>>>> +++ b/utils/mount/configfile.c
> >>>>> @@ -221,6 +221,8 @@ int inline check_vers(char *mopt, char *field)
> >>>>>
> >>>>>     unsigned long config_default_vers;
> >>>>>     unsigned long config_default_proto;
> >>>>> +extern sa_family_t config_default_family;
> >>>>> +
> >>>>>     /*
> >>>>>      * Check to see if a default value is being set.
> >>>>>      * If so, set the appropriate global value which will
> >>>>> @@ -242,6 +244,12 @@ int inline default_value(char *mopt)
> >>>>>     				xlog_warn("Unable to set default protocol : %s",
> >>>>>     					strerror(errno));
> >>>>>     			}
> >>>>> +#ifdef IPV6_SUPPORTED
> >>>>> +			if (!nfs_nfs_proto_family(options,&config_default_family)) {
> >>>>> +				xlog_warn("Unable to set default family : %s",
> >>>>> +					strerror(errno));
> >>>>> +			}
> >>>>> +#endif
> >>>>
> >>>> Maybe you don't need the #ifdef here?
> >>>>
> >>>> Aside from making the code more readable, removing the #ifdef would also
> >>>> make it so the same code path is followed whether IPv6 is supported or
> >>>> not, which makes testing easier.
> >>>>
> >>>> Just a thought.
> >>>>
> >>>
> >>> They probably aren't essential. It all comes down to what we want the
> >>> behavior to be in the following situation:
> >>
> >> OK... I had thought the behavior would be the same with and without the
> >> #ifdef's.  Since it clearly doesn't work the same way in both cases,
> >> that's a sure sign that we will have testing and documentation problems
> >> here if the #ifdef is left in.
> >>
> >>> If someone had a TIRPC enabled nfs-utils but IPv6 support is disabled,
> >>> and then set Defaultproto=tcp6.
> >>>
> >>> With the ifdef's in place, then the address family part of it would
> >>> just be ignored. Without those in place, IPv6 will be forced for the
> >>> lookup but we won't actually be able to make use of the addresses
> >>> returned.
> >>
> >> As an admin (who understands how netids work), I would be more surprised
> >> if setting the default protocol (netid, really) to tcp6, and then
> >> disabling IPv6 on the client, or at build time in nfs-utils, or if the
> >> IPv6-related netids were missing from /etc/netconfig, would work at all.
> >>    It would be more consistent behaviour IMO to make this case fail.
> >>
> >> I agree with having things "just work" in reasonable cases, but it seems
> >> like we are bending the semantics of netids and proto= to make that happen.
> >>
> >> "tcp6" does not mean "use IPv6 if it's available."  It means "always use
> >> IPv6."  And, "tcp" does not mean "use TCP on either IPv4 or IPv6," it
> >> now means "always use TCP on IPv4."  This is what we buy with netids and
> >> TI-RPC.  That's why we use HAVE_LIBTIRPC rather than IPV6_SUPPORTED in
> >> nfs_nfs_proto_family and nfs_mount_proto_family.
> >>
> >>> Granted, it's a bit of a pathological setup, but I don't think the
> >>> #ifdef's here really take away anything and may help prevent confusion
> >>> with the union of all these different options.
> >>>
> >>>>>     		} else {
> >>>>>     			xlog_warn("Unable to alloc memory for default protocol");
> >>>>>     		}
> >>>>> diff --git a/utils/mount/network.c b/utils/mount/network.c
> >>>>> index 92bba2d..0ab3bb1 100644
> >>>>> --- a/utils/mount/network.c
> >>>>> +++ b/utils/mount/network.c
> >>>>> @@ -1331,6 +1331,12 @@ nfs_nfs_port(struct mount_options *options, unsigned long *port)
> >>>>>     	return 1;
> >>>>>     }
> >>>>>
> >>>>> +#ifdef IPV6_SUPPORTED
> >>
> >> By the above argument, this should be HAVE_LIBTIRPC.
> >>
> >
> > I can sort of buy the argument for leaving out the earlier #ifdef
> > around the default_value() function.
> >
> > If you change this one though, then lookups will still return IPv6
> > addresses by default even when IPV6_SUPPORTED isn't set. IOW, in the
> > absence of a proto= option, you'll pass AF_UNSPEC to getaddrinfo and
> > get IPv6 addresses. I don't think that's what we want here for a
> > non-ipv6 enabled nfs-utils.
> 
> OK, agreed.  This setting is actually not determining the meaning of any 
> of the netids, but rather it is determining the default address family 
> if _no_ netid is specified.
> 

Correct. Ok, I'll respin and repost with the ifdef's in default_value()
removed.

> >>>>> +sa_family_t	config_default_family = AF_UNSPEC;
> >>>>> +#else
> >>>>> +sa_family_t	config_default_family = AF_INET;
> >>>>> +#endif
> >>>>> +
> >>>>>     /*
> >>>>>      * Returns TRUE and fills in @family if a valid NFS protocol option
> >>>>>      * is found, or FALSE if the option was specified with an invalid value.
> >>>>> @@ -1341,11 +1347,7 @@ int nfs_nfs_proto_family(struct mount_options *options,
> >>>>>     	unsigned long protocol;
> >>>>>     	char *option;
> >>>>>
> >>>>> -#ifdef IPV6_SUPPORTED
> >>>>> -	*family = AF_UNSPEC;
> >>>>> -#else
> >>>>> -	*family = AF_INET;
> >>>>> -#endif
> >>>>> +	*family = config_default_family;
> >>>>>
> >>>>>     	switch (po_rightmost(options, nfs_transport_opttbl)) {
> >>>>>     	case 0:	/* udp */
> >>>>> @@ -1488,11 +1490,7 @@ int nfs_mount_proto_family(struct mount_options *options,
> >>>>>     	unsigned long protocol;
> >>>>>     	char *option;
> >>>>>
> >>>>> -#ifdef HAVE_LIBTIRPC
> >>>>> -	*family = AF_UNSPEC;
> >>>>> -#else
> >>>>> -	*family = AF_INET;
> >>>>> -#endif
> >>>>> +	*family = config_default_family;
> >>>>>
> >>>>>     	option = po_get(options, "mountproto");
> >>>>>     	if (option != NULL)
> >>>>
> >>>>
> >>>
> >>>
> >>
> >
> >
> 
> 


-- 
Jeff Layton <jlayton@xxxxxxxxxx>
--
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