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

Commit 71bdcf80 authored by Chuck Lever's avatar Chuck Lever Committed by Linus Torvalds
Browse files

[PATCH] SUNRPC: fix race in in-kernel RPC portmapper client



When submitting a request to a fast portmapper (such as the local rpcbind
daemon), the request can complete before the parent task is even queued up on
xprt->binding.  Fix this by queuing before submitting the rpcbind request.

Test plan:
Connectathon locking test with UDP.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b87c0adf
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -101,11 +101,13 @@ void rpc_getport(struct rpc_task *task)
	/* Autobind on cloned rpc clients is discouraged */
	BUG_ON(clnt->cl_parent != clnt);

	if (xprt_test_and_set_binding(xprt)) {
		task->tk_status = -EACCES;	/* tell caller to check again */
	/* Put self on queue before sending rpcbind request, in case
	 * pmap_getport_done completes before we return from rpc_run_task */
	rpc_sleep_on(&xprt->binding, task, NULL, NULL);
		return;
	}

	status = -EACCES;		/* tell caller to check again */
	if (xprt_test_and_set_binding(xprt))
		goto bailout_nofree;

	/* Someone else may have bound if we slept */
	status = 0;
@@ -134,8 +136,6 @@ void rpc_getport(struct rpc_task *task)
		goto bailout;
	rpc_release_task(child);

	rpc_sleep_on(&xprt->binding, task, NULL, NULL);

	task->tk_xprt->stat.bind_count++;
	return;