Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3024070ybt; Mon, 29 Jun 2020 13:11:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy+hhCey6BUqIsRCRqCHY0smRM7AvH9SMQSL+fG40PW6p89Xp4l1TnurhIjaRr/31O1+GDA X-Received: by 2002:a17:906:e91:: with SMTP id p17mr7875975ejf.252.1593461515164; Mon, 29 Jun 2020 13:11:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593461515; cv=none; d=google.com; s=arc-20160816; b=ccFqoTuryu2dxdrPrD9LjpUB+37YkHXrYNQzGcLaN83ah9Vdt2adSfYtIoseGnns5O TtA1PmRRtKiWNhI8pOMzW1YiuDN1q1XXy3UuZzTOGUGkG3jlpYWV7pBzO9G0VkTU7ZuC +AMCpehpGPpqNQ5rvedviHQonBudq/zZlpn4cyPexZAvh/mXjUSwpfvLzuHFybDwKO8A EhD7JMsecOwzoCiiEfXKdQGrQhrgsJiZgIa5LGnD2rIw9KMQZVaq1rmwLO1gZkwO1vEy QJY6VSEtxyK2NHBBXtGKAJbBoq+w5z9NxhCggnhALDrmaKeTFtnwSc/OmKKfERjDDpVe Tb0w== 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=nraQ9AnW+upI/pt/aky1cAnGg7XWL/1q6eMKuKcCfiw=; b=wxzF+QKnSfh/P5+ZueOVA6EKmxOVSMPAoLkS9MNH0GPpf/4n80whRZ13uSlMi6UY+B RgsMM6UHfHAalR/1PJCep/FoX86zUBjhUcvNs0Hc1enMmfiNhxTeKY11TH+A1GG3xwzO pVge8lCc4z7qohvzg6SU1hCZj4q58VVBKLbzecSSwOS9c0V4tKoSJdxRG/9uKMvbN6VS efVzVR5V4kEev7aeV1+aN+LAEj0eEBkrH5rJjh3IL97+cIAJas0jboL40fGUpJYxxR32 jmtWghUGKce+HCinvd7HkzS2oTv0+TDqVWCwKQDmh8OsFHON3khQK3EYXoOF85D2InXj aygg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=aERSNiRr; 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 z7si350263eju.478.2020.06.29.13.11.32; Mon, 29 Jun 2020 13:11:55 -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=aERSNiRr; 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 S2388193AbgF2UIc (ORCPT + 99 others); Mon, 29 Jun 2020 16:08:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:40580 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732936AbgF2TaX (ORCPT ); Mon, 29 Jun 2020 15:30:23 -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 0249E252B8; Mon, 29 Jun 2020 15:37:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593445029; bh=1VTeWcsVLTLh3JRyJqT59Al2BEripmJXz7qP/9lqslI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aERSNiRrzqvIsoMewKULtUuxsus5btXcfPd1WhqTMtTczxac9OGa7WXXLj47WXKlF 63xw9CUrXho3fDtNvevi4irUfta7AKQqcNbwL9kUqbrrauvqk8KC0RNcUKwnrjRdw8 cftkE7mnYPBy3I31HFOevgRwV6M7iPGXIWxcY/cI= 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 4.19 127/131] NFSv4 fix CLOSE not waiting for direct IO compeletion Date: Mon, 29 Jun 2020 11:34:58 -0400 Message-Id: <20200629153502.2494656-128-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200629153502.2494656-1-sashal@kernel.org> References: <20200629153502.2494656-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.131-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-4.19.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 4.19.131-rc1 X-KernelTest-Deadline: 2020-07-01T15:34+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 e5da9d7fb69e9..1e883df26d4aa 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -396,8 +396,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) { @@ -409,7 +407,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) @@ -539,8 +540,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; } @@ -957,8 +960,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 29553fdba8af7..b2257fa209ac4 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -82,6 +82,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