summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* mount.nfs: Fix compiler warning in stropts.cChuck Lever2009-07-141-2/+4
| | | | | | | | | | Address compiler warning: stropts.c: In function ¿nfs_append_generic_address_option¿: stropts.c:138: warning: comparison between signed and unsigned Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* umount.nfs: Use correct data type in nfsumount()Chuck Lever2009-07-141-1/+1
| | | | | | | | | | | | | Address compiler warning: nfsumount.c: In function nfsumount: nfsumount.c:347: warning: comparison between signed and unsigned The result type of pointer arithmetic and the return type of strlen(3) are both size_t. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: remove unused @addrlen argument from nfs_string_to_sockaddr()Chuck Lever2009-07-143-9/+5
| | | | | | | | | | Address compiler warning: network.c: In function nfs_string_to_sockaddr: network.c:272: warning: unused parameter addrlen Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Remove unused @salen parameter from nfs_ca_gai()Chuck Lever2009-07-141-2/+2
| | | | | | | | | Address compiler warning: network.c:1124: warning: unused parameter salen Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Fix some nfs_error() nits in network.cChuck Lever2009-07-141-3/+4
| | | | | | | Fix a couple of nfs_error() call sites in utils/mount/network.c. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Remove unused parameter in try_mount()Chuck Lever2009-07-141-3/+3
| | | | | | | | | | Address compiler warning: mount.c: At top level: mount.c:420: warning: unused parameter nomtab Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Use correct data type in discover_nfs_mount_data_version()Chuck Lever2009-07-141-1/+1
| | | | | | | | | | | | | | | | | Address compiler warning: mount.c: In function discover_nfs_mount_data_version¿: mount.c:162: warning: comparison between signed and unsigned mount.c:164: warning: comparison between signed and unsigned mount.c:166: warning: comparison between signed and unsigned mount.c:168: warning: comparison between signed and unsigned mount.c:170: warning: comparison between signed and unsigned mount.c:178: warning: comparison between signed and unsigned linux_version_code() and MAKE_VERSION() both return an unsigned int. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* support: Introduce sockaddr helpers to get and set IP port numbersChuck Lever2009-07-144-54/+58
| | | | | | | | | | Introduce address family-agnostic functions that get and set IP port numbers in socket addresses. We can already replace a few similar functions in the mount command, and a few more will come up with statd and sm-notify. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Don't update extra_opts after text-based negotiationChuck Lever2009-07-141-5/+14
| | | | | | | | | The umount.nfs command will negotiate the mount options again, so all that is needed in /etc/mnttab is the original set of options used for the mount, plus the additional mandatory options like addr=''. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Clean up after restructuring version/protocol negotiationChuck Lever2009-07-141-132/+25
| | | | | | | | | | Fix up comments and function names to reflect the new version/protocol negotiation scheme. We can now remove a bunch of mount processing that is specific to v2/v3, removing about 100 lines of logic from stropts.c. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Clean up nfs_is_permanent_error()Chuck Lever2009-07-141-20/+25
| | | | | | | | | Clean up: Move nfs_is_permanent_error() closer to the functions that call it, and update a documenting comment to reflect recent restructuring in this area. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: rearchitect mount version/protocol negotiation logicChuck Lever2009-07-141-17/+25
| | | | | | | | | | | | | | | | | | | | Text-based mounts try a mount operation first with default settings, then negotiate via rpcbind queries and retry the mount, if the default settings don't work. This method introduces long delays in certain common scenarios, and makes it difficult to tell when it is appropriate to fail immediately or negotiate and retry. To address these behavioral regressions, make text-based mounts operate the same way that legacy mounts work. Perform rpcbind queries with short timeouts first, then use the results to determine transport, version, and port number settings for the mount. This allows the mount.nfs command to detect server settings, or whether negotiation is even possible, quickly. It also makes it simple to determine when to fail vs. when to retry. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: make nfs_options2pmap return errorsChuck Lever2009-07-144-102/+227
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Up until now, nfs_options2pmap() has been passed mount options that have already gone through the kernel's parser successfully. So, it never had to check for invalid mount option values. However, we are about to pass it options that come right from the user. So nfs_options2pmap() will now need to report an error and fail if it encounters a bogus value for any of the options it cares about. ===== Note that nfs_options2pmap() will allow a bogus value for an option if the same option is specified farther to the right with a useable value. For example, if a user specifies "proto=foo,...,tcp" then nfs_options2pmap() uses "tcp" and ignores "proto=foo". However, if the options are specified in the other order: "tcp,...,proto=foo" then nfs_options2pmap() will fail. This is a simple and unambiguous extension of the "rightmost wins" rule. Since mount.nfs strips out these options out and replaces them with the rpcbind-negotiated options before invoking mount(2), the kernel should never receive bogus values for these options from mount.nfs in such cases. This is probably slightly more flexible behavior than the legacy mount implementation, but should be harmless. All mount options unrelated to pmap are ignored by nfs_options2pmap(). Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: force rpcbind queries if options aren't specifiedChuck Lever2009-07-141-7/+11
| | | | | | | | | | | | | | | | | nfs_options2pmap() fills in default values if the passed-in mount options don't specify values. This short-circuits the version, port, and transport negotiation logic in nfs_probe_bothports(). Instead, nfs_options2pmap() should plant zeros in these pmap fields to force nfs_probe_bothports() and nfs_advise_mount() to discover, via rpcbind queries, what the server supports. This fixes some scenarios where umount.nfs fails to connect to servers that don't have all rpcbind ports open, in addition to fixing other corner cases during mount.nfs version/protocol negotiation. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: If port= specifies an unregistered port, retry, then failChuck Lever2009-07-141-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Suppose a port= option is specified on the mount command line, but not enough other mount options are specified to avoid an rpcbind query to discover the NFS service. If the NFS service isn't registered on [100003, 3, "tcp", port] (even if the server is listening on the specified port), the legacy mount.nfs command fails immediately with: mount.nfs: mount to NFS server 'server' failed: RPC Error: Success What's more, this mount request should succeeded if an NFS service is registered on the specified port for another version and/or protocol. So instead, let's retry the rpcbind query with the other versions and transport protocols to be absolutely sure that port won't work with either version or transport. Then, if all fails, report: mount.nfs: mount to NFS server 'server' failed: RPC Error: Program not registered This change also affects text-based mounts that require negotiation by the mount.nfs command. Note that if the mount options specify all four pmap parameters for NFS, the rpcbind query for the NFS service is skipped entirely. The mount command then hangs and times out later if NFS service is not listening on the requested tuple. This is unchanged from previous behavior. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: Convert TCP connection refused to RPC_CANTRECVChuck Lever2009-07-141-0/+3
| | | | | | | | | | | | | In a similar vein to the timeout logic we just restored, a refused TCP connection should be mapped to an equivalent UDP error code: RPC_CANTRECV. This is new behavior for TCP connections; the legacy mount command appears to have simply failed immediately if a TCP connection was refused during an rpcbind query. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: Restore historical TCP connect timeout error codeChuck Lever2009-07-141-2/+24
| | | | | | | | | | | | | | | | | The latest versions of mount.nfs appear not to fall back to UDP if TCP isn't available on the server. Our new nfs_getport() implementation is missing a bit of logic from the original mount getport() implementation. Without it, nfs_probe_port() sees a TCP connect timeout as a permanent error, so it fails immediately instead of attempting to try again with UDP. Similar changes for our new ping API (see the old clnt_ping() function, which is still in utils/mount/network.c). Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount.nfs: Add more debugging output around nfs_getport()Chuck Lever2009-07-141-4/+24
| | | | | | | | | So we can see how rpcbind queries are failing during mount processing, add some debugging messages (enabled with "mount.nfs -v") around the nfs_getport() calls. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: Clear shared error fields before trying rpcbind queriesChuck Lever2009-07-144-2/+32
| | | | | | | | | Some RPC errors set fields in rpc_createerr.cf_error in addition to cf_stat. Be sure to clear _all_ error fields in rpc_createerr each time through the rpcbind API. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: RPC_PROGNOTREGISTERED is a permanent errorChuck Lever2009-07-141-1/+1
| | | | | | | | | | | | | | | rpcbind returns RPC_PROGNOTREGISTERED if it knows for certain that an RPC program is not supported for a given transport. This is a permanent and authoritative error, so the library's rpcbind query API should never retry the query -- it will only get the same answer. A similar change was submitted for libtirpc. Unlike rpcb_getaddr(3t), mount.nfs's rpcbind client only retries once (with RPCB3PROC_GETADDR), but an extra TCP socket in this case would leave another port in TIME_WAIT. It's infrequent enough, but might as well get rid of it. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* support: Set proper retransmit timeout for datagram transportsChuck Lever2009-07-141-1/+3
| | | | | | | | | Instead of setting the total timeout and the retransmit timeout to the same value for datagram transports, use a 1 second retransmit timeout, so we actually get a retransmit or two before failing. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* support: Don't return RPC_UNKNOWNHOST from rpc_socket.cChuck Lever2009-07-141-2/+2
| | | | | | | | | | RPC_UNKNOWNHOST means a hostname isn't known -- basically it's EAI_NONAME from getaddrinfo(3). Since the functions in rpc_socket.c don't take a hostname argument, RPC_UNKNOWNHOST is not an appropriate return code from these functions. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* support: Use HAVE_LIBTIRPC to switch in bindresvport_sa(3t)Chuck Lever2009-07-141-3/+3
| | | | | | | | | | | commit 383a026d99624c88c0e802103ef4c4865db8eb71, which fixed an earlier commit, is still not quite correct. bindresvport_sa(3t) is available whenever libtirpc is linked. There's no need to use IPV6_SUPPORTED here. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* New versions of libtool add extra aclocal scriptsChuck Lever2009-07-141-0/+5
| | | | | Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: Remove unneeded @salen argumentsChuck Lever2009-07-142-28/+18
| | | | | | | | Clean up: Now that getnameinfo(3) is no longer used, the @salen argument to nfs_sockaddr2universal() is no longer needed. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: replace getnameinfo(NI_NUMERICHOST) with inet_ntop(3)Chuck Lever2009-07-141-47/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | getnameinfo(3) with the NI_NUMERICHOST flag is used in support/nfs/getport.c to convert socket addresses to universal address strings. Older versions of glibc do not have getnameinfo(3), however. In order for nfs-utils to build on older systems we switch in legacy code via HAVE_GETNAMEINFO and use inet_ntoa(3). A problem with this is that we have to double our test matrix to be sure that both versions of these routines build and operate correctly. Another minor problem is that inet_ntoa(3) is officially deprecated. So let's always use a single implementation based on inet_ntop(3). Universal address strings do not support link-local / scope IDs, so we don't lose any functionality by using inet_ntop(3) here. This means we open code a bit of logic that is available in most modern versions of glibc, but in return we can use exactly the same code for all builds (on systems with getnameinfo(3) and without). An additional benefit is we can avoid using NI_MAXHOST for character buffers that live on the stack: it's 1025 bytes. Instead, INET6_ADDRSTRLEN is used, which is just 46 bytes, plus an additional eight bytes for the port information. We add beefier buffer overflow detection logic as well. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: Remove AI_ADDRCONFIG from nfs_gp_loopback_address()Chuck Lever2009-07-141-44/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | AI_ADDRCONFIG was used ostensibly to figure out if the local system had IPv6 available when generating a loopback address. A legacy version of nfs_gp_loopback_address() was created to handle ANYADDR address generation for old versions of glibc where AI_ADDRCONFIG doesn't exist. This means we have to be careful to test both the normal and legacy versions when committing changes in this area. But it turns out that even contemporary versions of glibc ignore AI_ADDRCONFIG when the hostname string is NULL. getaddrinfo(3) always returns an AF_INET and an AF_INET6 loopback address in this case, no matter how the system is configured. Change nfs_gp_loopback_address() to have one version that simply looks up "localhost" instead of doing anything fancy. If "localhost" is an IPv6 address, we'll use that. Otherwise, it should nearly always be an AF_INET loopback address. This eliminates the need for AI_ADDRCONFIG, and removes the duplicate version of nfs_gp_loopback_address(). Note that callers never used the port number in the returned socket address, so get rid of the "sunrpc" service string too. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: RPCB_GETADDR's r_addr should contain rpcbind port, not zeroChuck Lever2009-07-141-14/+23
| | | | | | | | | | | Similar to a change made to the kernel's rpcbind client. See kernel commit 143b6c4008a7928de7e139c3a77a90e4cad8db2c. The r_addr argument of RPCB_GETADDR procedures contains the rpcbind server's address and port number. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* getport: RPCB_GETADDR r_owner should be an empty stringChuck Lever2009-07-141-5/+1
| | | | | | | | | | | Some servers reject RPCB_GETADDR requests with a non-empty r_owner field. "RPC: Server can't decode arguments" An empty string is already used by libtirpc and the kernel for RPCB_GETADDR requests. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* mydaemon: remove closeall() calls from mydaemon()Steve Dickson2009-06-292-7/+16
| | | | | | | | | | | | | | | idmapd and svcgssd have a mydaemon() routine that uses closeall() to close file descriptors. Unfortunately, they aren't using it correctly and it ends up closing the pipe that the child process uses to talk to its parent. Fix this by not using closeall() in this routine and instead, just close the file descriptors that we know need to be closed. If /dev/null can't be opened for some reason, then just have the child exit with a non-zero error. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* The closeall function is broken in such a way that it almost neverSteve Dickson2009-06-221-3/+8
| | | | | | | | | | | | | | | | | | | | | | | | closes any file descriptors. It's calling strtol on the text representation of the file descriptor, and then checking to see if the value of *endptr is not '\0' before trying to close the file. This check is wrong. When strtol returns an endptr that points to a NULL byte, that indicates that the conversion was completely successful. I believe this check should instead be requiring that endptr is pointing to '\0' before closing the fd. Also, fix up the function to check for conversion errors from strtol. If one occurs, just skip the close on that entry. Finally, as Trond pointed out, it's unlikely that readdir will return a blank string in d_name but that situation wouldn't be detected by the current code. This patch adds such a check and skips the close if it occurs. Reported-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* Make --enable-tirpc the default. If --enable-tirpc wasn't explicitlySteve Dickson2009-06-223-8/+20
| | | | | | | | | specified, but TIRPC libs or headers aren't present then just throw a warning and disable it. If it was explicitly specified, then throw an error and exit if they aren't present. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* Set the verbosity level in both the librpcsecgss andSteve Dickson2009-06-222-0/+6
| | | | | | | libnfsidmapd libraries when verbosity level is set by the '-v' flag it on either daemon. Signed-off-by: Steve Dickson <steved@redhat.com>
* Retry export if getfh fails.NeilBrown2009-06-031-1/+10
| | | | | | | | | | | | | | mountd tries to avoid telling the kernel to export something when the kernel already knows to do that. However sometimes (exportfs -r) the kernel can be told to forget something without mountd realising. So if mountd finds that it cannot get a valid filehandle, make sure it really has been exported to the kernel. This only applies if the nfsd filesystem is not mounted. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Steve Dickson <steved@redhat.com>
* Release 1.2.0Steve Dickson2009-06-021-1/+1
| | | | Signed-off-by: Steve Dickson <steved@redhat.com>
* Replace the Sun RPC license with the BSD license,Tom spot Callaway2009-06-0218-453/+420
| | | | | | | with the explicit permission of Sun Microsystems Signed-off-by: Tom "spot" Callaway <tcallawa@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* umount.nfs: Harden umount.nfs error reportingChuck Lever2009-05-182-13/+23
| | | | | | | | | | Add additional error reporting to nfs_advise_umount(). These messages can be displayed if the "-v" option is specified with umount.nfs. Normally these messages do not appear. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* nfs-utils: Fix IPv6 support in support/nfs/rpc_socket.cChuck Lever2009-05-181-7/+5
| | | | | | | | | | | Use the correct #ifdef variable to enable IPv6 support for privileged RPC clients. Without this fix, unmounting an IPv6 NFSv2/v3 server fails. Introduced by commit 8c94296bc84f3a204f2061c0391a1d2350e4f37e. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* When compiling nfs-utils-1.1.6, I get this error:Robert Schwebel2009-05-181-1/+1
| | | | | | | | | | | | | | | | arm-iwmmx-linux-gnueabi-gcc -DHAVE_CONFIG_H -I. -I../../support/include -isystem /home/rsc/svn/oselas/bsp/OSELAS.BSP-Pengutronix-AllYes-trunk/platform-phyCORE-PXA270.PCM990/sysroot-target/include -isystem /home/rsc/svn/oselas/bsp/OSELAS.BSP-Pengutronix-AllYes-trunk/platform-phyCORE-PXA270.PCM990/sysroot-target/usr/include -D_GNU_SOURCE -Wall -Wstrict-prototypes -pipe -g -O2 -MT sm_inter_svc.o -MD -MP -MF .deps/sm_inter_svc.Tpo -c -o sm_inter_svc.o sm_inter_svc.c sm_inter_svc.c:10:39: error: sys/ttycom.h: No such file or directory Use sys/ioctl.h instead. Signed-off-by: Robert Schwebel <r.schwebel@pengutronix.de> Signed-off-by: Steve Dickson <steved@redhat.com>
* mount: remove legacy version of nfs_name_to_address()Chuck Lever2009-05-184-81/+28
| | | | | | | | | | | | | | | | | | | | | | | Currently we have two separate copies of nfs_name_to_address() since some older glibc's don't define AI_ADDRCONFIG. This means extra work to build- and run-test both functions when code is changed in this area. It is also the case that gethostbyname(3) is deprecated, and should not be used in new code. Remove the legacy code in favor of always using getaddrinfo(3). We can also get rid of nfs_name_to_address()'s @family argument as well. Note also this addresses a bug in nfsumount.c -- it was calling nfs_name_to_address() with AF_UNSPEC unconditionally, even if the legacy version of nfs_name_to_address(), which doesn't support AF_UNSPEC, was in use. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* sm-notify: Failed DNS lookups should be retriedChuck Lever2009-05-181-12/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently, if getaddrinfo(3) fails when trying to resolve a hostname, sm-notify gives up immediately on that host. If sm-notify is started before network service is available on a system, that means it quits without notifying anyone. Or, if DNS service isn't available due to a network partition or because the DNS server crashed, sm-notify will simply remove all of its callback files and exit. Really, sm-notify should try harder. We know that the hostnames passed in to notify_host() have already been vetted by statd, which won't monitor a hostname that it can't resolve. So it's likely that any DNS failure we meet here is a temporary condition. If it isn't, then sm-notify will stop trying to notify that host in 15 minutes anyway. [ The host's file is left in /var/lib/nfs/sm.bak in this case, but sm.bak is not read again until the next time sm-notify runs. ] sm-notify already has retry logic for handling RPC timeouts. We can co-opt that to drive DNS resolution retries. We also add AI_ADDRCONFIG because on systems whose network startup is handled by NetworkManager, there appears to be a bug that causes processes that started calling getaddinfo(3) before the network came up to continue getting EAI_AGAIN even after the network is fully operating. As I understand it, legacy glibc (before AI_ADDRCONFIG was exposed in headers) sets AI_ADDRCONFIG by default, although I haven't checked this. In any event, pre-glibc-2.2 systems probably won't run NetworkManager anyway, so this may not be much of a problem for them. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* sm-notify: Don't orphan addrinfo structsChuck Lever2009-05-181-13/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | sm-notify orphans an addrinfo struct in its address list rotation logic if only a single result was returned from getaddrinfo(3). For each host, the first time through notify_host(), we want to send a PMAP_GETPORT request. ->ai is NULL, and retries is set to 100, forcing a DNS lookup and an address rotation. If only a single addrinfo struct is returned, the rotation logic causes a NULL to be planted in ->ai, copied from the ai_next field of the returned result. This means that the second time through notify_host() (to perform the actual SM_NOTIFY call) we do a second DNS lookup, since ->ai is NULL. The result of the first lookup has been orphaned, and extra network traffic is generated. This scenario is actually fairly common. Since we pass .ai_protocol = IPPROTO_UDP, to getaddrinfo(3), for most hosts, which have a single forward and reverse pointer in the DNS database, we get back a single addrinfo struct as a result. To address this problem, only perform the address list rotation if there is more than one element on the list returned by getaddrinfo(3). Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* utils/nfsd: enable nfs minorvers4 by defaultBenny Halevy2009-05-181-1/+1
| | | | | | | | | Enable support for the maximum minor version (4.1 at the moment) by default. It can be disabled using the -N command line option. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* Extend -N command line option syntax to acceptBenny Halevy2009-05-181-3/+8
| | | | | | | | <version>.<minorversion> to disable support for <minorversion>. Only 4.1 is currently supported. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* utils/nfsd: add support for minorvers4Benny Halevy2009-05-044-6/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | minorvers4 can be used to either enable or disable nfsv4.x. If minorvers4 is a positive integer n, in the allowed range (only minorversion 1 is supported for now), the string "+4.n" is appended to the versions string written onto /proc/fs/nfsd/versions. Correspondingly, if minorver4 is a negative integer -n, the string "-4.n" is written. With the default value, minorvers4==0, the minor version setting is not changed. Note that unlike the protocol versions 2, 3, or 4. The minor version setting controls the *maximum* minor version nfsd supports. Particular minor version cannot be controlled on their own. With only minor version 1 supported at the moment the difference doesn't matter, but for future minor versions greater than 1, enabling minor version X will enable support for all minor versions 1 through X. Disabling minor version X will disable support for minor versions X and up, enabling 1 through X-1. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* Host aliases need to be checked when netgroups is used in exports.Steve Dickson2009-04-291-1/+7
| | | | Signed-off-by: Steve Dickson <steved@redhat.com>
* Release 1.1.6Steve Dickson2009-04-201-1/+1
| | | | Signed-off-by: Steve Dickson <steved@redhat.com>
* umount.nfs: Fix return value of nfs_mount_protocol()Chuck Lever2009-04-181-1/+1
| | | | | | | | Fix a copy-paste error introduced in nfs_mount_protocol(). It should return an IPPROTO_ number, not an NFS version number. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* umount.nfs: Use a privileged port when sending UMNT requestsChuck Lever2009-04-181-1/+1
| | | | | | | | | | | Turns out we do actually need to use a privileged port for UMNT. The Linux rpc.mountd complains if an ephemeral source port is used: Apr 17 15:52:19 ingres mountd[2061]: refused unmount request from 192.168.0.59 for /export (/export): illegal port 60932 Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
* support: Provide an API for creating a privileged RPC clientChuck Lever2009-04-182-8/+143
| | | | | | | | | | | | | | We needed to guarantee that some RPC programs, such as PMAP, got an unprivileged port, to prevent exhausting the local privileged port space sending RPC requests that don't need such privileges. nfs_get_rpcclient() provides that feature. However, some RPC programs, such as MNT and UMNT, require a privileged port. So, let's provide an additional API for this that also supports IPv6 and setting a destination port. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>