Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp54927yba; Wed, 15 May 2019 18:49:48 -0700 (PDT) X-Google-Smtp-Source: APXvYqwP2XJL3zl7Ak+4sjteD4e+URY2/KMoHVCYr9eCI5KSRHGE9n7N+ePxBB4+qmt59nLvYfg1 X-Received: by 2002:aa7:925a:: with SMTP id 26mr49982771pfp.152.1557971388308; Wed, 15 May 2019 18:49:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557971388; cv=none; d=google.com; s=arc-20160816; b=T4VOM0acKb4lBnEhAWl94AmyH5lZzAlSxYWdJFb7oKLLeK+69qo/+Juo2TtHBJg1Df +fOk7H88ROChJdHSicNweI99Oq9h4B2Vy4TOH9npiGh0VoP2el+molOLMoHoeEfGyTyO fkoPHLcLI5hDwFqyk0lGlrGS3SVcSgDO/ZPFdn2SvdHb9huwmZ4tKTTp83l6/XIiHZ1c O4tZLalqRfl3xjaKlJBR40P1MLkU4k6iP/QBgWjS5LvPJyMchbjk/KA4ZwXgqcjnh6E8 lHxNdUcj+AG7tUI/cVm1ihLUDWbOdw+ULd/P5D8ZkyezFMubohld5r1OeabZmPUYiXHb 42Yw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=jzezONR8nRI9Fu/nBQ6aBP2RehN8em62evlcgAiOX1g=; b=BPk8jIpP2sjBpwUxauzC5sR4JoJrNCjYlZANPct69PC0oFWtNZo+56/HHxeZeO91Og 88BJKrLWgSjbGJen5UkWuvQ3AEwmSO22vMyV4ivE+Ikne5pay2OZ2wRlx/TWqiD+YR4X pilfZAnYy5KDE/GriSNqzXdHejmJh1LViSOyrEKYwqEgooco5lxTAcrDSlPitrgO2fXr 9Lx9VqvzdJxqqPmaAnQ7Gq8H5TDHpS2y7H1AAT0+PBBvO+w5JbERJebZ5z2M3HNy1D7B vmp6kaKsXztkPBPqIKlviXjGHRn4SkraARbxeo7+sN7RTI59Pk8RMvEjEPPGI5Rz7hT5 DxcQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id h40si3456902plb.243.2019.05.15.18.49.34; Wed, 15 May 2019 18:49:48 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 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 S1726827AbfEPBqg (ORCPT + 99 others); Wed, 15 May 2019 21:46:36 -0400 Received: from fieldses.org ([173.255.197.46]:33068 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726996AbfEPBUX (ORCPT ); Wed, 15 May 2019 21:20:23 -0400 Received: by fieldses.org (Postfix, from userid 2815) id 4BAF88BF; Wed, 15 May 2019 21:20:23 -0400 (EDT) From: "J. Bruce Fields" To: linux-nfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, "J. Bruce Fields" Subject: [PATCH 1/2] nfsd: allow fh_want_write to be called twice Date: Wed, 15 May 2019 21:20:06 -0400 Message-Id: <1557969619-17157-2-git-send-email-bfields@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1557969619-17157-1-git-send-email-bfields@redhat.com> References: <1557969619-17157-1-git-send-email-bfields@redhat.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: "J. Bruce Fields" A fuzzer recently triggered lockdep warnings about potential sb_writers deadlocks caused by fh_want_write(). Looks like we aren't careful to pair each fh_want_write() with an fh_drop_write(). It's not normally a problem since fh_put() will call fh_drop_write() for us. And was OK for NFSv3 where we'd do one operation that might call fh_want_write(), and then put the filehandle. But an NFSv4 protocol fuzzer can do weird things like call unlink twice in a compound, and then we get into trouble. I'm a little worried about this approach of just leaving everything to fh_put(). But I think there are probably a lot of fh_want_write()/fh_drop_write() imbalances so for now I think we need it to be more forgiving. Signed-off-by: J. Bruce Fields --- fs/nfsd/vfs.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index a7e107309f76..db351247892d 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -120,8 +120,11 @@ void nfsd_put_raparams(struct file *file, struct raparms *ra); static inline int fh_want_write(struct svc_fh *fh) { - int ret = mnt_want_write(fh->fh_export->ex_path.mnt); + int ret; + if (fh->fh_want_write) + return 0; + ret = mnt_want_write(fh->fh_export->ex_path.mnt); if (!ret) fh->fh_want_write = true; return ret; -- 2.21.0