Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3326497pxb; Mon, 1 Mar 2021 07:19:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJwk7p/VreXPmNfwDbLduewGkLNKtNSqe9GCCb7utocAqaYVBdV4SuFkFR2SKugk/7CNr72o X-Received: by 2002:a17:906:2743:: with SMTP id a3mr16695694ejd.378.1614611972484; Mon, 01 Mar 2021 07:19:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614611972; cv=none; d=google.com; s=arc-20160816; b=tLZlto/VBQyZqa73jkogDi4LeE0GWlZa8dUDWnN1/meEOpk7zdY+jhteiFW3ouB3cn l96FWDIljImo5m4TXfsQ/5m0oXbFgN/+Uqpq9EtR0lqGY/daX1huF0po3S7P8EJ9SCxK sEJbnJFwN/2nstzMsUJf1SJvcZntFrV0QCM6+9BLU9PctAf8QijdTeQFNUZVBIfVqkHR SkqqAwZn7B0jBhykyzRbfCkFmmIx2wcIed0aY7LY61HFZJhWvcDdX113q5KiwKFRmTMm Won+ufwtCuukgGVgnaCgdlMTopE4BiDyrZzS5N3ymlwiqC860xXx6mHoyazc9gCV+Cuu EWcA== 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=fmSWDW7OuMolHFlYC6IUNvUeQ2e9iqP+iPxmQpBFhDY=; b=OQ+dQRsHIs/SBCIwrB61lpUI7CZWr60zBNVV7ZhWOlGm/DebPLyHgFxaMMaIcYguW7 REOeOy1iLTUc85DMB8HErv/Bk/tK1uPmZPMtdr8s8YVHtTLRqRIVAVhR3mXGDy6543Q1 +6KKpfxkqaNdh6/BEd1T2eKUtpslfU4xTIc3fsoOVQcs16MT/JNZQr5qUHoV9DVq+ZNi mPjMDZ/WX8HxiWFfw/+YSpHg9WCILWpEF8Wsd8KkKyxrd3ZHCb2gANDWwlQW2ls3gzyu 4POKMFb9e7fUQugwHw6KbRR+l7AF/iy0o3JiIykomTRpwLGdqErNTPw4T9oS4BI1UvdI PRzQ== 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 bt18si3261220ejb.443.2021.03.01.07.19.08; Mon, 01 Mar 2021 07:19:32 -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 S237084AbhCAPSX (ORCPT + 99 others); Mon, 1 Mar 2021 10:18:23 -0500 Received: from mail.kernel.org ([198.145.29.99]:40900 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237139AbhCAPSB (ORCPT ); Mon, 1 Mar 2021 10:18:01 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id C48DE64E01 for ; Mon, 1 Mar 2021 15:17:13 +0000 (UTC) Subject: [PATCH v1 19/42] SUNRPC: Fix xdr_get_next_encode_buffer() page boundary handling From: Chuck Lever To: linux-nfs@vger.kernel.org Date: Mon, 01 Mar 2021 10:17:13 -0500 Message-ID: <161461183307.8508.17196295994390119297.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 The description of commit 2825a7f90753 ("nfsd4: allow encoding across page boundaries") states: > Also we can't handle a new operation starting close to the end of > a page. But does not detail why this is the case. Subtracting the scratch buffer's "shift" value from the remaining stream space seems to make reserving space close to the end of the buf->pages array reliable. This change is needed to make entry encoding with struct xdr_stream, introduced in a subsequent patch, work correctly when it approaches the end of the dirlist buffer. Fixes: 2825a7f90753 ("nfsd4: allow encoding across page boundaries") Signed-off-by: Chuck Lever --- net/sunrpc/xdr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 3964ff74ee51..043b67229792 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -978,7 +978,7 @@ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr, * shifted this one back: */ xdr->p = (void *)p + frag2bytes; - space_left = xdr->buf->buflen - xdr->buf->len; + space_left = xdr->buf->buflen - xdr->buf->len - frag1bytes; xdr->end = (void *)p + min_t(int, space_left, PAGE_SIZE); xdr->buf->page_len += frag2bytes; xdr->buf->len += nbytes;