Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3326857pxb; Mon, 1 Mar 2021 07:19:57 -0800 (PST) X-Google-Smtp-Source: ABdhPJxAkRu6mI8YY5F0sU6Cpan2UewLRp6MkkXILTxWskXdeJpqs2jU86AKhWDVx7G11QJCywLm X-Received: by 2002:aa7:c4cc:: with SMTP id p12mr1295328edr.325.1614611997384; Mon, 01 Mar 2021 07:19:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614611997; cv=none; d=google.com; s=arc-20160816; b=pBhdtSit67jEoWloxEgHI4ceiyt6mTB2zQEphBpuR7OxepbIzaXYq3hQwsOZPWi4Jk gZtf9QXKHSMtVqIZwcBtmenBiPDZ5fD3iVpGfXLok7OjvD1HdWOqBVSjzVtWJ5yqhKPz sVYU7FT7uFHusaf4YHGD8aectQ9ucqd8uZT4qn8zX80LzTV1z4/dQCZ2FIL/wWzBCD1d JG8D0t2e5ctxzV+yVfTXphsDKw+a08PTLK2ulhidAZC6+Yb1xBB/qeY0mJDsd5bIbvyM OjuClCDsjO+xn5+3YRXmTiwVnBdx8Z8lvMi8kMNrUi4yHkVjw/F7K8EF4UO0J5n9zmYz e27A== 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=MuZhz8VCi4WjVBieaivCGFKgbq1LOaGS6xx3/kjE/+o=; b=o8/AwpzNDRzFQTZwf6rK8iqm0ReBWy/PdrAWl6BnjNPnUWQbQjQIbT3o2tJl+VyEsa 6kluKR0zdRwHFO9ZVDpy6pq3aebUOl2oFvvUDhTLc777Rx40NXvn53kLTSwzdUjZeVnr VGST3uXRzG7ZJ+N8YD7v5rQBNa50RX/nN1hDfzVRHShxNznY38ySlpG5+4Nt8ehSNUam B9q53WmtDfqs0P0o6vNmJ6vSPi3k75p71c6107tnM61RHf/jNllHHx3m/4GX5joU7SEN +rqeiwxv69KhIqsFGqUpGnP37e7r2AdlENOP4vsY2JC/NtkfJPjRAW4+EcxUn8xgEtl7 oCFw== 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 jl16si6218835ejc.330.2021.03.01.07.19.32; Mon, 01 Mar 2021 07:19:57 -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 S235917AbhCAPSo (ORCPT + 99 others); Mon, 1 Mar 2021 10:18:44 -0500 Received: from mail.kernel.org ([198.145.29.99]:41146 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237030AbhCAPSm (ORCPT ); Mon, 1 Mar 2021 10:18:42 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id E6C9764E04 for ; Mon, 1 Mar 2021 15:18:01 +0000 (UTC) Subject: [PATCH v1 27/42] NFSD: Update the NFSv2 READ result encoder to use struct xdr_stream From: Chuck Lever To: linux-nfs@vger.kernel.org Date: Mon, 01 Mar 2021 10:18:01 -0500 Message-ID: <161461188121.8508.15688551888928802157.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/nfsproc.c | 1 + fs/nfsd/nfsxdr.c | 32 +++++++++++++++----------------- fs/nfsd/xdr.h | 1 + 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index f55080482997..2088bb0887ba 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -185,6 +185,7 @@ nfsd_proc_read(struct svc_rqst *rqstp) v = 0; len = argp->count; + resp->pages = rqstp->rq_next_page; while (len > 0) { struct page *page = *(rqstp->rq_next_page++); diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index 74d9d11949c6..d6d7d07dbb1b 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c @@ -549,27 +549,25 @@ nfssvc_encode_readlinkres(struct svc_rqst *rqstp, __be32 *p) int nfssvc_encode_readres(struct svc_rqst *rqstp, __be32 *p) { + struct xdr_stream *xdr = &rqstp->rq_res_stream; struct nfsd_readres *resp = rqstp->rq_resp; struct kvec *head = rqstp->rq_res.head; - *p++ = resp->status; - if (resp->status != nfs_ok) - return xdr_ressize_check(rqstp, p); - - p = encode_fattr(rqstp, p, &resp->fh, &resp->stat); - *p++ = htonl(resp->count); - xdr_ressize_check(rqstp, p); - - /* now update rqstp->rq_res to reflect data as well */ - rqstp->rq_res.page_len = resp->count; - if (resp->count & 3) { - /* need to pad the tail */ - rqstp->rq_res.tail[0].iov_base = p; - *p = 0; - rqstp->rq_res.tail[0].iov_len = 4 - (resp->count&3); - } - if (svc_encode_result_payload(rqstp, head->iov_len, resp->count)) + if (!svcxdr_encode_stat(xdr, resp->status)) return 0; + switch (resp->status) { + case nfs_ok: + if (!svcxdr_encode_fattr(rqstp, xdr, &resp->fh, &resp->stat)) + return 0; + if (xdr_stream_encode_u32(xdr, resp->count) < 0) + return 0; + xdr_write_pages(xdr, resp->pages, rqstp->rq_res.page_base, + resp->count); + if (svc_encode_result_payload(rqstp, head->iov_len, resp->count) < 0) + return 0; + break; + } + return 1; } diff --git a/fs/nfsd/xdr.h b/fs/nfsd/xdr.h index b868565c471f..277b74c511ce 100644 --- a/fs/nfsd/xdr.h +++ b/fs/nfsd/xdr.h @@ -102,6 +102,7 @@ struct nfsd_readres { struct svc_fh fh; unsigned long count; struct kstat stat; + struct page **pages; }; struct nfsd_readdirres {