Received: by 2002:a17:90a:9307:0:0:0:0 with SMTP id p7csp3962642pjo; Tue, 3 Mar 2020 10:09:42 -0800 (PST) X-Google-Smtp-Source: ADFU+vsJaBhSkE9RHvBJqgtXOV4nMKTfcgPSkxJqO8gr3+LTHw3N5AhAgly5/yUjYoTTnpgynBvk X-Received: by 2002:aca:3d7:: with SMTP id 206mr3365432oid.98.1583258981735; Tue, 03 Mar 2020 10:09:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583258981; cv=none; d=google.com; s=arc-20160816; b=hgk71yT347MIdYTErVwcxh9lsrJsc4z91Nh6uZsIOc1hJfAS55ztgy+F45ERAUBPqw 09DKpG1TL9n4lbeqviOgE85S1u+bnmlR9OclCPs0T8sJZsZ1cjUlk8rQunwGnT9iURSt inRCWkvGhQgNFc6Kpj+3IBOHNock8WJ+BdbPNOs27TxbOcA/XL62hyRwd8gOUCX9zjD2 NMLavy4TJGsMAHAlug0iAPYgPvUS15fCsXTVPZUSG+1VSgJmdBMUFUZgFMWkwHhBAdJD EHdXtvCjxfVfaLc3Jt1nUi+EAmI841cnVi7ln3s/LLgRkA+XtWZlIZhNo0hsQCbXC8Qp qyrA== 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:date:subject:cc:to :from:dkim-signature; bh=vFxMXGpbZVk4TZgURK+QtOgEsVa9EHA0PgoAWBJxNQY=; b=05f3gDigO7z9rXc+pCenio4hr/qm0yLuU8RzcPknx2wLCzIBwqqH+zbHW345n2A8ri z4mYvmzAscL2vLDRFCWl049MDd4hGFKyP/oZtM/Ok2+5zbHfQvh4TUZpc1PBFqDOIT5k 9Rg+1zgEfCh2gdNhjuT/wJs3QE+s+2rfyiKNYkvNbW0tSTJprr5i/l/TVDg8ucv24+1m A+qoVNDaI2nYY504ss7IV2gEo5CSgB3xGDABXUEXlpKQ4R0HvrIiLg6PtiaRx6ZC884g X9Grz/UHeJATUvfvEJNFxQ8dt8KD6WFT+mmhxMP0QrzBB1dMN9pp4Wuwok1pVh6MDiQZ hzXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fwhBTcg0; 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 c10si12226546ots.106.2020.03.03.10.09.29; Tue, 03 Mar 2020 10:09:41 -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; dkim=pass header.i=@kernel.org header.s=default header.b=fwhBTcg0; 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 S1733134AbgCCSIk (ORCPT + 99 others); Tue, 3 Mar 2020 13:08:40 -0500 Received: from mail.kernel.org ([198.145.29.99]:33906 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731773AbgCCRxX (ORCPT ); Tue, 3 Mar 2020 12:53:23 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E80D520CC7; Tue, 3 Mar 2020 17:53:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583258002; bh=yHzv1T7w5XflZfTdu0V4RPQ231BUuBe0kt/RYKK4i94=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fwhBTcg03lGtVAGYH3t41KQj796fEvo23pKDAiixtOb6QU4OH4WyM9Do/9KRzCBGG PPPIw6R0OD6xhg3VXxpkgBkLhyhoxYvgRV76+afgGtJ4Ve7HtvH844+snvr0SXembQ VlC1CBJS1eQ6FYgqzntNlP0iczIDcmVZIExew5q8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Benjamin Coddington , Anna Schumaker , Sasha Levin Subject: [PATCH 5.4 033/152] NFSv4: Fix races between open and dentry revalidation Date: Tue, 3 Mar 2020 18:42:11 +0100 Message-Id: <20200303174306.211969204@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200303174302.523080016@linuxfoundation.org> References: <20200303174302.523080016@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust [ Upstream commit cf5b4059ba7197d6cef9c0e024979d178ed8c8ec ] We want to make sure that we revalidate the dentry if and only if we've done an OPEN by filename. In order to avoid races with remote changes to the directory on the server, we want to save the verifier before calling OPEN. The exception is if the server returned a delegation with our OPEN, as we then know that the filename can't have changed on the server. Signed-off-by: Trond Myklebust Reviewed-by: Benjamin Coddington Tested-by: Benjamin Coddington Signed-off-by: Anna Schumaker Signed-off-by: Sasha Levin --- fs/nfs/nfs4file.c | 1 - fs/nfs/nfs4proc.c | 18 ++++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 339663d04bf83..54f1c1f626fc5 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -86,7 +86,6 @@ nfs4_file_open(struct inode *inode, struct file *filp) if (inode != d_inode(dentry)) goto out_drop; - nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); nfs_file_set_open_context(filp, ctx); nfs_fscache_open_file(inode, filp); err = 0; diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f808fb34b1101..6b29703d2fe1e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2962,10 +2962,13 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, struct dentry *dentry; struct nfs4_state *state; fmode_t acc_mode = _nfs4_ctx_to_accessmode(ctx); + struct inode *dir = d_inode(opendata->dir); + unsigned long dir_verifier; unsigned int seq; int ret; seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); + dir_verifier = nfs_save_change_attribute(dir); ret = _nfs4_proc_open(opendata, ctx); if (ret != 0) @@ -2993,8 +2996,19 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, dput(ctx->dentry); ctx->dentry = dentry = alias; } - nfs_set_verifier(dentry, - nfs_save_change_attribute(d_inode(opendata->dir))); + } + + switch(opendata->o_arg.claim) { + default: + break; + case NFS4_OPEN_CLAIM_NULL: + case NFS4_OPEN_CLAIM_DELEGATE_CUR: + case NFS4_OPEN_CLAIM_DELEGATE_PREV: + if (!opendata->rpc_done) + break; + if (opendata->o_res.delegation_type != 0) + dir_verifier = nfs_save_change_attribute(dir); + nfs_set_verifier(dentry, dir_verifier); } /* Parse layoutget results before we check for access */ -- 2.20.1