From: Chuck Lever <chuck.lever@oracle.com>
To: steved@redhat.com
Cc: linux-nfs@vger.kernel.org
Subject: [PATCH 11/31] getport: Clear shared error fields before trying rpcbind queries
Date: Mon, 29 Jun 2009 13:36:32 -0400 [thread overview]
Message-ID: <20090629173632.2076.6602.stgit@matisse.1015granger.net> (raw)
In-Reply-To: <20090629172704.2076.45402.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
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>
---
support/include/nfsrpc.h | 9 +++++++++
support/nfs/getport.c | 18 ++++++++++++++++++
support/nfs/rpc_socket.c | 4 ++++
utils/mount/network.c | 3 +--
4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/support/include/nfsrpc.h b/support/include/nfsrpc.h
index da3b4df..b3cdb8c 100644
--- a/support/include/nfsrpc.h
+++ b/support/include/nfsrpc.h
@@ -49,6 +49,15 @@
#define NSMPROG ((rpcprog_t)100024)
#endif
+/**
+ * nfs_clear_rpc_createerr - zap all error reporting fields
+ *
+ */
+static inline void nfs_clear_rpc_createerr(void)
+{
+ memset(&rpc_createerr, 0, sizeof(rpc_createerr));
+}
+
/*
* Look up an RPC program name in /etc/rpc
*/
diff --git a/support/nfs/getport.c b/support/nfs/getport.c
index 71f02f3..aa9c154 100644
--- a/support/nfs/getport.c
+++ b/support/nfs/getport.c
@@ -627,6 +627,8 @@ int nfs_rpc_ping(const struct sockaddr *sap, const socklen_t salen,
if (timeout != NULL)
tout = *timeout;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sap, (size_t)salen);
client = nfs_get_rpcclient(saddr, salen, protocol,
program, version, &tout);
@@ -690,6 +692,8 @@ unsigned short nfs_getport(const struct sockaddr *sap,
unsigned short port = 0;
CLIENT *client;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sap, (size_t)salen);
client = nfs_gp_get_rpcbclient(saddr, salen, protocol,
default_rpcb_version, &timeout);
@@ -729,6 +733,8 @@ int nfs_getport_ping(struct sockaddr *sap, const socklen_t salen,
CLIENT *client;
int result = 0;
+ nfs_clear_rpc_createerr();
+
client = nfs_gp_get_rpcbclient(sap, salen, protocol,
default_rpcb_version, &timeout);
if (client != NULL) {
@@ -745,6 +751,8 @@ int nfs_getport_ping(struct sockaddr *sap, const socklen_t salen,
memcpy(saddr, sap, (size_t)salen);
nfs_gp_set_port(saddr, htons(port));
+ nfs_clear_rpc_createerr();
+
client = nfs_get_rpcclient(saddr, salen, protocol,
program, version, &timeout);
if (client != NULL) {
@@ -803,6 +811,8 @@ unsigned short nfs_getlocalport(const rpcprot_t program,
CLIENT *client;
struct timeval timeout = { -1, 0 };
+ nfs_clear_rpc_createerr();
+
client = nfs_gp_get_rpcbclient(sap, salen, 0, RPCBVERS_4, &timeout);
if (client != NULL) {
struct rpcb parms;
@@ -817,6 +827,8 @@ unsigned short nfs_getlocalport(const rpcprot_t program,
#endif /* NFS_GP_LOCAL */
if (port == 0) {
+ nfs_clear_rpc_createerr();
+
if (nfs_gp_loopback_address(lb_addr, &lb_len)) {
port = nfs_getport(lb_addr, lb_len,
program, version, protocol);
@@ -878,6 +890,8 @@ unsigned short nfs_rpcb_getaddr(const struct sockaddr *sap,
if (timeout != NULL)
tout = *timeout;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sap, (size_t)salen);
client = nfs_gp_get_rpcbclient(saddr, salen, transport,
RPCBVERS_4, &tout);
@@ -904,6 +918,8 @@ unsigned short nfs_rpcb_getaddr(__attribute__((unused)) const struct sockaddr *s
__attribute__((unused)) const unsigned short protocol,
__attribute__((unused)) const struct timeval *timeout)
{
+ nfs_clear_rpc_createerr();
+
rpc_createerr.cf_stat = RPC_UNKNOWNADDR;
return 0;
}
@@ -959,6 +975,8 @@ unsigned long nfs_pmap_getport(const struct sockaddr_in *sin,
if (timeout != NULL)
tout = *timeout;
+ nfs_clear_rpc_createerr();
+
memcpy(saddr, sin, sizeof(address));
client = nfs_gp_get_rpcbclient(saddr, (socklen_t)sizeof(*sin),
transport, PMAPVERS, &tout);
diff --git a/support/nfs/rpc_socket.c b/support/nfs/rpc_socket.c
index ac4e6d8..a080487 100644
--- a/support/nfs/rpc_socket.c
+++ b/support/nfs/rpc_socket.c
@@ -443,6 +443,8 @@ CLIENT *nfs_get_rpcclient(const struct sockaddr *sap,
struct sockaddr_in *sin = (struct sockaddr_in *)sap;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+ nfs_clear_rpc_createerr();
+
switch (sap->sa_family) {
case AF_LOCAL:
return nfs_get_localclient(sap, salen, program,
@@ -506,6 +508,8 @@ CLIENT *nfs_get_priv_rpcclient(const struct sockaddr *sap,
struct sockaddr_in *sin = (struct sockaddr_in *)sap;
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+ nfs_clear_rpc_createerr();
+
switch (sap->sa_family) {
case AF_LOCAL:
return nfs_get_localclient(sap, salen, program,
diff --git a/utils/mount/network.c b/utils/mount/network.c
index 04a62ab..3080378 100644
--- a/utils/mount/network.c
+++ b/utils/mount/network.c
@@ -538,7 +538,6 @@ static int nfs_probe_port(const struct sockaddr *sap, const socklen_t salen,
memcpy(saddr, sap, salen);
p_prot = prot ? &prot : protos;
p_vers = vers ? &vers : versions;
- rpc_createerr.cf_stat = 0;
for (;;) {
p_port = nfs_getport(saddr, salen, prog, *p_vers, *p_prot);
@@ -581,7 +580,7 @@ out_ok:
pmap->pm_prot = *p_prot;
if (!port)
pmap->pm_port = p_port;
- rpc_createerr.cf_stat = 0;
+ nfs_clear_rpc_createerr();
return 1;
}
next prev parent reply other threads:[~2009-06-29 17:36 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-29 17:34 [PATCH 00/31] mount.nfs patches for next nfs-utils release Chuck Lever
[not found] ` <20090629172704.2076.45402.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2009-06-29 17:34 ` [PATCH 01/31] getport: RPCB_GETADDR r_owner should be an empty string Chuck Lever
2009-06-29 17:35 ` [PATCH 02/31] getport: RPCB_GETADDR's r_addr should contain rpcbind port, not zero Chuck Lever
2009-06-29 17:35 ` [PATCH 03/31] getport: Remove AI_ADDRCONFIG from nfs_gp_loopback_address() Chuck Lever
2009-06-29 17:35 ` [PATCH 04/31] getport: replace getnameinfo(NI_NUMERICHOST) with inet_ntop(3) Chuck Lever
2009-06-29 17:35 ` [PATCH 05/31] getport: Remove unneeded @salen arguments Chuck Lever
2009-06-29 17:35 ` [PATCH 06/31] New versions of libtool add extra aclocal scripts Chuck Lever
2009-06-29 17:35 ` [PATCH 07/31] support: Use HAVE_LIBTIRPC to switch in bindresvport_sa(3t) Chuck Lever
2009-06-29 17:36 ` [PATCH 08/31] support: Don't return RPC_UNKNOWNHOST from rpc_socket.c Chuck Lever
2009-06-29 17:36 ` [PATCH 09/31] support: Set proper retransmit timeout for datagram transports Chuck Lever
2009-06-29 17:36 ` [PATCH 10/31] getport: RPC_PROGNOTREGISTERED is a permanent error Chuck Lever
2009-06-29 17:36 ` Chuck Lever [this message]
2009-06-29 17:36 ` [PATCH 12/31] mount.nfs: Add more debugging output around nfs_getport() Chuck Lever
2009-06-29 17:36 ` [PATCH 13/31] getport: Restore historical TCP connect timeout error code Chuck Lever
2009-06-29 17:37 ` [PATCH 14/31] getport: Convert TCP connection refused to RPC_CANTRECV Chuck Lever
2009-06-29 17:37 ` [PATCH 15/31] mount.nfs: If port= specifies an unregistered port, retry, then fail Chuck Lever
2009-06-29 17:37 ` [PATCH 16/31] mount.nfs: force rpcbind queries if options aren't specified Chuck Lever
2009-06-29 17:37 ` [PATCH 17/31] mount.nfs: make nfs_options2pmap return errors Chuck Lever
2009-06-29 17:37 ` [PATCH 18/31] mount.nfs: rearchitect mount version/protocol negotiation logic Chuck Lever
2009-06-29 17:37 ` [PATCH 19/31] mount.nfs: Clean up nfs_is_permanent_error() Chuck Lever
2009-06-29 17:37 ` [PATCH 20/31] mount.nfs: Clean up after restructuring version/protocol negotiation Chuck Lever
2009-06-29 17:38 ` [PATCH 21/31] mount.nfs: Don't update extra_opts after text-based negotiation Chuck Lever
2009-06-29 17:38 ` [PATCH 22/31] support: Introduce sockaddr helpers to get and set IP port numbers Chuck Lever
2009-06-29 17:38 ` [PATCH 23/31] mount.nfs: Use correct data type in discover_nfs_mount_data_version() Chuck Lever
2009-06-29 17:38 ` [PATCH 24/31] mount.nfs: Remove unused parameter in try_mount() Chuck Lever
2009-06-29 17:38 ` [PATCH 25/31] mount.nfs: Fix some nfs_error() nits in network.c Chuck Lever
2009-06-29 17:39 ` [PATCH 26/31] mount.nfs: Remove unused @salen parameter from nfs_ca_gai() Chuck Lever
2009-06-29 17:39 ` [PATCH 27/31] mount.nfs: remove unused @addrlen argument from nfs_string_to_sockaddr() Chuck Lever
2009-06-29 17:39 ` [PATCH 28/31] umount.nfs: Use correct data type in nfsumount() Chuck Lever
2009-06-29 17:39 ` [PATCH 29/31] mount.nfs: Fix compiler warning in stropts.c Chuck Lever
2009-06-29 17:39 ` [PATCH 30/31] mount.nfs: Squelch unused parameter warnings on empty functions Chuck Lever
2009-06-29 17:39 ` [PATCH 31/31] mount.nfs: Squelch compiler warnings in nfs_strerror() Chuck Lever
2009-07-15 13:50 ` [PATCH 00/31] mount.nfs patches for next nfs-utils release 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=20090629173632.2076.6602.stgit@matisse.1015granger.net \
--to=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=steved@redhat.com \
/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