]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
SUNRPC: Add the 'softerr' rpc_client flag
authorTrond Myklebust <trondmy@gmail.com>
Sun, 7 Apr 2019 17:58:58 +0000 (13:58 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 25 Apr 2019 18:18:14 +0000 (14:18 -0400)
Add the 'softerr' rpc client flag that sets the RPC_TASK_TIMEOUT
flag on all new rpc tasks that are attached to that rpc client.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
include/linux/sunrpc/clnt.h
net/sunrpc/clnt.c

index 98bc9883b23096430cf7bcd36d97ea374cb88e69..943762acfcd4e0902c3a01624405d640449e7881 100644 (file)
@@ -50,6 +50,7 @@ struct rpc_clnt {
        struct rpc_iostats *    cl_metrics;     /* per-client statistics */
 
        unsigned int            cl_softrtry : 1,/* soft timeouts */
+                               cl_softerr  : 1,/* Timeouts return errors */
                                cl_discrtry : 1,/* disconnect before retry */
                                cl_noretranstimeo: 1,/* No retransmit timeouts */
                                cl_autobind : 1,/* use getport() */
@@ -144,6 +145,7 @@ struct rpc_add_xprt_test {
 #define RPC_CLNT_CREATE_INFINITE_SLOTS (1UL << 7)
 #define RPC_CLNT_CREATE_NO_IDLE_TIMEOUT        (1UL << 8)
 #define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT     (1UL << 9)
+#define RPC_CLNT_CREATE_SOFTERR                (1UL << 10)
 
 struct rpc_clnt *rpc_create(struct rpc_create_args *args);
 struct rpc_clnt        *rpc_bind_new_program(struct rpc_clnt *,
index b16322eb6c429c8e3696a23a5e409d243504a2b2..e933f118531717abe248fb8ac78eaa2304660a35 100644 (file)
@@ -484,8 +484,11 @@ static struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
        }
 
        clnt->cl_softrtry = 1;
-       if (args->flags & RPC_CLNT_CREATE_HARDRTRY)
+       if (args->flags & (RPC_CLNT_CREATE_HARDRTRY|RPC_CLNT_CREATE_SOFTERR)) {
                clnt->cl_softrtry = 0;
+               if (args->flags & RPC_CLNT_CREATE_SOFTERR)
+                       clnt->cl_softerr = 1;
+       }
 
        if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
                clnt->cl_autobind = 1;
@@ -623,6 +626,7 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args,
        /* Turn off autobind on clones */
        new->cl_autobind = 0;
        new->cl_softrtry = clnt->cl_softrtry;
+       new->cl_softerr = clnt->cl_softerr;
        new->cl_noretranstimeo = clnt->cl_noretranstimeo;
        new->cl_discrtry = clnt->cl_discrtry;
        new->cl_chatty = clnt->cl_chatty;
@@ -1001,6 +1005,8 @@ void rpc_task_set_client(struct rpc_task *task, struct rpc_clnt *clnt)
                atomic_inc(&clnt->cl_count);
                if (clnt->cl_softrtry)
                        task->tk_flags |= RPC_TASK_SOFT;
+               if (clnt->cl_softerr)
+                       task->tk_flags |= RPC_TASK_TIMEOUT;
                if (clnt->cl_noretranstimeo)
                        task->tk_flags |= RPC_TASK_NO_RETRANS_TIMEOUT;
                if (atomic_read(&clnt->cl_swapper))