diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2007-09-28 16:37:06 -0400 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-09-29 07:58:57 +1000 |
commit | 7aa9d664abc948370b7c93d0e27d54859ae278fd (patch) | |
tree | 3ee706cc16ed7fc4ccf1b6b1db0002bc0f03b6fa | |
parent | 8034455d1fc4e315b54d100fd8138ce4c5c08471 (diff) | |
download | nfs-utils-7aa9d664abc948370b7c93d0e27d54859ae278fd.tar.gz nfs-utils-7aa9d664abc948370b7c93d0e27d54859ae278fd.tar.xz nfs-utils-7aa9d664abc948370b7c93d0e27d54859ae278fd.zip |
text-based mount.nfs: Fix mounthost= processing
The 'mounthost=' option names a host where the mountd service is running.
The option is used to direct clients to use a different host for the mountd
procotol than the host where the NFS service is running.
The nfs(5) man page shows that the 'mounthost=' option takes a name, not
an address. The kernel's text-based mount option parsing logic expects an
IPv4 address. This is necessary because the kernel cannot itself resolve
hostnames to addresses.
Resolve the hostname and pass in a new mount option that contains the
resolved address, 'mountaddr=', to the kernel.
This requires a patch to the kernel to recognize the new 'mountaddr='
option, and to change the 'mounthost=' parsing logic to treat the value of
this option as a simple string.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r-- | utils/mount/stropts.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index e3a3ac9..b31b3a2 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -191,6 +191,30 @@ static int append_clientaddr_option(struct sockaddr_in *saddr, } /* + * Called to resolve the 'mounthost=' hostname and append a new + * option using an IPv4 address. + */ +static int fix_up_mounthost_opt(struct mount_options *options) +{ + struct sockaddr_in maddr; + char *mounthost, new_option[32]; + + mounthost = po_get(options, "mounthost"); + if (!mounthost) + return 1; + + if (!fill_ipv4_sockaddr(mounthost, &maddr)) + return 0; + + snprintf(new_option, sizeof(new_option) - 1, + "mountaddr=%s", inet_ntoa(maddr.sin_addr)); + + if (po_append(options, new_option) == PO_SUCCEEDED) + return 1; + return 0; +} + +/* * nfsmount_s - Mount an NFSv2 or v3 file system using C string options * * @spec: C string hostname:path specifying remoteshare to mount @@ -227,6 +251,9 @@ int nfsmount_s(const char *spec, const char *node, int flags, if (!append_addr_option(&saddr, options)) goto out; + if (!fix_up_mounthost_opt(options)) + goto out; + if (po_join(options, extra_opts) == PO_FAILED) { nfs_error(_("%s: internal option parsing error"), progname); goto out; |