From patchwork Thu Mar 27 05:56:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chao Yu X-Patchwork-Id: 14030791 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 6D4B0C3600E for ; Thu, 27 Mar 2025 05:56:42 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1txgEK-0002nl-Mj; Thu, 27 Mar 2025 05:56:41 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1txgED-0002n0-Tw for linux-f2fs-devel@lists.sourceforge.net; Thu, 27 Mar 2025 05:56:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:Message-ID: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=/0lbaetavFnaOCKAUCL6Rio3ol3dj0IjMqz9QPnGPaM=; b=jYQxdzZeNNJJGx1qeRsjMwT12b o2AyVFIvP0bvD99uCfnBDXURtV1h+DV2p4putLjr8l9qdj4Swq3rCxbYHtFQGj0sr6XhXwwlcTT+V kWOiMS07/j4RoEJx/hWMMeqoOQ9PJViGdIh/56qciVFOaGyCkJTJx8I3Qa9uRbxE9MYk=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:Message-ID:Date:Subject:Cc:To:From :Sender:Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post: List-Owner:List-Archive; bh=/0lbaetavFnaOCKAUCL6Rio3ol3dj0IjMqz9QPnGPaM=; b=i XTEZpiYaQUtXY8cds1q87RoyInblTQ+EPjZTYGy0rYj/E+aa4wTVI63FkidvwT0gOvMvU3OxIHlbp ruHFEO3aUyJ81n8V+xb182nnQSZNMvCU5n5YXgGdQUzj8k1QDNd3YxJJ+mvXOqgDlCRfZEt7yTPgq iPal5bLtgSrW0Etk=; Received: from dfw.source.kernel.org ([139.178.84.217]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1txgE4-0005cn-2R for linux-f2fs-devel@lists.sourceforge.net; Thu, 27 Mar 2025 05:56:34 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id A533C5C5419; Thu, 27 Mar 2025 05:53:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D5E22C4CEDD; Thu, 27 Mar 2025 05:56:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743054973; bh=kzVQuhM8HNq6HB+zH3zhK1FJCA9jLeLqGr1XbqTZzNY=; h=From:To:Cc:Subject:Date:From; b=q9/Qhrtd5LMnHY5gfIkFUKfLNOhMbXh0GQ4fIRWEhDExdG7ZKvbuLTTpjp8/4NVJ6 r6KgNugT1d9vVnReIma6LDZ9htDkBbgCAckc2q6LeC9pdpyFwlKl8jGZXt+bJjYjUY ZKjZSGB3zGGGXKtzT5nTRkpuiBuSRJxwqJlYmBBYAFLtBLiPKvU16EAipHNo10dHYy Jx2UlusCYOGEneJApbRT8sh9kRtGuEG/ESR34fr796I/67b98DhbMkoJ8KPGE8KJTL ZRdANEKbpvp7sTBnV56xU+PEXI5YuYS/4b1N99m8Vp5pF4tRM2UPb9Vr0C+yJYGLKq 2FyDaHQkv/I8w== To: jaegeuk@kernel.org Date: Thu, 27 Mar 2025 13:56:06 +0800 Message-ID: <20250327055607.3829954-1-chao@kernel.org> X-Mailer: git-send-email 2.49.0.395.g12beb8f557-goog MIME-Version: 1.0 X-Headers-End: 1txgE4-0005cn-2R Subject: [f2fs-dev] [PATCH] f2fs: fix to set atomic write status more clear 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: , X-Patchwork-Original-From: Chao Yu via Linux-f2fs-devel From: Chao Yu Reply-To: Chao Yu Cc: Zhiguo Niu , Daeho Jeong , linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net 1. After we start atomic write in a database file, before committing all data, we'd better not set inode w/ vfs dirty status to avoid redundant updates, instead, we only set inode w/ atomic dirty status. 2. After we commit all data, before committing metadata, we need to clear atomic dirty status, and set vfs dirty status to allow vfs flush dirty inode. Cc: Daeho Jeong Reported-by: Zhiguo Niu Signed-off-by: Chao Yu Reviewed-by: Daeho Jeong Reviewed-by: Zhiguo Niu --- fs/f2fs/inode.c | 4 +++- fs/f2fs/segment.c | 6 ++++++ fs/f2fs/super.c | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 5c8634eaef7b..f5991e8751b9 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -34,7 +34,9 @@ void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync) if (f2fs_inode_dirtied(inode, sync)) return; - if (f2fs_is_atomic_file(inode)) + /* only atomic file w/ FI_ATOMIC_COMMITTED can be set vfs dirty */ + if (f2fs_is_atomic_file(inode) && + !is_inode_flag_set(inode, FI_ATOMIC_COMMITTED)) return; mark_inode_dirty_sync(inode); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index dc360b4b0569..7c113b446f63 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -376,7 +376,13 @@ static int __f2fs_commit_atomic_write(struct inode *inode) } else { sbi->committed_atomic_block += fi->atomic_write_cnt; set_inode_flag(inode, FI_ATOMIC_COMMITTED); + + /* + * inode may has no FI_ATOMIC_DIRTIED flag due to no write + * before commit. + */ if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) { + /* clear atomic dirty status and set vfs dirty status */ clear_inode_flag(inode, FI_ATOMIC_DIRTIED); f2fs_mark_inode_dirty_sync(inode, true); } diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 9a42a1323f42..a5cc9f6ee16a 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1532,7 +1532,9 @@ int f2fs_inode_dirtied(struct inode *inode, bool sync) } spin_unlock(&sbi->inode_lock[DIRTY_META]); - if (!ret && f2fs_is_atomic_file(inode)) + /* if atomic write is not committed, set inode w/ atomic dirty */ + if (!ret && f2fs_is_atomic_file(inode) && + !is_inode_flag_set(inode, FI_ATOMIC_COMMITTED)) set_inode_flag(inode, FI_ATOMIC_DIRTIED); return ret;