Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp262869pxj; Tue, 18 May 2021 02:49:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyx8MJNT2biTKke6yISV9H54oJp9yS91jYPQEcrKAacrNsQvLin50vjsibshC3FFvqHQ/za X-Received: by 2002:a05:6402:14c2:: with SMTP id f2mr6018601edx.69.1621331375624; Tue, 18 May 2021 02:49:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621331375; cv=none; d=google.com; s=arc-20160816; b=P2lAY1+gAASbyveedALdx+Eo8rU3dVPBNdWsW7YRLknRWW+ESvEQ7IGkBonubm4kBw jIMiH6l4Wop3xSO47pAyJb0hQrNmDrrG5er6eqUT9vmz/WgyeSj9sS2qpy4Ba060A9bm 3wvM46Lce4EyWAOClUQrGwf9HXJ+j57rin9wH8US6Bj3SLoXm9N/gkZOKfnmYFLzM8nm KOf9yCKUPboDWapTD90RKi4h5gXc6N5Mw5WI0ob5ZTDyrd/Bcp5yrpeTwIT5oRVyy5qf MPzW8sxpW5jxls56SMKA1tPQzT30lq2cDStGxYNbgRyYRXYtobm1BargjqyTd5IqFun+ u8Sg== 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:subject:cc:to :from:dkim-signature; bh=h7u+StJ3u6qZVhcUVmt9yFj1kqBuStrdsxEDqniDG0o=; b=zIm5R/en0J+aQ96nQUySZMGr5hW5hVuPiQtUVMMERL+CL7SqRPErddtD2odQAsMDDm GZJFd3lmmAy/uW0kP5CFpWipMbnttSqL0gjf3PAGg8bimpfpydc0ypYDf6eHvltT1/7W 7mHLCipD40K/3/tn2yGeK5vbSYGRjsI/9fcKgMqY/vLyeabUg9oyQZLhu3joCpQ2jFGz 4NmyEaWvdbasH13dwVo41PWZfH1FlupvyakrxngL9H6N7Pcvscbax6FwRXn3wL0p4FVA t7l29rOAt5Ga+TxbnwAA06stoDvWOx+1Q7ClTq/MgeX6tLAY2aMUXV54T+mgfwuv6Hnm m/8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ihpfb6yC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l3si19836212ejd.203.2021.05.18.02.49.11; Tue, 18 May 2021 02:49:35 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ihpfb6yC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243244AbhEQPJ2 (ORCPT + 99 others); Mon, 17 May 2021 11:09:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:58730 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242555AbhEQO7z (ORCPT ); Mon, 17 May 2021 10:59:55 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3706561076; Mon, 17 May 2021 14:26:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621261596; bh=EAJYEYU5VuRvy/fFHAdA7Z4lndIPPzrD4C8VIWd7y0g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ihpfb6yC3R4u76y3+xU100FbjaS1hX8wqFu2YRWCEEKSb2QW5E2tM+oT5rpkHCzJ7 IynuA9OPxS3tKdFyKLIOeyvRVYzSunRwM2vt9oLiSe0jH3MVHwP6eSrYT5LjwYEd1W vis9fiNL7RlEvRserNVIrlUWq1IvF0SM0zFmh+dY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Sasha Levin Subject: [PATCH 5.11 133/329] NFS: Fix handling of cookie verifier in uncached_readdir() Date: Mon, 17 May 2021 16:00:44 +0200 Message-Id: <20210517140306.614219788@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210517140302.043055203@linuxfoundation.org> References: <20210517140302.043055203@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust [ Upstream commit 13884ff2bef01df37c450c6dd09122f92333dccc ] If we're doing uncached readdir(), then the readdir cookie could be different from the one cached in the nfs_inode. We should therefore ensure that we save that one in the struct nfs_open_dir_context. Fixes: 35df59d3ef69 ("NFS: Reduce number of RPC calls when doing uncached readdir") Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/dir.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index c3618b6abfc0..ca1dddc81436 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -975,10 +975,10 @@ static int readdir_search_pagecache(struct nfs_readdir_descriptor *desc) /* * Once we've found the start of the dirent within a page: fill 'er up... */ -static void nfs_do_filldir(struct nfs_readdir_descriptor *desc) +static void nfs_do_filldir(struct nfs_readdir_descriptor *desc, + const __be32 *verf) { struct file *file = desc->file; - struct nfs_inode *nfsi = NFS_I(file_inode(file)); struct nfs_cache_array *array; unsigned int i = 0; @@ -992,7 +992,7 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc) desc->eof = true; break; } - memcpy(desc->verf, nfsi->cookieverf, sizeof(desc->verf)); + memcpy(desc->verf, verf, sizeof(desc->verf)); if (i < (array->size-1)) desc->dir_cookie = array->array[i+1].cookie; else @@ -1049,7 +1049,7 @@ static int uncached_readdir(struct nfs_readdir_descriptor *desc) for (i = 0; !desc->eof && i < sz && arrays[i]; i++) { desc->page = arrays[i]; - nfs_do_filldir(desc); + nfs_do_filldir(desc, verf); } desc->page = NULL; @@ -1070,6 +1070,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) { struct dentry *dentry = file_dentry(file); struct inode *inode = d_inode(dentry); + struct nfs_inode *nfsi = NFS_I(inode); struct nfs_open_dir_context *dir_ctx = file->private_data; struct nfs_readdir_descriptor *desc; int res; @@ -1123,7 +1124,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) break; } if (res == -ETOOSMALL && desc->plus) { - clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags); + clear_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags); nfs_zap_caches(inode); desc->page_index = 0; desc->plus = false; @@ -1133,7 +1134,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) if (res < 0) break; - nfs_do_filldir(desc); + nfs_do_filldir(desc, nfsi->cookieverf); nfs_readdir_page_unlock_and_put_cached(desc); } while (!desc->eof); -- 2.30.2