Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3091161ybt; Mon, 29 Jun 2020 15:07:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwS4B7hs6kl7B3ASXgzjsekpPMXUrYUrueTreyvigCmG72Nf31itlKBAr3SFg7Rx6LDEjvr X-Received: by 2002:a05:6402:318d:: with SMTP id di13mr8180238edb.172.1593468453859; Mon, 29 Jun 2020 15:07:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593468453; cv=none; d=google.com; s=arc-20160816; b=eO281aKdOoVM/WL4ncT1OCKVDX3maiFfcFG7eNa9JwV1EKpIU2QlgR5Qk/nomTiig/ qB74pRd61o8Bk8qQPFdW7SqGBJAAmw3htT+k7kSqceMNfldKts6IFINp3OR9BrUfy1n3 BfpifKhqLMJuBban+IB6TvCebnABpWcqczLxzBYrrP2sbKMrQTL9RaLCiPHlUdKOEROQ 9vR2NvIDAIocVO20GfbhRiCkPb83VYy9GiKUmN/2yg2LqzW+9j9fw1NU9mNB8gyN4uSu Vub7BYHt6SncDX3mN36ujBRJ3FVDuk0KfSz2BSMP6tGCZMh+8MR+DGN+/S9WChDkv75i 84/w== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=WuwSAtmhSJk2bD1uQKlsgsY8vbHJzxFWJZUu6LaQ4/A=; b=vbc8WeRiNmHYJjIVeG2S2jlvWNlxBZhQhUWkfQUfJ+PnMhXygxZvC1lMTDMcowQnKz NkudP8G2qwSVC7t7D5oBQT9wOqaYVQ7F0Fq+gNeTSZ47FNiopx5nHvu6LAm4Y/DakraJ Z6fT+sDYoEp/HLn5vGFcnhTFX8LWn7PDZjeOUCSPo0pVNYOLF4GBXgqchZMmBeWF7EQw WrVEb21nyZ1TaSIj0Dm/fCszqWJdeGoDQN0CPm7evSsJRLNmY4wE+3qqUY4zPb7oHooZ 65fOB28ul9H1KAZ7y/v4P9B/cGDIC1hmJK0k93IJvyCcR23uZWLsn0nHKGNZkTqemKHC Ogfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=f2PCDCX0; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id mc27si558226ejb.272.2020.06.29.15.07.10; Mon, 29 Jun 2020 15:07:33 -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=@kernel.org header.s=default header.b=f2PCDCX0; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726242AbgF2WGK (ORCPT + 99 others); Mon, 29 Jun 2020 18:06:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:56788 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726144AbgF2SfT (ORCPT ); Mon, 29 Jun 2020 14:35:19 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 946BE247E9; Mon, 29 Jun 2020 15:22:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593444154; bh=INU/ZsiYOml/6d6tHQAqOPfMSK47ZEQKhA8RjgFMxjE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f2PCDCX0jqkYgPZqHTVVShVaHhKofAN3Ma9plK/dvZueItgSBqTIKisl9r0y7R5R2 LKR+Hzr6KqSGD/jSqmsxlirD6DwJVE7WtAkEcNpE4RhBaxD5+9g4BIw37dmF62isQb mGMGgi4sj/Ti3H5MPtjJS6/SfuonA8I+D01FBmos= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Olga Kornievskaia , Olga Kornievskaia , Neil Brown , Anna Schumaker , Greg Kroah-Hartman Subject: [PATCH 5.7 260/265] NFSv4 fix CLOSE not waiting for direct IO compeletion Date: Mon, 29 Jun 2020 11:18:13 -0400 Message-Id: <20200629151818.2493727-261-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200629151818.2493727-1-sashal@kernel.org> References: <20200629151818.2493727-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.7.7-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.7.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.7.7-rc1 X-KernelTest-Deadline: 2020-07-01T15:14+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Olga Kornievskaia commit d03727b248d0dae6199569a8d7b629a681154633 upstream. Figuring out the root case for the REMOVE/CLOSE race and suggesting the solution was done by Neil Brown. Currently what happens is that direct IO calls hold a reference on the open context which is decremented as an asynchronous task in the nfs_direct_complete(). Before reference is decremented, control is returned to the application which is free to close the file. When close is being processed, it decrements its reference on the open_context but since directIO still holds one, it doesn't sent a close on the wire. It returns control to the application which is free to do other operations. For instance, it can delete a file. Direct IO is finally releasing its reference and triggering an asynchronous close. Which races with the REMOVE. On the server, REMOVE can be processed before the CLOSE, failing the REMOVE with EACCES as the file is still opened. Signed-off-by: Olga Kornievskaia Suggested-by: Neil Brown CC: stable@vger.kernel.org Signed-off-by: Anna Schumaker Signed-off-by: Greg Kroah-Hartman --- fs/nfs/direct.c | 13 +++++++++---- fs/nfs/file.c | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index d49b1d1979084..f0c3f0123131e 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -267,8 +267,6 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) { struct inode *inode = dreq->inode; - inode_dio_end(inode); - if (dreq->iocb) { long res = (long) dreq->error; if (dreq->count != 0) { @@ -280,7 +278,10 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) complete(&dreq->completion); + igrab(inode); nfs_direct_req_release(dreq); + inode_dio_end(inode); + iput(inode); } static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) @@ -410,8 +411,10 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, * generic layer handle the completion. */ if (requested_bytes == 0) { - inode_dio_end(inode); + igrab(inode); nfs_direct_req_release(dreq); + inode_dio_end(inode); + iput(inode); return result < 0 ? result : -EIO; } @@ -864,8 +867,10 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, * generic layer handle the completion. */ if (requested_bytes == 0) { - inode_dio_end(inode); + igrab(inode); nfs_direct_req_release(dreq); + inode_dio_end(inode); + iput(inode); return result < 0 ? result : -EIO; } diff --git a/fs/nfs/file.c b/fs/nfs/file.c index f96367a2463e3..ccd6c1637b270 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -83,6 +83,7 @@ nfs_file_release(struct inode *inode, struct file *filp) dprintk("NFS: release(%pD2)\n", filp); nfs_inc_stats(inode, NFSIOS_VFSRELEASE); + inode_dio_wait(inode); nfs_file_clear_open_context(filp); return 0; } -- 2.25.1