Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp557420pxb; Fri, 16 Apr 2021 12:07:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxAZzyyiqdxLiCOnVJPamwnng1QbOQhnzmqXTcPKI8F42vEARqzuphUG5uJLjBwmUBzEtk3 X-Received: by 2002:a17:906:3a94:: with SMTP id y20mr9667274ejd.35.1618600040303; Fri, 16 Apr 2021 12:07:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618600040; cv=none; d=google.com; s=arc-20160816; b=QbDvLZIMjQJHBbTXSz7lMOLlHUDr98is9yJ7j3XLUA23MhQ05TWTHqhVrfJSSt5cBy ehk4YAhwDEI3aX29MBLjzqHRhFkbjlIZ2Q+XxemvnyBNPYUm6hf/L9rXYMM7KoRDKKzm iziicdHVyi+92/xwsAYEQLU6TkTQyaetL3MWQkOUKJTqtvk1j5VDY7X8XmAHyIJxNzq2 vK3StHkOxkXGKZS5S50dil5SDoNgbQb13BDKXjRxWzE6TEkupzfrXEyeYLud637wIjIa YYrQLY0zvz1/yYHACUpVmB7NVS1iUXlMGmg/TsJxh9ctH5RvBI6LcSdD2MUt27NvWaqy Hc7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from:dkim-filter; bh=sAg87SFCOEoyxDHP0XJpq/+Z/Iu5iJ5U5Z4XD16Xg4U=; b=CqjVBk5+Pdl2os1kT7OZptIlW8XUwcSMp6qpRDZeH0B13FtmT/rkbntpLctjGSIW2N a9Qgl6Bw2h7HvLweBnF25b/6WvfxgEwxJytz9MnTM9lvFYkgG8c9Jfp3MfxHm7pL+9LM Cgxp68a3uKd36NwdtpiLoAl3sVckYfgAZREoLW15kIJWN8l0LbNg9lX/4nae8HbcNfHx K4+CR9ub525ckHJPoadsZ60As4/rXTrzutnohSE+ElyD2QSWkZDhXHorAXc2ocwcmuGv GAwQnieM2UlI1fsrtE60JDOln5AM5KEvZJKYs+Wjwun/kBCOfefWzNrX6Foo1QnyWm5/ L0RA== 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=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z13si5956951edc.6.2021.04.16.12.06.39; Fri, 16 Apr 2021 12:07:20 -0700 (PDT) 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236045AbhDPSAs (ORCPT + 99 others); Fri, 16 Apr 2021 14:00:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34556 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235905AbhDPSAr (ORCPT ); Fri, 16 Apr 2021 14:00:47 -0400 Received: from fieldses.org (fieldses.org [IPv6:2600:3c00:e000:2f7::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 968C2C061574 for ; Fri, 16 Apr 2021 11:00:21 -0700 (PDT) Received: by fieldses.org (Postfix, from userid 2815) id E05F16D1C; Fri, 16 Apr 2021 14:00:19 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.11.0 fieldses.org E05F16D1C From: "J. Bruce Fields" To: Chuck Lever Cc: linux-nfs@vger.kernel.org, "J. Bruce Fields" Subject: [PATCH 1/5] nfsd: ensure new clients break delegations Date: Fri, 16 Apr 2021 14:00:14 -0400 Message-Id: <1618596018-9899-1-git-send-email-bfields@redhat.com> X-Mailer: git-send-email 1.8.3.1 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: "J. Bruce Fields" If nfsd already has an open file that it plans to use for IO from another, it may not need to do another vfs open, but it still may need to break any delegations in case the existing opens are for another client. Symptoms are that we may incorrectly fail to break a delegation on a write open from a different client, when the delegation-holding client already has a write open. Fixes: 28df3d1539de ("nfsd: clients don't need to break their own delegations") Signed-off-by: J. Bruce Fields --- fs/nfsd/nfs4state.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 97447a64bad0..886e50ed07c2 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -4869,6 +4869,11 @@ static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file *fp, if (nf) nfsd_file_put(nf); + status = nfserrno(nfsd_open_break_lease(cur_fh->fh_dentry->d_inode, + access)); + if (status) + goto out_put_access; + status = nfsd4_truncate(rqstp, cur_fh, open); if (status) goto out_put_access; @@ -6849,11 +6854,20 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, static __be32 nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock) { struct nfsd_file *nf; - __be32 err = nfsd_file_acquire(rqstp, fhp, NFSD_MAY_READ, &nf); - if (!err) { - err = nfserrno(vfs_test_lock(nf->nf_file, lock)); - nfsd_file_put(nf); - } + __be32 err; + + err = nfsd_file_acquire(rqstp, fhp, NFSD_MAY_READ, &nf); + if (err) + return err; + fh_lock(fhp); /* to block new leases till after test_lock: */ + err = nfserrno(nfsd_open_break_lease(fhp->fh_dentry->d_inode, + NFSD_MAY_READ)); + if (err) + goto out; + err = nfserrno(vfs_test_lock(nf->nf_file, lock)); +out: + fh_unlock(fhp); + nfsd_file_put(nf); return err; } -- 2.30.2