mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-25 17:53:34 -05:00
SUNRPC: Ensure that the gssproxy client can start in a connected state
Ensure that the gssproxy client connects to the server from the gssproxy
daemon process context so that the AF_LOCAL socket connection is done
using the correct path and namespaces.
Fixes: 1d658336b0
("SUNRPC: Add RPC based upcall mechanism for RPCGSS auth")
Cc: stable@vger.kernel.org
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
3d1b0d3514
commit
fd13359f54
3 changed files with 35 additions and 0 deletions
|
@ -160,6 +160,7 @@ struct rpc_add_xprt_test {
|
||||||
#define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT (1UL << 9)
|
#define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT (1UL << 9)
|
||||||
#define RPC_CLNT_CREATE_SOFTERR (1UL << 10)
|
#define RPC_CLNT_CREATE_SOFTERR (1UL << 10)
|
||||||
#define RPC_CLNT_CREATE_REUSEPORT (1UL << 11)
|
#define RPC_CLNT_CREATE_REUSEPORT (1UL << 11)
|
||||||
|
#define RPC_CLNT_CREATE_CONNECTED (1UL << 12)
|
||||||
|
|
||||||
struct rpc_clnt *rpc_create(struct rpc_create_args *args);
|
struct rpc_clnt *rpc_create(struct rpc_create_args *args);
|
||||||
struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
|
struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
|
||||||
|
|
|
@ -98,6 +98,7 @@ static int gssp_rpc_create(struct net *net, struct rpc_clnt **_clnt)
|
||||||
* done without the correct namespace:
|
* done without the correct namespace:
|
||||||
*/
|
*/
|
||||||
.flags = RPC_CLNT_CREATE_NOPING |
|
.flags = RPC_CLNT_CREATE_NOPING |
|
||||||
|
RPC_CLNT_CREATE_CONNECTED |
|
||||||
RPC_CLNT_CREATE_NO_IDLE_TIMEOUT
|
RPC_CLNT_CREATE_NO_IDLE_TIMEOUT
|
||||||
};
|
};
|
||||||
struct rpc_clnt *clnt;
|
struct rpc_clnt *clnt;
|
||||||
|
|
|
@ -76,6 +76,7 @@ static int rpc_encode_header(struct rpc_task *task,
|
||||||
static int rpc_decode_header(struct rpc_task *task,
|
static int rpc_decode_header(struct rpc_task *task,
|
||||||
struct xdr_stream *xdr);
|
struct xdr_stream *xdr);
|
||||||
static int rpc_ping(struct rpc_clnt *clnt);
|
static int rpc_ping(struct rpc_clnt *clnt);
|
||||||
|
static int rpc_ping_noreply(struct rpc_clnt *clnt);
|
||||||
static void rpc_check_timeout(struct rpc_task *task);
|
static void rpc_check_timeout(struct rpc_task *task);
|
||||||
|
|
||||||
static void rpc_register_client(struct rpc_clnt *clnt)
|
static void rpc_register_client(struct rpc_clnt *clnt)
|
||||||
|
@ -483,6 +484,12 @@ static struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
|
||||||
rpc_shutdown_client(clnt);
|
rpc_shutdown_client(clnt);
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
} else if (args->flags & RPC_CLNT_CREATE_CONNECTED) {
|
||||||
|
int err = rpc_ping_noreply(clnt);
|
||||||
|
if (err != 0) {
|
||||||
|
rpc_shutdown_client(clnt);
|
||||||
|
return ERR_PTR(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clnt->cl_softrtry = 1;
|
clnt->cl_softrtry = 1;
|
||||||
|
@ -2709,6 +2716,10 @@ static const struct rpc_procinfo rpcproc_null = {
|
||||||
.p_decode = rpcproc_decode_null,
|
.p_decode = rpcproc_decode_null,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct rpc_procinfo rpcproc_null_noreply = {
|
||||||
|
.p_encode = rpcproc_encode_null,
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rpc_null_call_prepare(struct rpc_task *task, void *data)
|
rpc_null_call_prepare(struct rpc_task *task, void *data)
|
||||||
{
|
{
|
||||||
|
@ -2762,6 +2773,28 @@ static int rpc_ping(struct rpc_clnt *clnt)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rpc_ping_noreply(struct rpc_clnt *clnt)
|
||||||
|
{
|
||||||
|
struct rpc_message msg = {
|
||||||
|
.rpc_proc = &rpcproc_null_noreply,
|
||||||
|
};
|
||||||
|
struct rpc_task_setup task_setup_data = {
|
||||||
|
.rpc_client = clnt,
|
||||||
|
.rpc_message = &msg,
|
||||||
|
.callback_ops = &rpc_null_ops,
|
||||||
|
.flags = RPC_TASK_SOFT | RPC_TASK_SOFTCONN | RPC_TASK_NULLCREDS,
|
||||||
|
};
|
||||||
|
struct rpc_task *task;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
task = rpc_run_task(&task_setup_data);
|
||||||
|
if (IS_ERR(task))
|
||||||
|
return PTR_ERR(task);
|
||||||
|
status = task->tk_status;
|
||||||
|
rpc_put_task(task);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
struct rpc_cb_add_xprt_calldata {
|
struct rpc_cb_add_xprt_calldata {
|
||||||
struct rpc_xprt_switch *xps;
|
struct rpc_xprt_switch *xps;
|
||||||
struct rpc_xprt *xprt;
|
struct rpc_xprt *xprt;
|
||||||
|
|
Loading…
Add table
Reference in a new issue