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

Commit 3ed5e2a2 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Report network/connection errors correctly for SOFTCONN rpc tasks



In the case of a SOFTCONN rpc task, we really want to ensure that it
reports errors like ENETUNREACH back to the caller. Currently, only
some of these errors are being reported back (connect errors are not),
and they are being converted by the RPC layer into EIO.

Reported-by: default avatarJan Engelhardt <jengelh@inai.de>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 1166fde6
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -1644,22 +1644,26 @@ call_connect_status(struct rpc_task *task)

	dprint_status(task);

	task->tk_status = 0;
	if (status >= 0 || status == -EAGAIN) {
		clnt->cl_stats->netreconn++;
		task->tk_action = call_transmit;
		return;
	}

	trace_rpc_connect_status(task, status);
	switch (status) {
		/* if soft mounted, test if we've timed out */
	case -ETIMEDOUT:
		task->tk_action = call_timeout;
		return;
	case -ECONNREFUSED:
	case -ECONNRESET:
	case -ENETUNREACH:
		if (RPC_IS_SOFTCONN(task))
			break;
	default:
		rpc_exit(task, -EIO);
		/* retry with existing socket, after a delay */
	case 0:
	case -EAGAIN:
		task->tk_status = 0;
		clnt->cl_stats->netreconn++;
		task->tk_action = call_transmit;
		return;
	}
	rpc_exit(task, status);
}

/*
+4 −4
Original line number Diff line number Diff line
@@ -2202,10 +2202,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)
		 */
		xs_tcp_force_close(xprt);
		break;
	case -ECONNREFUSED:
	case -ECONNRESET:
	case -ENETUNREACH:
		/* retry with existing socket, after a delay */
	case 0:
	case -EINPROGRESS:
	case -EALREADY:
@@ -2216,6 +2212,10 @@ static void xs_tcp_setup_socket(struct work_struct *work)
		/* Happens, for instance, if the user specified a link
		 * local IPv6 address without a scope-id.
		 */
	case -ECONNREFUSED:
	case -ECONNRESET:
	case -ENETUNREACH:
		/* retry with existing socket, after a delay */
		goto out;
	}
out_eagain: