Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd01b259 authored by NeilBrown's avatar NeilBrown Committed by Trond Myklebust
Browse files

SUNRPC: ECONNREFUSED should cause a rebind.



If you
 - mount and NFSv3 filesystem
 - do some file locking which requires the server
   to make a GRANT call back
 - unmount
 - mount again and do the same locking

then the second attempt at locking suffers a 30 second delay.
Unmounting and remounting causes lockd to stop and restart,
which causes it to bind to a new port.
The server still thinks the old port is valid and gets ECONNREFUSED
when trying to contact it.
ECONNREFUSED should be seen as a hard error that is not worth
retrying.  Rebinding is the only reasonable response.

This patch forces a rebind if that makes sense.

Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 3bde7afd
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -1903,6 +1903,14 @@ call_connect_status(struct rpc_task *task)
	task->tk_status = 0;
	task->tk_status = 0;
	switch (status) {
	switch (status) {
	case -ECONNREFUSED:
	case -ECONNREFUSED:
		/* A positive refusal suggests a rebind is needed. */
		if (RPC_IS_SOFTCONN(task))
			break;
		if (clnt->cl_autobind) {
			rpc_force_rebind(clnt);
			task->tk_action = call_bind;
			return;
		}
	case -ECONNRESET:
	case -ECONNRESET:
	case -ECONNABORTED:
	case -ECONNABORTED:
	case -ENETUNREACH:
	case -ENETUNREACH: