Переглянути джерело

SUNRPC: RPC bind failures should be permanent for NULL requests

The purpose of an RPC ping (a NULL request) is to determine whether the
remote end is operating and supports the RPC program and version of the
request.

If we do an RPC bind and the remote's rpcbind service says "this
program or service isn't supported" then we have our answer already,
and we should give up immediately.

This is good for the kernel mount client, as it will cause the request
to fail, and then allow an immediate retry with different options.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Chuck Lever 17 роки тому
батько
коміт
b79dc8ced1
1 змінених файлів з 5 додано та 0 видалено
  1. 5 0
      net/sunrpc/clnt.c

+ 5 - 0
net/sunrpc/clnt.c

@@ -959,6 +959,11 @@ call_bind_status(struct rpc_task *task)
 	case -EACCES:
 	case -EACCES:
 		dprintk("RPC: %5u remote rpcbind: RPC program/version "
 		dprintk("RPC: %5u remote rpcbind: RPC program/version "
 				"unavailable\n", task->tk_pid);
 				"unavailable\n", task->tk_pid);
+		/* fail immediately if this is an RPC ping */
+		if (task->tk_msg.rpc_proc->p_proc == 0) {
+			status = -EOPNOTSUPP;
+			break;
+		}
 		rpc_delay(task, 3*HZ);
 		rpc_delay(task, 3*HZ);
 		goto retry_timeout;
 		goto retry_timeout;
 	case -ETIMEDOUT:
 	case -ETIMEDOUT: