Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3328626pxb; Mon, 1 Mar 2021 07:22:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJwKOsf6jp2bMQdQlXCegLMUUnWDtPTSc+SQQtX2/nJ0XO2Q5SogVSsV/sBcZGHKN1lp+Gvl X-Received: by 2002:a17:906:b14b:: with SMTP id bt11mr17004078ejb.162.1614612144743; Mon, 01 Mar 2021 07:22:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614612144; cv=none; d=google.com; s=arc-20160816; b=Sz/M7anbBYff4sSmWprUPvOaYNYg2mKXlbAw0hZGlfz8r/ybbQY4v5jvkLvciD7JI1 F3qMlZ8wvkcJ7Ne9lJhuQoD1ufO+uhHIP21dwQ3QsGTPmt7hbZ2whLoPzwliRlLrhX8R sBiq9fDLe0Fa+KyyvEyQgnNPrRiIHBEVuatgkvpKQxB8HcuCBKftNYJUjAn6sQeli+l3 ySQtq287kbVMw5N+ZLqfPQxZh6rUWlLSjpYkH4RM+IhjYY+Z7VKd+/S8X5jT+qoB8drn rrHkVdgNBDvRVAJg/w+2GAfrQj9+HVl3n5bitZNJfQ3ou3sbJ63CPLkPP0Ds9kZ/X9zi JKaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:to:from:subject; bh=D7MVhbg+unSCXFHotXUcGRlg+dpl7MYIuLOZDdpnMgw=; b=yzA9g77DUXnncHpUmQH4vWAGlaMR7VscUCV3CVNYXkvG3RsF18eYYd5wV/y7CsH6UQ qswXNxTZm2M0MxZq9q+OA7pl9yIX3jYm+xNv61slN5EhuD5rQNw0vXN8YvsqeO68X37y +7dbjWcz3fpVvDApy/ZXmiT4qOjtWoQFB2ogxcZGdwDOwjsm21M/+het5QQq4Dan5giw 2ALqe7k3FHZGVd7JxvurDOF2UtOck2smdU0aPHLIUK1JJAn+RylNu9eTWLIMJAK02FEy VWxsCD1ld2tTxg7EskOIf9MCNkWe39a20c5RW6e1UZOJzdrq7cxJMBhZfedPfeB5ZG1t ELdg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m26si2646977edv.514.2021.03.01.07.22.00; Mon, 01 Mar 2021 07:22:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237110AbhCAPUW (ORCPT + 99 others); Mon, 1 Mar 2021 10:20:22 -0500 Received: from mail.kernel.org ([198.145.29.99]:41742 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237088AbhCAPUA (ORCPT ); Mon, 1 Mar 2021 10:20:00 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3D33264E31 for ; Mon, 1 Mar 2021 15:19:20 +0000 (UTC) Subject: [PATCH v1 40/42] NFSD: Update the NFSv3 GETACL result encoder to use struct xdr_stream From: Chuck Lever To: linux-nfs@vger.kernel.org Date: Mon, 01 Mar 2021 10:19:19 -0500 Message-ID: <161461195953.8508.14099379461261780784.stgit@klimt.1015granger.net> In-Reply-To: <161461145466.8508.13379815439337754427.stgit@klimt.1015granger.net> References: <161461145466.8508.13379815439337754427.stgit@klimt.1015granger.net> User-Agent: StGit/1.0-5-g755c MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Signed-off-by: Chuck Lever --- fs/nfsd/nfs3acl.c | 33 +++++++++++++++++++-------------- fs/nfsd/nfs3xdr.c | 23 +++++++++++++++++++++-- fs/nfsd/xdr3.h | 3 +++ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/fs/nfsd/nfs3acl.c b/fs/nfsd/nfs3acl.c index 9a6f18d74d14..11991026ab3a 100644 --- a/fs/nfsd/nfs3acl.c +++ b/fs/nfsd/nfs3acl.c @@ -168,22 +168,25 @@ static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p) /* GETACL */ static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p) { + struct xdr_stream *xdr = &rqstp->rq_res_stream; struct nfsd3_getaclres *resp = rqstp->rq_resp; struct dentry *dentry = resp->fh.fh_dentry; + struct kvec *head = rqstp->rq_res.head; + struct inode *inode = d_inode(dentry); + unsigned int base; + int n; + int w; - *p++ = resp->status; - p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh); - if (resp->status == 0 && dentry && d_really_is_positive(dentry)) { - struct inode *inode = d_inode(dentry); - struct kvec *head = rqstp->rq_res.head; - unsigned int base; - int n; - int w; - - *p++ = htonl(resp->mask); - if (!xdr_ressize_check(rqstp, p)) + if (!svcxdr_encode_nfsstat3(xdr, resp->status)) + return 0; + switch (resp->status) { + case nfs_ok: + if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh)) return 0; - base = (char *)p - (char *)head->iov_base; + if (xdr_stream_encode_u32(xdr, resp->mask) < 0) + return 0; + + base = (char *)xdr->p - (char *)head->iov_base; rqstp->rq_res.page_len = w = nfsacl_size( (resp->mask & NFS_ACL) ? resp->acl_access : NULL, @@ -204,9 +207,11 @@ static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p) NFS_ACL_DEFAULT); if (n <= 0) return 0; - } else - if (!xdr_ressize_check(rqstp, p)) + break; + default: + if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh)) return 0; + } return 1; } diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index a37ea9fb8214..b8f894e00b6d 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -107,7 +107,16 @@ svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp) return true; } -static bool +/** + * svcxdr_encode_nfsstat3 - Encode an NFSv3 status code + * @xdr: XDR stream + * @status: status value to encode + * + * Return values: + * %false: Send buffer space was exhausted + * %true: Success + */ +bool svcxdr_encode_nfsstat3(struct xdr_stream *xdr, __be32 status) { __be32 *p; @@ -464,7 +473,17 @@ svcxdr_encode_pre_op_attr(struct xdr_stream *xdr, const struct svc_fh *fhp) return svcxdr_encode_wcc_attr(xdr, fhp); } -static bool +/** + * svcxdr_encode_post_op_attr - Encode NFSv3 post-op attributes + * @rqstp: Context of a completed RPC transaction + * @xdr: XDR stream + * @fhp: File handle to encode + * + * Return values: + * %false: Send buffer space was exhausted + * %true: Success + */ +bool svcxdr_encode_post_op_attr(struct svc_rqst *rqstp, struct xdr_stream *xdr, const struct svc_fh *fhp) { diff --git a/fs/nfsd/xdr3.h b/fs/nfsd/xdr3.h index b851458373db..746c5f79964f 100644 --- a/fs/nfsd/xdr3.h +++ b/fs/nfsd/xdr3.h @@ -308,5 +308,8 @@ int nfs3svc_encode_entryplus3(void *data, const char *name, int namlen, __be32 *nfs3svc_encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp); bool svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp); +bool svcxdr_encode_nfsstat3(struct xdr_stream *xdr, __be32 status); +bool svcxdr_encode_post_op_attr(struct svc_rqst *rqstp, struct xdr_stream *xdr, + const struct svc_fh *fhp); #endif /* _LINUX_NFSD_XDR3_H */