> ** CID 114101:  Error handling issues  (CHECKED_RETURN)
> /net/sunrpc/xprtrdma/verbs.c: 355 in rpcrdma_create_id()
Commit 
5675add36e76 ("RPC/RDMA: harden connection logic against
missing/late rdma_cm upcalls.") replaced wait_for_completion() calls
with these two call sites.
The original wait_for_completion() calls were added in the initial
commit of verbs.c, which was commit 
c56c65fb67d6 ("RPCRDMA: rpc rdma
verbs interface implementation"), but these returned void.
rpcrdma_create_id() is called by the RDMA connect worker, which
probably won't ever be interrupted. It is also called by
rpcrdma_ia_open which is in the synchronous mount path, and ^C is
possible there.
Add a bit of logic at those two call sites to return if the waits
return ERESTARTSYS.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
 
 rpcrdma_create_id(struct rpcrdma_xprt *xprt,
                        struct rpcrdma_ia *ia, struct sockaddr *addr)
 {
+       unsigned long wtimeout = msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT) + 1;
        struct rdma_cm_id *id;
        int rc;
 
                        __func__, rc);
                goto out;
        }
-       wait_for_completion_interruptible_timeout(&ia->ri_done,
-                               msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT) + 1);
+       rc = wait_for_completion_interruptible_timeout(&ia->ri_done, wtimeout);
+       if (rc < 0) {
+               dprintk("RPC:       %s: wait() exited: %i\n",
+                       __func__, rc);
+               goto out;
+       }
 
        /* FIXME:
         * Until xprtrdma supports DEVICE_REMOVAL, the provider must
                        __func__, rc);
                goto put;
        }
-       wait_for_completion_interruptible_timeout(&ia->ri_done,
-                               msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT) + 1);
+       rc = wait_for_completion_interruptible_timeout(&ia->ri_done, wtimeout);
+       if (rc < 0) {
+               dprintk("RPC:       %s: wait() exited: %i\n",
+                       __func__, rc);
+               goto put;
+       }
        rc = ia->ri_async_rc;
        if (rc)
                goto put;