diff mbox

[nfs-utils] mount.nfs: skip server address resolution on remount

Message ID 83c9ef2c8e6c5ece11791e5c39609a1db9f716de.1459967426.git.bcodding@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Benjamin Coddington April 6, 2016, 6:30 p.m. UTC
A remount might fail if name resolution returns a different server address,
as might occur if there are multiple name records for the server.  Since we
cannot change the server's address on a remount anyway, skip the lookup and
remove any set addresses in the options.

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
---
 utils/mount/stropts.c |   31 ++++++++++++++++++++-----------
 1 files changed, 20 insertions(+), 11 deletions(-)

Comments

Chuck Lever April 6, 2016, 6:51 p.m. UTC | #1
> On Apr 6, 2016, at 11:30 AM, Benjamin Coddington <bcodding@redhat.com> wrote:
> 
> A remount might fail if name resolution returns a different server address,
> as might occur if there are multiple name records for the server.  Since we
> cannot change the server's address on a remount anyway, skip the lookup and
> remove any set addresses in the options.

That looks better.

But I wonder, is it necessary to remove the old addr= option
when doing a remount?

Have you checked what the output of /proc/mounts looks like
after a remount?


> Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
> ---
> utils/mount/stropts.c |   31 ++++++++++++++++++++-----------
> 1 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
> index 86829a9..634b58c 100644
> --- a/utils/mount/stropts.c
> +++ b/utils/mount/stropts.c
> @@ -383,13 +383,26 @@ static int nfs_validate_options(struct nfsmount_info *mi)
> 	if (!nfs_nfs_proto_family(mi->options, &family))
> 		return 0;
> 
> -	hint.ai_family = (int)family;
> -	error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
> -	if (error != 0) {
> -		nfs_error(_("%s: Failed to resolve server %s: %s"),
> -			progname, mi->hostname, gai_strerror(error));
> -		mi->address = NULL;
> -		return 0;
> +	/*
> +	 * A remount is not going to be able to change the server's address,
> +	 * nor should we try to resolve another address for the server as we
> +	 * may end up with a different address.
> +	 */
> +	if (mi->flags & MS_REMOUNT) {
> +		po_remove_all(mi->options, "addr");
> +	} else {
> +		hint.ai_family = (int)family;
> +		error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
> +		if (error != 0) {
> +			nfs_error(_("%s: Failed to resolve server %s: %s"),
> +				progname, mi->hostname, gai_strerror(error));
> +			mi->address = NULL;
> +			return 0;
> +		}
> +
> +		if (!nfs_append_addr_option(mi->address->ai_addr,
> +						mi->address->ai_addrlen, mi->options))
> +			return 0;
> 	}
> 
> 	if (!nfs_set_version(mi))
> @@ -398,10 +411,6 @@ static int nfs_validate_options(struct nfsmount_info *mi)
> 	if (!nfs_append_sloppy_option(mi->options))
> 		return 0;
> 
> -	if (!nfs_append_addr_option(mi->address->ai_addr,
> -					mi->address->ai_addrlen, mi->options))
> -		return 0;
> -
> 	return 1;
> }
> 
> -- 
> 1.7.1
> 
> --
> 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

--
Chuck Lever



--
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
Benjamin Coddington April 7, 2016, 8:46 a.m. UTC | #2
On Wed, 6 Apr 2016, Chuck Lever wrote:

>
> > On Apr 6, 2016, at 11:30 AM, Benjamin Coddington <bcodding@redhat.com> wrote:
> >
> > A remount might fail if name resolution returns a different server address,
> > as might occur if there are multiple name records for the server.  Since we
> > cannot change the server's address on a remount anyway, skip the lookup and
> > remove any set addresses in the options.
>
> That looks better.
>
> But I wonder, is it necessary to remove the old addr= option
> when doing a remount?

If we're not going to validate the value, better not pass in whatever the
user sent.  Maybe it would be better to return EINVAL instead?

> Have you checked what the output of /proc/mounts looks like
> after a remount?

Yes, the addr= is unchanged if not provided.

Ben

> > Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
> > ---
> > utils/mount/stropts.c |   31 ++++++++++++++++++++-----------
> > 1 files changed, 20 insertions(+), 11 deletions(-)
> >
> > diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
> > index 86829a9..634b58c 100644
> > --- a/utils/mount/stropts.c
> > +++ b/utils/mount/stropts.c
> > @@ -383,13 +383,26 @@ static int nfs_validate_options(struct nfsmount_info *mi)
> > 	if (!nfs_nfs_proto_family(mi->options, &family))
> > 		return 0;
> >
> > -	hint.ai_family = (int)family;
> > -	error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
> > -	if (error != 0) {
> > -		nfs_error(_("%s: Failed to resolve server %s: %s"),
> > -			progname, mi->hostname, gai_strerror(error));
> > -		mi->address = NULL;
> > -		return 0;
> > +	/*
> > +	 * A remount is not going to be able to change the server's address,
> > +	 * nor should we try to resolve another address for the server as we
> > +	 * may end up with a different address.
> > +	 */
> > +	if (mi->flags & MS_REMOUNT) {
> > +		po_remove_all(mi->options, "addr");
> > +	} else {
> > +		hint.ai_family = (int)family;
> > +		error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
> > +		if (error != 0) {
> > +			nfs_error(_("%s: Failed to resolve server %s: %s"),
> > +				progname, mi->hostname, gai_strerror(error));
> > +			mi->address = NULL;
> > +			return 0;
> > +		}
> > +
> > +		if (!nfs_append_addr_option(mi->address->ai_addr,
> > +						mi->address->ai_addrlen, mi->options))
> > +			return 0;
> > 	}
> >
> > 	if (!nfs_set_version(mi))
> > @@ -398,10 +411,6 @@ static int nfs_validate_options(struct nfsmount_info *mi)
> > 	if (!nfs_append_sloppy_option(mi->options))
> > 		return 0;
> >
> > -	if (!nfs_append_addr_option(mi->address->ai_addr,
> > -					mi->address->ai_addrlen, mi->options))
> > -		return 0;
> > -
> > 	return 1;
> > }
> >
> > --
> > 1.7.1
> >
> > --
> > 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
>
> --
> Chuck Lever
>
>
>
>
--
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
Steve Dickson April 28, 2016, 12:16 p.m. UTC | #3
On 04/06/2016 02:30 PM, Benjamin Coddington wrote:
> A remount might fail if name resolution returns a different server address,
> as might occur if there are multiple name records for the server.  Since we
> cannot change the server's address on a remount anyway, skip the lookup and
> remove any set addresses in the options.
> 
> Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Committed... 

steved.
> ---
>  utils/mount/stropts.c |   31 ++++++++++++++++++++-----------
>  1 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
> index 86829a9..634b58c 100644
> --- a/utils/mount/stropts.c
> +++ b/utils/mount/stropts.c
> @@ -383,13 +383,26 @@ static int nfs_validate_options(struct nfsmount_info *mi)
>  	if (!nfs_nfs_proto_family(mi->options, &family))
>  		return 0;
>  
> -	hint.ai_family = (int)family;
> -	error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
> -	if (error != 0) {
> -		nfs_error(_("%s: Failed to resolve server %s: %s"),
> -			progname, mi->hostname, gai_strerror(error));
> -		mi->address = NULL;
> -		return 0;
> +	/*
> +	 * A remount is not going to be able to change the server's address,
> +	 * nor should we try to resolve another address for the server as we
> +	 * may end up with a different address.
> +	 */
> +	if (mi->flags & MS_REMOUNT) {
> +		po_remove_all(mi->options, "addr");
> +	} else {
> +		hint.ai_family = (int)family;
> +		error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
> +		if (error != 0) {
> +			nfs_error(_("%s: Failed to resolve server %s: %s"),
> +				progname, mi->hostname, gai_strerror(error));
> +			mi->address = NULL;
> +			return 0;
> +		}
> +
> +		if (!nfs_append_addr_option(mi->address->ai_addr,
> +						mi->address->ai_addrlen, mi->options))
> +			return 0;
>  	}
>  
>  	if (!nfs_set_version(mi))
> @@ -398,10 +411,6 @@ static int nfs_validate_options(struct nfsmount_info *mi)
>  	if (!nfs_append_sloppy_option(mi->options))
>  		return 0;
>  
> -	if (!nfs_append_addr_option(mi->address->ai_addr,
> -					mi->address->ai_addrlen, mi->options))
> -		return 0;
> -
>  	return 1;
>  }
>  
> 
--
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
diff mbox

Patch

diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 86829a9..634b58c 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -383,13 +383,26 @@  static int nfs_validate_options(struct nfsmount_info *mi)
 	if (!nfs_nfs_proto_family(mi->options, &family))
 		return 0;
 
-	hint.ai_family = (int)family;
-	error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
-	if (error != 0) {
-		nfs_error(_("%s: Failed to resolve server %s: %s"),
-			progname, mi->hostname, gai_strerror(error));
-		mi->address = NULL;
-		return 0;
+	/*
+	 * A remount is not going to be able to change the server's address,
+	 * nor should we try to resolve another address for the server as we
+	 * may end up with a different address.
+	 */
+	if (mi->flags & MS_REMOUNT) {
+		po_remove_all(mi->options, "addr");
+	} else {
+		hint.ai_family = (int)family;
+		error = getaddrinfo(mi->hostname, NULL, &hint, &mi->address);
+		if (error != 0) {
+			nfs_error(_("%s: Failed to resolve server %s: %s"),
+				progname, mi->hostname, gai_strerror(error));
+			mi->address = NULL;
+			return 0;
+		}
+
+		if (!nfs_append_addr_option(mi->address->ai_addr,
+						mi->address->ai_addrlen, mi->options))
+			return 0;
 	}
 
 	if (!nfs_set_version(mi))
@@ -398,10 +411,6 @@  static int nfs_validate_options(struct nfsmount_info *mi)
 	if (!nfs_append_sloppy_option(mi->options))
 		return 0;
 
-	if (!nfs_append_addr_option(mi->address->ai_addr,
-					mi->address->ai_addrlen, mi->options))
-		return 0;
-
 	return 1;
 }