Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2685136imu; Tue, 6 Nov 2018 20:17:18 -0800 (PST) X-Google-Smtp-Source: AJdET5e7XpoNILq/89QtxprKRYd7mSxuPltHLm+Fmn5oKvypPpXWGbhQ93G5pqg5yScc6tpL9lfX X-Received: by 2002:a62:302:: with SMTP id 2-v6mr369402pfd.135.1541564238938; Tue, 06 Nov 2018 20:17:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541564238; cv=none; d=google.com; s=arc-20160816; b=KRrKTx50J0IHKTuEmg3kz68K+o2UOTEXZK6oAe/+NKCTO9S2yhZKkErj5mFw1bZOE/ Qgqe5+9xBFHqSxjzXm9YBuK4bkKyBLXiOW5XvqK3NPXuszZkoWKbTAQJRcFndUSZaiBj D0T/nA4BPKbALxSGVBWjUiRUwqmbtp50RfRsbrW+ufY0I9nqjizJDmLnvb44u2kg8jNp 82kdSgdvohFbMcfQLzUluGt1hf9K0Z6hHfXVJyhPfZ0QUTBgQJJINypi+t0ekwDI0wef KNpZ4iVYaDqXOz/zHUd71rwTwgjyTr7o2Z7Ax/mVAYrGQX7HTLMsRvjiPXvZGJndI6bV EVNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:cc:subject:date:to :from; bh=lD2cmOvR3z5Q6v9wgaHqJF+p/aSPF15+h5AbPiMplGA=; b=0PRNCpSqseViPPRpXTIqd8CEAbYYX5lMwlh4Bo1vDFylzy1CPImhaJ6GsBvtxWq4Ql fDoaz/JBkRbyrLnSg2JK3L0/7Elf/KxfQtfkALGi6bXOw8B8T71iI9fSuNPjCR0FgQr4 uXNUdax4G39fT1FlWSiUinW82WfIGcJr/b8BnfTpMFSwhnxGm8GMeplp+ccCY5XUkkiB Iceb1tbiFCnC4FyWbTLA56ddYDyT8WgNwukJbujiaBSaCvBIEqeeRoyPMsG4fJX4qUVg dhgrPjkdH/2yoJ7ZUnf/JxZgsQpFtcGYjZ36eEVOA8v+KSLhU1ZFEqJRsj5RXGQpRmEh WNPQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b13-v6si21463403plm.316.2018.11.06.20.17.04; Tue, 06 Nov 2018 20:17:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389157AbeKGNni (ORCPT + 99 others); Wed, 7 Nov 2018 08:43:38 -0500 Received: from mx2.suse.de ([195.135.220.15]:56832 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726516AbeKGNni (ORCPT ); Wed, 7 Nov 2018 08:43:38 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 9AAD4B659; Wed, 7 Nov 2018 04:15:00 +0000 (UTC) From: NeilBrown To: "J. Bruce Fields" , Chuck Lever , Jeff Layton , Trond Myklebust , Anna Schumaker Date: Wed, 07 Nov 2018 15:12:31 +1100 Subject: [PATCH 14/23] SUNRPC: add side channel to use non-generic cred for rpc call. Cc: Linux NFS Mailing List , linux-kernel@vger.kernel.org Message-ID: <154156395125.24086.7558322763063813778.stgit@noble> In-Reply-To: <154156285766.24086.14262073575778354276.stgit@noble> References: <154156285766.24086.14262073575778354276.stgit@noble> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The credential passed in rpc_message.rpc_cred is always a generic credential except in one instance. When gss_destroying_context() calls rpc_call_null(), it passes a specific credential that it needs to destroy. In this case the RPC acts *on* the credential rather than being authorized by it. This special case deserves explicit support and providing that will mean that rpc_message.rpc_cred is *always* generic, allowing some optimizations. So add "tk_op_cred" to rpc_task and "rpc_op_cred" to the setup data. Use this to pass the cred down from rpc_call_null(), and have rpcauth_bindcred() notice it and bind it in place. Credit to kernel test robot for finding a bug in earlier version of this patch. Signed-off-by: NeilBrown --- include/linux/sunrpc/sched.h | 2 ++ net/sunrpc/auth.c | 6 +++++- net/sunrpc/clnt.c | 2 +- net/sunrpc/sched.c | 3 +++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index bd722ebc70b7..4e2b893b83a8 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -71,6 +71,7 @@ struct rpc_task { struct rpc_clnt * tk_client; /* RPC client */ struct rpc_xprt * tk_xprt; /* Transport */ + struct rpc_cred * tk_op_cred; /* cred being operated on */ struct rpc_rqst * tk_rqstp; /* RPC request */ @@ -105,6 +106,7 @@ struct rpc_task_setup { struct rpc_task *task; struct rpc_clnt *rpc_client; struct rpc_xprt *rpc_xprt; + struct rpc_cred *rpc_op_cred; /* credential being operated on */ const struct rpc_message *rpc_message; const struct rpc_call_ops *callback_ops; void *callback_data; diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index dcfcc590b34e..27d90578e7a0 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c @@ -751,7 +751,11 @@ rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) if (flags & RPC_TASK_ASYNC) lookupflags |= RPCAUTH_LOOKUP_NEW; - if (cred != NULL && cred != &machine_cred) + if (task->tk_op_cred) + /* Task must use exactly this rpc_cred */ + new = task->tk_op_cred->cr_ops->crbind(task, task->tk_op_cred, + lookupflags); + else if (cred != NULL && cred != &machine_cred) new = cred->cr_ops->crbind(task, cred, lookupflags); else if (cred == &machine_cred) new = rpcauth_bind_machine_cred(task, lookupflags); diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 1217d874202c..87a517d576c1 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -2525,12 +2525,12 @@ struct rpc_task *rpc_call_null_helper(struct rpc_clnt *clnt, { struct rpc_message msg = { .rpc_proc = &rpcproc_null, - .rpc_cred = cred, }; struct rpc_task_setup task_setup_data = { .rpc_client = clnt, .rpc_xprt = xprt, .rpc_message = &msg, + .rpc_op_cred = cred, .callback_ops = (ops != NULL) ? ops : &rpc_default_ops, .callback_data = data, .flags = flags, diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 57ca5bead1cb..c9f65037a6ad 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -997,6 +997,8 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta task->tk_xprt = xprt_get(task_setup_data->rpc_xprt); + task->tk_op_cred = get_rpccred(task_setup_data->rpc_op_cred); + if (task->tk_ops->rpc_call_prepare != NULL) task->tk_action = rpc_prepare_task; @@ -1054,6 +1056,7 @@ static void rpc_free_task(struct rpc_task *task) { unsigned short tk_flags = task->tk_flags; + put_rpccred(task->tk_op_cred); rpc_release_calldata(task->tk_ops, task->tk_calldata); if (tk_flags & RPC_TASK_DYNAMIC) {