linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Trond Myklebust <trondmy@gmail.com>
To: Anna Schumaker <Anna.Schumaker@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: [PATCH v3 11/29] SUNRPC: Add tracking of RPC level errors
Date: Sun,  7 Apr 2019 13:58:54 -0400	[thread overview]
Message-ID: <20190407175912.23528-12-trond.myklebust@hammerspace.com> (raw)
In-Reply-To: <20190407175912.23528-11-trond.myklebust@hammerspace.com>

Add variables to track RPC level errors so that we can distinguish
between issue that arose in the RPC transport layer as opposed to
those arising from the reply message.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
---
 include/linux/sunrpc/sched.h |  2 ++
 net/sunrpc/clnt.c            | 40 ++++++++++++++++++++++++------------
 net/sunrpc/xprtsock.c        |  1 +
 3 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h
index c41f5f498b3b..f01990c6423d 100644
--- a/include/linux/sunrpc/sched.h
+++ b/include/linux/sunrpc/sched.h
@@ -61,6 +61,8 @@ struct rpc_task {
 		struct rpc_wait		tk_wait;	/* RPC wait */
 	} u;
 
+	int			tk_rpc_status;	/* Result of last RPC operation */
+
 	/*
 	 * RPC call state
 	 */
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 3ab743c0e888..a9e5e81c67be 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1468,6 +1468,7 @@ static int
 __rpc_restart_call(struct rpc_task *task, void (*action)(struct rpc_task *))
 {
 	task->tk_status = 0;
+	task->tk_rpc_status = 0;
 	task->tk_action = action;
 	return 1;
 }
@@ -1510,6 +1511,19 @@ const char
 		return "no proc";
 }
 
+static void
+__rpc_call_rpcerror(struct rpc_task *task, int tk_status, int rpc_status)
+{
+	task->tk_rpc_status = rpc_status;
+	rpc_exit(task, tk_status);
+}
+
+static void
+rpc_call_rpcerror(struct rpc_task *task, int status)
+{
+	__rpc_call_rpcerror(task, status, status);
+}
+
 /*
  * 0.  Initial state
  *
@@ -1579,7 +1593,7 @@ call_reserveresult(struct rpc_task *task)
 
 		printk(KERN_ERR "%s: status=%d, but no request slot, exiting\n",
 				__func__, status);
-		rpc_exit(task, -EIO);
+		rpc_call_rpcerror(task, -EIO);
 		return;
 	}
 
@@ -1608,7 +1622,7 @@ call_reserveresult(struct rpc_task *task)
 				__func__, status);
 		break;
 	}
-	rpc_exit(task, status);
+	rpc_call_rpcerror(task, status);
 }
 
 /*
@@ -1684,7 +1698,7 @@ call_refreshresult(struct rpc_task *task)
 	}
 	dprintk("RPC: %5u %s: refresh creds failed with error %d\n",
 				task->tk_pid, __func__, status);
-	rpc_exit(task, status);
+	rpc_call_rpcerror(task, status);
 }
 
 /*
@@ -1741,7 +1755,7 @@ call_allocate(struct rpc_task *task)
 		return;
 	}
 	if (status != -ENOMEM) {
-		rpc_exit(task, status);
+		rpc_call_rpcerror(task, status);
 		return;
 	}
 
@@ -1810,7 +1824,7 @@ call_encode(struct rpc_task *task)
 			task->tk_action = call_refresh;
 			break;
 		default:
-			rpc_exit(task, task->tk_status);
+			rpc_call_rpcerror(task, task->tk_status);
 		}
 		return;
 	} else {
@@ -1950,7 +1964,7 @@ call_bind_status(struct rpc_task *task)
 				task->tk_pid, -task->tk_status);
 	}
 
-	rpc_exit(task, status);
+	rpc_call_rpcerror(task, status);
 	return;
 
 retry_timeout:
@@ -1986,7 +2000,7 @@ call_connect(struct rpc_task *task)
 	if (task->tk_status < 0)
 		return;
 	if (task->tk_flags & RPC_TASK_NOCONNECT) {
-		rpc_exit(task, -ENOTCONN);
+		rpc_call_rpcerror(task, -ENOTCONN);
 		return;
 	}
 	if (!xprt_prepare_transmit(task))
@@ -2047,7 +2061,7 @@ call_connect_status(struct rpc_task *task)
 		call_transmit(task);
 		return;
 	}
-	rpc_exit(task, status);
+	rpc_call_rpcerror(task, status);
 	return;
 out_retry:
 	/* Check for timeouts before looping back to call_bind */
@@ -2138,7 +2152,7 @@ call_transmit_status(struct rpc_task *task)
 			if (!task->tk_msg.rpc_proc->p_proc)
 				trace_xprt_ping(task->tk_xprt,
 						task->tk_status);
-			rpc_exit(task, task->tk_status);
+			rpc_call_rpcerror(task, task->tk_status);
 			return;
 		}
 		/* fall through */
@@ -2301,7 +2315,7 @@ call_status(struct rpc_task *task)
 	rpc_check_timeout(task);
 	return;
 out_exit:
-	rpc_exit(task, status);
+	rpc_call_rpcerror(task, status);
 }
 
 static bool
@@ -2325,7 +2339,7 @@ rpc_check_timeout(struct rpc_task *task)
 	task->tk_timeouts++;
 
 	if (RPC_IS_SOFTCONN(task) && !rpc_check_connected(task->tk_rqstp)) {
-		rpc_exit(task, -ETIMEDOUT);
+		rpc_call_rpcerror(task, -ETIMEDOUT);
 		return;
 	}
 
