From patchwork Tue Jul 2 12:06:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunmin Jeong X-Patchwork-Id: 13719525 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 531A3C30658 for ; Tue, 2 Jul 2024 12:06:50 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sOcHX-0001Y5-Nf; Tue, 02 Jul 2024 12:06:48 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sOcHW-0001Xy-JT for linux-f2fs-devel@lists.sourceforge.net; Tue, 02 Jul 2024 12:06:47 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=References:Content-Type:Content-Transfer-Encoding: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=n7bVkJMnRU7Mlc/hN2ckbv1SrBU+L0lB2TRSSvXzKuY=; b=fff9mpAtAssMvT9sXXzuxzIENt OYZqQhHscRr7MXIrwtqYmKOCtN/sScmJsIvhZvCxyHm6IihZwzjqchfFG7g4hwJ1ew06AkKdVVzug 4QwK6Jg9/PR6ZGd7a4+Z6uEV8iSsVzpP2YTZwkSBaUmKpcN08GWqHsf37xmiSdvuNItc=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=References:Content-Type:Content-Transfer-Encoding:MIME-Version:Message-Id :Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post: List-Owner:List-Archive; bh=n7bVkJMnRU7Mlc/hN2ckbv1SrBU+L0lB2TRSSvXzKuY=; b=j jEQo4uTSf+nFD1EDOyAqU529Dese2TYLHa7ShWio7LF+G5GM3f0kTGH2A26+1Y37Ucak524G7Tkap kd/9uPBAI75i5QjWhI4rMAN5rLOBTbgauS/HHZaOIf1DMnunQftLKObxrHLc6AxM+NkoAJorJMHpf +HL5VNebHXQiJphY=; Received: from mailout2.samsung.com ([203.254.224.25]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sOcHW-0000Ew-Bq for linux-f2fs-devel@lists.sourceforge.net; Tue, 02 Jul 2024 12:06:46 +0000 Received: from epcas1p1.samsung.com (unknown [182.195.41.45]) by mailout2.samsung.com (KnoxPortal) with ESMTP id 20240702120633epoutp029ba965c2495d36e04436fd7012abcedc~eY-C5sDRZ1707717077epoutp02e for ; Tue, 2 Jul 2024 12:06:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20240702120633epoutp029ba965c2495d36e04436fd7012abcedc~eY-C5sDRZ1707717077epoutp02e DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1719921993; bh=n7bVkJMnRU7Mlc/hN2ckbv1SrBU+L0lB2TRSSvXzKuY=; h=From:To:Cc:Subject:Date:References:From; b=Pr9+hmER4C58fODF0+aSvM+rQVomfU4mTyFAvGE4xIOYjVxPqtHbk4FN1F/r1LJBw JhOEFgPIDguZgSLOuRGzMxHpyuCkb4Oit6h2AO5KOutkzLb5HBolBkOAtKEQFL4vPd VH5NytzbFeomobMsvGh47/5d74EsgJcNB1TY39Ic= Received: from epsnrtp1.localdomain (unknown [182.195.42.162]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20240702120632epcas1p45ade09d4511ab60b9807a75c8bf513fe~eY-ChQ66R0895308953epcas1p45; Tue, 2 Jul 2024 12:06:32 +0000 (GMT) Received: from epsmgec1p1.samsung.com (unknown [182.195.38.242]) by epsnrtp1.localdomain (Postfix) with ESMTP id 4WD1pw3YdJz4x9Ps; Tue, 2 Jul 2024 12:06:32 +0000 (GMT) Received: from epcas1p4.samsung.com ( [182.195.41.48]) by epsmgec1p1.samsung.com (Symantec Messaging Gateway) with SMTP id 8F.75.08602.84DE3866; Tue, 2 Jul 2024 21:06:32 +0900 (KST) Received: from epsmtrp1.samsung.com (unknown [182.195.40.13]) by epcas1p1.samsung.com (KnoxPortal) with ESMTPA id 20240702120631epcas1p1c7044f77b56009471e2dc07d4e135a99~eY-BOnj2a1487914879epcas1p1z; Tue, 2 Jul 2024 12:06:31 +0000 (GMT) Received: from epsmgmc1p1new.samsung.com (unknown [182.195.42.40]) by epsmtrp1.samsung.com (KnoxPortal) with ESMTP id 20240702120631epsmtrp1bd088745aea8d562f54ddaccc39a5a25~eY-BNMEty0771107711epsmtrp1Q; Tue, 2 Jul 2024 12:06:31 +0000 (GMT) X-AuditID: b6c32a33-66ffa7000000219a-67-6683ed48cd33 Received: from epsmtip1.samsung.com ( [182.195.34.30]) by epsmgmc1p1new.samsung.com (Symantec Messaging Gateway) with SMTP id FB.B4.07412.74DE3866; Tue, 2 Jul 2024 21:06:31 +0900 (KST) Received: from localhost.localdomain (unknown [10.253.98.34]) by epsmtip1.samsung.com (KnoxPortal) with ESMTPA id 20240702120631epsmtip1d563847d3def3ca480bec6950d252da6~eY-BA_LQQ0993309933epsmtip1s; Tue, 2 Jul 2024 12:06:31 +0000 (GMT) From: Sunmin Jeong To: jaegeuk@kernel.org, chao@kernel.org Date: Tue, 2 Jul 2024 21:06:24 +0900 Message-Id: <20240702120624.476067-1-s_min.jeong@samsung.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJKsWRmVeSWpSXmKPExsWy7bCmga7H2+Y0g+6rohanp55lspjavpfR 4sn6WcwWlxa5Wyxo/c1iseXfEVaLBRsfMVrM2P+U3YHDY8GmUo9NqzrZPHYv+Mzk0bdlFaPH 501yAaxR2TYZqYkpqUUKqXnJ+SmZeem2St7B8c7xpmYGhrqGlhbmSgp5ibmptkouPgG6bpk5 QJcoKZQl5pQChQISi4uV9O1sivJLS1IVMvKLS2yVUgtScgrMCvSKE3OLS/PS9fJSS6wMDQyM TIEKE7IzFpx4xFJwU6biyeRvzA2MneJdjJwcEgImEte+NbB0MXJxCAnsYJTYumw7M4TziVFi 1etJUM43Roldc3czwbSsOX6TESKxl1Hi5pI+JriWg3cvMIJUsQnoSDycepsFxBYRUJc4NWkp 2BJmgauMEl1v54CNEhawl3h9fhkriM0ioCpxYnMbO4jNK2ArseDzXVaIdfISMy99h4oLSpyc +QRsKDNQvHnrbLD7JASusUt8a5zPDNHgInFu+W0oW1ji1fEt7BC2lMTL/jYou1ji6PwN7BDN DYwSN77ehErYSzS3NrN1MXIAbdCUWL9LH2IZn8S7rz2sIGEJAV6JjjYhiGpVie5HS6BWSUss O3YQaoqHxN+l88HuFBKIlTjXNJ91AqPcLCQvzELywiyEZQsYmVcxiqUWFOempyYbFhjC4zI5 P3cTIzgNahnvYLw8/5/eIUYmDsZDjBIczEoivIG/6tOEeFMSK6tSi/Lji0pzUosPMZoCA3Ui s5Rocj4wEeeVxBuaWBqYmBmZWBhbGpspifOeuVKWKiSQnliSmp2aWpBaBNPHxMEp1cDkpT57 j3fg9WcqKuKrpB/MfOQ55ZjL0/2abxctmH/92YL31+ZdKmv+PW1Tjm5yxBERrw8eV6bN2HDW rrNEr7ZAOTfk0rr7V/mk1/ELGSebCYut31v74XL0+XVKbmb1Ks/CSt07j91Rjg1k/hUz78uX wympR0Qfhr9+cEG1Z0eo96eT2+9E/XU8uHSui/n9BxfYb3Rfrr5pXXdW2GI+//oHJztuJs78 OeVqSnjxp4li069MfLjlwaaw32tvTjy7NE33alap4/K5hofexojWJJoGRRtsND7CIbfn/3rf P73CfRcXd62zM2+50eqtU7X5ZQmTH9cmlqqqWQU3ON/8eHF8uvaqylfiS522620Kkt8X+F+J pTgj0VCLuag4EQCGY6+aDAQAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrILMWRmVeSWpSXmKPExsWy7bCSnK772+Y0g6uLRCxOTz3LZDG1fS+j xZP1s5gtLi1yt1jQ+pvFYsu/I6wWCzY+YrSYsf8puwOHx4JNpR6bVnWyeexe8JnJo2/LKkaP z5vkAlijuGxSUnMyy1KL9O0SuDIWnHjEUnBTpuLJ5G/MDYyd4l2MnBwSAiYSa47fZOxi5OIQ EtjNKDGtu5epi5EDKCEtcexPEYQpLHH4cDFEyQdGiX8TFzKC9LIJ6Eg8nHqbBcQWEdCUONI5 kx2kiFngNqPEp+bZbCAJYQF7idfnl7GC2CwCqhInNrexg9i8ArYSCz7fZYU4Ql5i5qXvUHFB iZMzn4ANZQaKN2+dzTyBkW8WktQsJKkFjEyrGCVTC4pz03OTDQsM81LL9YoTc4tL89L1kvNz NzGCQ1VLYwfjvfn/9A4xMnEwHmKU4GBWEuEN/FWfJsSbklhZlVqUH19UmpNafIhRmoNFSZzX cMbsFCGB9MSS1OzU1ILUIpgsEwenVANT7K/6tU3/+Wd8sz21n+31o4tz5vTFHMvIFbubGaFW +NGOw0lw7pI4/hkewm+vKRtJdRV8knOV9b7HfmlLoWpU4ybTycnFBnvZvb/Feu1S2LV+BcO+ Mr98y0PbbixYUMkf5CD0MO3w7eA5k+Xic3SCdnZbPlFoy5tzqSmuZt7HIz2reov/PMhnWrT2 eNzEF8/q3KX3HwuUeC+2XcAmPvoK89vpd77z3vefXHRz9R+jFexiWk0L333/sGKxSq3I4wls U4SZGu+fFXzsrLLWVcOGyyF53s9/4n4H1NNM//CxWjaVpZWxZB5USjCU1nfIdDlc/NnE6p7/ 78MLFpTNvmUQOytnfvXutErpz9FHlncpsRRnJBpqMRcVJwIAYscT5sQCAAA= X-CMS-MailID: 20240702120631epcas1p1c7044f77b56009471e2dc07d4e135a99 X-Msg-Generator: CA CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20240702120631epcas1p1c7044f77b56009471e2dc07d4e135a99 References: X-Headers-End: 1sOcHW-0000Ew-Bq Subject: [f2fs-dev] [PATCH 1/2] f2fs: use meta inode for GC of atomic file X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: daehojeong@google.com, stable@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, Sungjong Seo Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net The page cache of the atomic file keeps new data pages which will be stored in the COW file. It can also keep old data pages when GCing the atomic file. In this case, new data can be overwritten by old data if a GC thread sets the old data page as dirty after new data page was evicted. Also, since all writes to the atomic file are redirected to COW inodes, GC for the atomic file is not working well as below. f2fs_gc(gc_type=FG_GC) - select A as a victim segment do_garbage_collect - iget atomic file's inode for block B move_data_page f2fs_do_write_data_page - use dn of cow inode - set fio->old_blkaddr from cow inode - seg_freed is 0 since block B is still valid - goto gc_more and A is selected as victim again To solve the problem, let's separate GC writes and updates in the atomic file by using the meta inode for GC writes. Fixes: 3db1de0e582c ("f2fs: change the current atomic write way") Cc: stable@vger.kernel.org #v5.19+ Reviewed-by: Sungjong Seo Reviewed-by: Yeongjin Gil Signed-off-by: Sunmin Jeong --- fs/f2fs/f2fs.h | 5 +++++ fs/f2fs/gc.c | 6 +++--- fs/f2fs/segment.c | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index a000cb024dbe..59c5117e54b1 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -4267,6 +4267,11 @@ static inline bool f2fs_post_read_required(struct inode *inode) f2fs_compressed_file(inode); } +static inline bool f2fs_meta_inode_gc_required(struct inode *inode) +{ + return f2fs_post_read_required(inode) || f2fs_is_atomic_file(inode); +} + /* * compress.c */ diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index a079eebfb080..136b9e8180a3 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -1580,7 +1580,7 @@ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, start_bidx = f2fs_start_bidx_of_node(nofs, inode) + ofs_in_node; - if (f2fs_post_read_required(inode)) { + if (f2fs_meta_inode_gc_required(inode)) { int err = ra_data_block(inode, start_bidx); f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); @@ -1631,7 +1631,7 @@ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, start_bidx = f2fs_start_bidx_of_node(nofs, inode) + ofs_in_node; - if (f2fs_post_read_required(inode)) + if (f2fs_meta_inode_gc_required(inode)) err = move_data_block(inode, start_bidx, gc_type, segno, off); else @@ -1639,7 +1639,7 @@ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, segno, off); if (!err && (gc_type == FG_GC || - f2fs_post_read_required(inode))) + f2fs_meta_inode_gc_required(inode))) submitted++; if (locked) { diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 7e47b8054413..b55fc4bd416a 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3823,7 +3823,7 @@ void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr) struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct page *cpage; - if (!f2fs_post_read_required(inode)) + if (!f2fs_meta_inode_gc_required(inode)) return; if (!__is_valid_data_blkaddr(blkaddr)) @@ -3842,7 +3842,7 @@ void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr, struct f2fs_sb_info *sbi = F2FS_I_SB(inode); block_t i; - if (!f2fs_post_read_required(inode)) + if (!f2fs_meta_inode_gc_required(inode)) return; for (i = 0; i < len; i++) From patchwork Tue Jul 2 12:06:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunmin Jeong X-Patchwork-Id: 13719526 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0CEECC3064D for ; Tue, 2 Jul 2024 12:07:03 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sOcHi-0000MB-ET; Tue, 02 Jul 2024 12:06:59 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sOcHg-0000M3-CY for linux-f2fs-devel@lists.sourceforge.net; Tue, 02 Jul 2024 12:06:57 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=References:Content-Type:Content-Transfer-Encoding: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=OL/DwqCKrUnrUraSKKxPVq6AEKDn2t+gs5jsv1sqlCY=; b=DZchfhokFsHJXiuRYRcqXSM4ji 279qiSY5aMCf7+o+HI7XNhRN9CrQ0TbN3h6C7DI7PqTRYzAikYJXnak4cjlC6NE/kXIuqahLIdf2m kXgUDrNOnB9k2qMCdR/ZoJjmyYZoiO8pYNdq3cXrbYaVd5xo9hHttVFRQBTBpN75BRFY=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=References:Content-Type:Content-Transfer-Encoding:MIME-Version:Message-Id :Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post: List-Owner:List-Archive; bh=OL/DwqCKrUnrUraSKKxPVq6AEKDn2t+gs5jsv1sqlCY=; b=B 4LVBsLiixh211ZHC0sURs/6rqwdbW6wCdCkACiIJoR/Oo9phnCWCyHDRQ/Lh3oq9FrUlNXYZFZwA5 PswTNj6gCiNyTKkDZXx/JPHIgY1ly1KzFJ/JL1Ck839xFhuKPPkc+Ekmixqflea/p5dQC2mC9Snen ISDVTsOIQ/Muu/X4=; Received: from mailout1.samsung.com ([203.254.224.24]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sOcHg-0000FX-Vc for linux-f2fs-devel@lists.sourceforge.net; Tue, 02 Jul 2024 12:06:57 +0000 Received: from epcas1p4.samsung.com (unknown [182.195.41.48]) by mailout1.samsung.com (KnoxPortal) with ESMTP id 20240702120644epoutp01f1221798c1b10a896b9ddc24bf1632a9~eY-NMAJUO0680006800epoutp01E for ; Tue, 2 Jul 2024 12:06:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.samsung.com 20240702120644epoutp01f1221798c1b10a896b9ddc24bf1632a9~eY-NMAJUO0680006800epoutp01E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1719922004; bh=OL/DwqCKrUnrUraSKKxPVq6AEKDn2t+gs5jsv1sqlCY=; h=From:To:Cc:Subject:Date:References:From; b=AMbOman05yUFmnUGTDtJrEJj9y0xCWE0C73HbzC8CPMo74ntDTAMmWet9K3qQeln6 q5PjmnGAFJQqEUhSOysHK/WwoPg3GIrklEiON1cC+lAFJKL4cp/4OqbbcoAXe3OwX8 qauCkMYrRL9ls0fZ6j51VYxXlx/CoOGgL9XioglU= Received: from epsnrtp2.localdomain (unknown [182.195.42.163]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20240702120643epcas1p458a74cfc794668b4a83f5710ac6a0684~eY-M4DnYs1010610106epcas1p41; Tue, 2 Jul 2024 12:06:43 +0000 (GMT) Received: from epsmgec1p1.samsung.com (unknown [182.195.38.248]) by epsnrtp2.localdomain (Postfix) with ESMTP id 4WD1q749MFz4x9Pv; Tue, 2 Jul 2024 12:06:43 +0000 (GMT) Received: from epcas1p2.samsung.com ( [182.195.41.46]) by epsmgec1p1.samsung.com (Symantec Messaging Gateway) with SMTP id 92.84.09847.35DE3866; Tue, 2 Jul 2024 21:06:43 +0900 (KST) Received: from epsmtrp1.samsung.com (unknown [182.195.40.13]) by epcas1p4.samsung.com (KnoxPortal) with ESMTPA id 20240702120643epcas1p4b98b4bfef3b3ef72cf50737697b67eeb~eY-MCo6A50895408954epcas1p45; Tue, 2 Jul 2024 12:06:43 +0000 (GMT) Received: from epsmgms1p2new.samsung.com (unknown [182.195.42.42]) by epsmtrp1.samsung.com (KnoxPortal) with ESMTP id 20240702120643epsmtrp1904a0070dae9b065e0d43b76d7484ab7~eY-MB98Ut0771107711epsmtrp1d; Tue, 2 Jul 2024 12:06:43 +0000 (GMT) X-AuditID: b6c32a36-86dfa70000002677-20-6683ed536b82 Received: from epsmtip1.samsung.com ( [182.195.34.30]) by epsmgms1p2new.samsung.com (Symantec Messaging Gateway) with SMTP id B7.2A.19057.25DE3866; Tue, 2 Jul 2024 21:06:42 +0900 (KST) Received: from localhost.localdomain (unknown [10.253.98.34]) by epsmtip1.samsung.com (KnoxPortal) with ESMTPA id 20240702120642epsmtip19f8e731be4ffaecb6621e611d11ae4f5~eY-Lzr6Wy0968509685epsmtip1I; Tue, 2 Jul 2024 12:06:42 +0000 (GMT) From: Sunmin Jeong To: jaegeuk@kernel.org, chao@kernel.org Date: Tue, 2 Jul 2024 21:06:36 +0900 Message-Id: <20240702120636.476119-1-s_min.jeong@samsung.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrOKsWRmVeSWpSXmKPExsWy7bCmnm7w2+Y0g7WP5CxOTz3LZDG1fS+j xZP1s5gtLi1yt1jQ+pvFYsu/I6wWCzY+YrSYsf8puwOHx4JNpR6bVnWyeexe8JnJo2/LKkaP z5vkAlijsm0yUhNTUosUUvOS81My89JtlbyD453jTc0MDHUNLS3MlRTyEnNTbZVcfAJ03TJz gC5RUihLzCkFCgUkFhcr6dvZFOWXlqQqZOQXl9gqpRak5BSYFegVJ+YWl+al6+WlllgZGhgY mQIVJmRn3O2awFrQqVrx/MRV1gbG63JdjBwcEgImEm+OK3YxcnEICexglPi8ZC4zhPOJUeLB lk/sXYycQM43Ront31hAbJCGPc097BBFexkllq7tZoTrmHRsKSNIFZuAjsTDqbfBOkQE1CVO TVrKAlLELHCVUaLr7RwmkISwgI3E7GcfWEFsFgFViZfn54E18wrYSiyav5AZYp28xMxL39kh 4oISJ2c+ARvKDBRv3job7FYJgWvsEudnLGWDaHCRuDT9MZQtLPHq+BZ2CFtK4mV/G5RdLHF0 /gZ2iOYGRokbX29CJewlmlub2UAhwyygKbF+lz7EMj6Jd197WCEBxivR0SYEUa0q0f1oCdSd 0hLLjh2EmuIh8e7zSSZI0MVKLG1oYJrAKDcLyQuzkLwwC2HZAkbmVYxiqQXFuempxYYFRvCY TM7P3cQIToFaZjsYJ739oHeIkYmD8RCjBAezkghv4K/6NCHelMTKqtSi/Pii0pzU4kOMpsBA ncgsJZqcD0zCeSXxhiaWBiZmRiYWxpbGZkrivGeulKUKCaQnlqRmp6YWpBbB9DFxcEo1MJX4 ObceL/O2N5rz60RlZd1t19fXz7+58VjK4FCV4ksOxYvStyTqmJ0Mc/1yl9y+61GSLG3otfGv 1vodW7vNBSXvCX5Yd5dlfuDCZREuaW2cKW/VRM6dzk3qOpTKamV+JMLi5jvmaI26ghkv9t3Y p/I5oSIqoHe/moH0w6npwpHL4q55LmBPPeIUk19/y0tC9OmliRPeaYivO1kjdsf02PdnN//k KUarzdPcZh1zJUXFQSJuiWaes7dE9uS0izFXvvq2Sdu6OIkzbHt14yd3CbPRrZtaK17mCZ25 P1G32jvUP9x6QfcO2Q5tlhClTbEPsy83CO+uZve4/m6GSqX8josL32nO5PxwcvadRuM9SizF GYmGWsxFxYkAqhcr6AoEAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrALMWRmVeSWpSXmKPExsWy7bCSnG7Q2+Y0g5MzLCxOTz3LZDG1fS+j xZP1s5gtLi1yt1jQ+pvFYsu/I6wWCzY+YrSYsf8puwOHx4JNpR6bVnWyeexe8JnJo2/LKkaP z5vkAlijuGxSUnMyy1KL9O0SuDLudk1gLehUrXh+4iprA+N1uS5GTg4JAROJPc097F2MXBxC ArsZJeZNn8rUxcgBlJCWOPanCMIUljh8uBikXEjgA6PE0f/6IDabgI7Ew6m3WUBsEQFNiSOd M8HGMAvcZpT41DybDSQhLGAjMfvZB1YQm0VAVeLl+XmMIDavgK3EovkLmSFukJeYeek7O0Rc UOLkzCdgQ5mB4s1bZzNPYOSbhSQ1C0lqASPTKkbJ1ILi3PTcYsMCo7zUcr3ixNzi0rx0veT8 3E2M4EDV0trBuGfVB71DjEwcjIcYJTiYlUR4A3/VpwnxpiRWVqUW5ccXleakFh9ilOZgURLn /fa6N0VIID2xJDU7NbUgtQgmy8TBKdXANOvD58m9bb8PsXv07Csuzlp5LuG0ZNFJyQ0fjzJ/ NYlUSpvNocOudftj//IE77zTP9f12/+xk7qYda35nW3AQ56G/7Mut398G2ZzIznE50OZv8QM 9Yvbfr5mk50zQassc/fV1XJTMtmWlPewVllI3Hl+wG0lb7rxjnm9t+auYHq38lD3vorPQrfv cq0pmr2cR1e4U//xxAaDPyfKVq9d9TNYQS8rPHjvnKNOM5sl8r2dnxkpLfwh1HflB/+bpN+3 Xj+UFI/N00kM+tqzoN5KSKmrRN5ubvhc8WP3jZlPehysneaaVCzZs0ks66GMzmTXtjWSF0t8 +c3v5DLkeH8+v/376aR2jdzDsvnXpqvrKbEUZyQaajEXFScCADUokCnDAgAA X-CMS-MailID: 20240702120643epcas1p4b98b4bfef3b3ef72cf50737697b67eeb X-Msg-Generator: CA CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20240702120643epcas1p4b98b4bfef3b3ef72cf50737697b67eeb References: X-Headers-End: 1sOcHg-0000FX-Vc Subject: [f2fs-dev] [PATCH 2/2] f2fs: use meta inode for GC of COW file X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: daehojeong@google.com, stable@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, Sungjong Seo Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net In case of the COW file, new updates and GC writes are already separated to page caches of the atomic file and COW file. As some cases that use the meta inode for GC, there are some race issues between a foreground thread and GC thread. To handle them, we need to take care when to invalidate and wait writeback of GC pages in COW files as the case of using the meta inode. Also, a pointer from the COW inode to the original inode is required to check the state of original pages. For the former, we can solve the problem by using the meta inode for GC of COW files. Then let's get a page from the original inode in move_data_block when GCing the COW file to avoid race condition. Fixes: 3db1de0e582c ("f2fs: change the current atomic write way") Cc: stable@vger.kernel.org #v5.19+ Reviewed-by: Sungjong Seo Reviewed-by: Yeongjin Gil Signed-off-by: Sunmin Jeong --- fs/f2fs/data.c | 2 +- fs/f2fs/f2fs.h | 7 ++++++- fs/f2fs/file.c | 3 +++ fs/f2fs/gc.c | 12 ++++++++++-- fs/f2fs/inline.c | 2 +- fs/f2fs/inode.c | 3 ++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 05158f89ef32..90ff0f6f7f7f 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -2651,7 +2651,7 @@ bool f2fs_should_update_outplace(struct inode *inode, struct f2fs_io_info *fio) return true; if (IS_NOQUOTA(inode)) return true; - if (f2fs_is_atomic_file(inode)) + if (f2fs_used_in_atomic_write(inode)) return true; /* rewrite low ratio compress data w/ OPU mode to avoid fragmentation */ if (f2fs_compressed_file(inode) && diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 59c5117e54b1..4f9fd1c1d024 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -4267,9 +4267,14 @@ static inline bool f2fs_post_read_required(struct inode *inode) f2fs_compressed_file(inode); } +static inline bool f2fs_used_in_atomic_write(struct inode *inode) +{ + return f2fs_is_atomic_file(inode) || f2fs_is_cow_file(inode); +} + static inline bool f2fs_meta_inode_gc_required(struct inode *inode) { - return f2fs_post_read_required(inode) || f2fs_is_atomic_file(inode); + return f2fs_post_read_required(inode) || f2fs_used_in_atomic_write(inode); } /* diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 25b119cf3499..c9f0ba658cfd 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -2116,6 +2116,9 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate) set_inode_flag(fi->cow_inode, FI_COW_FILE); clear_inode_flag(fi->cow_inode, FI_INLINE_DATA); + + /* Set the COW inode's cow_inode to the atomic inode */ + F2FS_I(fi->cow_inode)->cow_inode = inode; } else { /* Reuse the already created COW inode */ ret = f2fs_do_truncate_blocks(fi->cow_inode, 0, true); diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 136b9e8180a3..76854e732b35 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -1188,7 +1188,11 @@ static int ra_data_block(struct inode *inode, pgoff_t index) }; int err; - page = f2fs_grab_cache_page(mapping, index, true); + if (f2fs_is_cow_file(inode)) + page = f2fs_grab_cache_page(F2FS_I(inode)->cow_inode->i_mapping, + index, true); + else + page = f2fs_grab_cache_page(mapping, index, true); if (!page) return -ENOMEM; @@ -1287,7 +1291,11 @@ static int move_data_block(struct inode *inode, block_t bidx, CURSEG_ALL_DATA_ATGC : CURSEG_COLD_DATA; /* do not read out */ - page = f2fs_grab_cache_page(inode->i_mapping, bidx, false); + if (f2fs_is_cow_file(inode)) + page = f2fs_grab_cache_page(F2FS_I(inode)->cow_inode->i_mapping, + bidx, false); + else + page = f2fs_grab_cache_page(inode->i_mapping, bidx, false); if (!page) return -ENOMEM; diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index ac00423f117b..0186ec049db6 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -16,7 +16,7 @@ static bool support_inline_data(struct inode *inode) { - if (f2fs_is_atomic_file(inode)) + if (f2fs_used_in_atomic_write(inode)) return false; if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode)) return false; diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index c26effdce9aa..c810304e2681 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -807,8 +807,9 @@ void f2fs_evict_inode(struct inode *inode) f2fs_abort_atomic_write(inode, true); - if (fi->cow_inode) { + if (fi->cow_inode && f2fs_is_cow_file(fi->cow_inode)) { clear_inode_flag(fi->cow_inode, FI_COW_FILE); + F2FS_I(fi->cow_inode)->cow_inode = NULL; iput(fi->cow_inode); fi->cow_inode = NULL; }