@@ -2336,9 +2350,9 @@ rpc_check_timeout(struct rpc_task *task)
 				task->tk_xprt->servername);
 		}
 		if (task->tk_flags & RPC_TASK_TIMEOUT)
-			rpc_exit(task, -ETIMEDOUT);
+			rpc_call_rpcerror(task, -ETIMEDOUT);
 		else
-			rpc_exit(task, -EIO);
+			__rpc_call_rpcerror(task, -EIO, -ETIMEDOUT);
 		return;
 	}
 
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index b4b4b8db143c..c69951ed2ebc 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -2017,6 +2017,7 @@ static void xs_local_connect(struct rpc_xprt *xprt, struct rpc_task *task)
 		 * we'll need to figure out how to pass a namespace to
 		 * connect.
 		 */
+		task->tk_rpc_status = -ENOTCONN;
 		rpc_exit(task, -ENOTCONN);
 		return;
 	}
-- 
2.20.1


  reply	other threads:[~2019-04-07 18:01 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-07 17:58 [PATCH v3 00/29] Fix up soft mounts for NFSv4.x Trond Myklebust
2019-04-07 17:58 ` [PATCH v3 01/29] SUNRPC: Fix up task signalling Trond Myklebust
2019-04-07 17:58   ` [PATCH v3 02/29] SUNRPC: Refactor rpc_restart_call/rpc_restart_call_prepare Trond Myklebust
2019-04-07 17:58     ` [PATCH v3 03/29] SUNRPC: Refactor xprt_request_wait_receive() Trond Myklebust
2019-04-07 17:58       ` [PATCH v3 04/29] SUNRPC: Refactor rpc_sleep_on() Trond Myklebust
2019-04-07 17:58         ` [PATCH v3 05/29] SUNRPC: Remove unused argument 'action' from rpc_sleep_on_priority() Trond Myklebust
2019-04-07 17:58           ` [PATCH v3 06/29] SUNRPC: Add function rpc_sleep_on_timeout() Trond Myklebust
2019-04-07 17:58             ` [PATCH v3 07/29] SUNRPC: Fix up tracking of timeouts Trond Myklebust
2019-04-07 17:58               ` [PATCH v3 08/29] SUNRPC: Simplify queue timeouts using timer_reduce() Trond Myklebust
2019-04-07 17:58                 ` [PATCH v3 09/29] SUNRPC: Declare RPC timers as TIMER_DEFERRABLE Trond Myklebust
2019-04-07 17:58                   ` [PATCH v3 10/29] SUNRPC: Ensure that the transport layer respect major timeouts Trond Myklebust
2019-04-07 17:58                     ` Trond Myklebust [this message]
2019-04-07 17:58                       ` [PATCH v3 12/29] SUNRPC: Make "no retrans timeout" soft tasks behave like softconn for timeouts Trond Myklebust
2019-04-07 17:58                         ` [PATCH v3 13/29] SUNRPC: Start the first major timeout calculation at task creation Trond Myklebust
2019-04-07 17:58                           ` [PATCH v3 14/29] SUNRPC: Ensure to ratelimit the "server not responding" syslog messages Trond Myklebust
2019-04-07 17:58                             ` [PATCH v3 15/29] SUNRPC: Add the 'softerr' rpc_client flag Trond Myklebust
2019-04-07 17:58                               ` [PATCH v3 16/29] NFS: Consider ETIMEDOUT to be a fatal error Trond Myklebust
2019-04-07 17:59                                 ` [PATCH v3 17/29] NFS: Move internal constants out of uapi/linux/nfs_mount.h Trond Myklebust
2019-04-07 17:59                                   ` [PATCH v3 18/29] NFS: Add a mount option "softerr" to allow clients to see ETIMEDOUT errors Trond Myklebust
2019-04-07 17:59                                     ` [PATCH v3 19/29] NFS: Don't interrupt file writeout due to fatal errors Trond Myklebust
2019-04-07 17:59                                       ` [PATCH v3 20/29] NFS: Don't call generic_error_remove_page() while holding locks Trond Myklebust
2019-04-07 17:59                                         ` [PATCH v3 21/29] NFS: Don't inadvertently clear writeback errors Trond Myklebust
2019-04-07 17:59                                           ` [PATCH v3 22/29] NFS: Replace custom error reporting mechanism with generic one Trond Myklebust
2019-04-07 17:59                                             ` [PATCH v3 23/29] NFS: Fix up NFS I/O subrequest creation Trond Myklebust
2019-04-07 17:59                                               ` [PATCH v3 24/29] NFS: Remove unused argument from nfs_create_request() Trond Myklebust
2019-04-07 17:59                                                 ` [PATCH v3 25/29] pNFS: Add tracking to limit the number of pNFS retries Trond Myklebust
2019-04-07 17:59                                                   ` [PATCH v3 26/29] NFS: Allow signal interruption of NFS4ERR_DELAYed operations Trond Myklebust
2019-04-07 17:59                                                     ` [PATCH v3 27/29] NFS: Ensure that all nfs lock contexts have a valid open context Trond Myklebust
2019-04-07 17:59                                                       ` [PATCH v3 28/29] NFS: Add a helper to return a pointer to the open context of a struct nfs_page Trond Myklebust
2019-04-07 17:59                                                         ` [PATCH v3 29/29] NFS: Remove redundant open context from nfs_page Trond Myklebust

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=20190407175912.23528-12-trond.myklebust@hammerspace.com \
    --to=trondmy@gmail.com \
    --cc=Anna.Schumaker@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    /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;
as well as URLs for NNTP newsgroup(s).