From nobody Fri Apr 17 01:43:56 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCA4C36A025; Tue, 24 Feb 2026 09:25:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925129; cv=pass; b=VU9JVtqh/NpqC98hQDDwKkb02QV5Km/RDaBrxShxnAbwCUsvi/7COkdlYdHqAsIFLT/7FKdpOD6QSttiAB9jB15sNv7ONgFweG9745kJmWHaranNxn9GgldETGLjLJi4FwUeXzaM5sAzdvhs2aEmIlNQbgGQHKd6FINOqNnIvxY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925129; c=relaxed/simple; bh=nYee31V4R+ye21Tb469w3CGk1W/ZmOK/8or+xQNTE8U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DlfbVTlVvtUrY50rcN3TuCx1NwSNTZzLGkRr9JQ1pdIPiOUVs2rnDaCfu5Y3lIiHQ/UeWD8nI84zv9KfNLNZNQ0oC4Aps/WIjAqIozlvsUDFmTCpTWB9O7xxB1gzEbL5N8pJ+0SbK9f/jWG4rBrKgHY8oM58sbexGgZTUqkCfoA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty; spf=pass smtp.mailfrom=linux.beauty; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b=oF2TP5yZ; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.beauty Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b="oF2TP5yZ" ARC-Seal: i=1; a=rsa-sha256; t=1771925095; cv=none; d=zohomail.com; s=zohoarc; b=hkEbIFt4DttIgv1CMozsmY98EMfKwCuLpSWdiZdlW4ggDVwTVziNNdp4OKV0W0iH5iOvW1OYsPT7FX+28b44rGIGG2YKIMSMxHPZ/YnHXlWkbO1ocfOM5fxzVzzb1R2DRN8wZqoZcQMl34q5Qv6ZNNZormcMNNaADyrmRIwxE/U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771925095; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=cmlJ31saADhV9cIVXgk18qWI8zfxtzNj8Oj1whESdKg=; b=VHQvhdXUwjjWNBNjlzoFZ6287O1DsmkYRR72xwYPjnxU9CqPK7BzRlag8mvIBaxgquSJCob5bgmF8+11uAwNYERXJiJoYKxmNsjxVDoh6caaRKj1t7aAvjpFxKJFVaK2j91X3Tf/rv3bDibT1cHVP/B9oQrm2jPpHzLTmMcyPts= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=linux.beauty; spf=pass smtp.mailfrom=me@linux.beauty; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1771925095; s=zmail; d=linux.beauty; i=me@linux.beauty; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=cmlJ31saADhV9cIVXgk18qWI8zfxtzNj8Oj1whESdKg=; b=oF2TP5yZH4wa7aDLhycqy8eVRVHofHSb8jZ22zOkEyr3iZ86/Dbe7W6UEwAtY5zx yujTcVbXiQnL1b7nZJOBHtzMcIpuRxtqHM66qhEjTi6AxOpGkzlAjGnb5V0r6Di48AV eUWv2xRYOIAkOiFySob8PIggU6aNspwvqcZTjvkc= Received: by mx.zohomail.com with SMTPS id 1771925093993179.92546983539432; Tue, 24 Feb 2026 01:24:53 -0800 (PST) From: Li Chen To: Theodore Ts'o , Jan Kara , Mark Fasheh , linux-ext4@vger.kernel.org, ocfs2-devel@lists.linux.dev, Jan Kara , linux-kernel@vger.kernel.org Cc: Andreas Dilger , Li Chen Subject: [PATCH v3 1/4] jbd2: add jinode dirty range accessors Date: Tue, 24 Feb 2026 17:24:30 +0800 Message-ID: <20260224092434.202122-2-me@linux.beauty> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260224092434.202122-1-me@linux.beauty> References: <20260224092434.202122-1-me@linux.beauty> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" Provide a helper to fetch jinode dirty ranges in bytes. This lets filesystem callbacks avoid depending on the internal representation, preparing for a later conversion to page units. Suggested-by: Andreas Dilger Signed-off-by: Li Chen Reviewed-by: Jan Kara --- Changes since v2: - New patch: add jbd2_jinode_get_dirty_range() helper. include/linux/jbd2.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index a53a00d36228c..64392baf5f4b4 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -445,6 +445,20 @@ struct jbd2_inode { loff_t i_dirty_end; }; =20 +static inline bool jbd2_jinode_get_dirty_range(const struct jbd2_inode *ji= node, + loff_t *start, loff_t *end) +{ + loff_t start_byte =3D jinode->i_dirty_start; + loff_t end_byte =3D jinode->i_dirty_end; + + if (!end_byte) + return false; + + *start =3D start_byte; + *end =3D end_byte; + return true; +} + struct jbd2_revoke_table_s; =20 /** --=20 2.52.0 From nobody Fri Apr 17 01:43:56 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB23B36A025; Tue, 24 Feb 2026 09:25:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925142; cv=pass; b=TAeJMcagbkl6ncSDzAJYURYC0RYXW9eXNC0LE5TkUXjCIXO3ZS6UNl4NAJm6qUqwgs71XZ671Ry3IFBAlL/D+dCj6QyHHj8PsBGpiwZiCV6WTDzgCY0PP9E1P65A33LyY00yNlQdPbMeAUkBfOzmHbLpuDK/XPznUlsN0CUGHUw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925142; c=relaxed/simple; bh=CQW0igxcf9n9v2dCJkH8vis1p2lZETpilQkNiluJmik=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BHj6jnwRw/ztTD1No+a6ztfIKbQkQToeywwEhbglrZjkhY9+BF4aS2dfDW1DoFKgQAaSc+BBXRz02ZiyJnQRklS9uQFtn3TPt/FO9Ump7TDpNLBnsx7vbZetwRjCLisf5x8hI2VrFEng5UEaLxZGnqbqDspAtJGB0lDok1FriTY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty; spf=pass smtp.mailfrom=linux.beauty; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b=lZXyTNJ6; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.beauty Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b="lZXyTNJ6" ARC-Seal: i=1; a=rsa-sha256; t=1771925097; cv=none; d=zohomail.com; s=zohoarc; b=FlQZGYJAuLJvDKHlAfa3WADLm9r3gZPTWMgsQV9KefSbOvEPx/5ZhTVe+dZnm9XM0jZT/UtH6BSsKWuSsGIubwoCjc0cXlzraEJaWZ3sme6q+rClZdkdNuHzPUWVywCGAA21hgJYY5ZKUXFYAKaAzaLCkTwIOw+DXk9hTg9ZwjY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771925097; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=qR07NRDiS2TOSpshOs9qkZFMh9a2Nuyr9nJUWIMzm8Y=; b=acL4ZMQD7CuL22qeXEKdUW6aFu0Km6A577jGU3N6DlNCZkUiGHZIf4ObkZqIaz6K75ffLAiJ/trOB/UmEtEbP11+zg6ZhqvAEEfv+ppDzhAMWwyZuaWSrsMorvux8ZUSik3gyezLeqeljW59ZiFx/xiIAh4IHcuBJN0/twyuMns= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=linux.beauty; spf=pass smtp.mailfrom=me@linux.beauty; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1771925097; s=zmail; d=linux.beauty; i=me@linux.beauty; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=qR07NRDiS2TOSpshOs9qkZFMh9a2Nuyr9nJUWIMzm8Y=; b=lZXyTNJ6ewhXorM82zbKOtgpOv3BlBBoM07Ih6AsjSyyE3u6QWPXiy/TSdV8ffaK /A9Z/332Al1ScRU4ckdiGMDbbkHrjQ7YTl7nGSIM3HIJ5rHaZYpZKznlwGBA0T8RFLL LnLjBAHVqkgz8PN6+XqXn5Ugn8RPInRwtH4SjJAE= Received: by mx.zohomail.com with SMTPS id 1771925096510453.38075459274626; Tue, 24 Feb 2026 01:24:56 -0800 (PST) From: Li Chen To: Theodore Ts'o , Jan Kara , Mark Fasheh , linux-ext4@vger.kernel.org, ocfs2-devel@lists.linux.dev, Andreas Dilger , linux-kernel@vger.kernel.org Cc: Li Chen Subject: [PATCH v3 2/4] ext4: use jbd2 jinode dirty range accessor Date: Tue, 24 Feb 2026 17:24:31 +0800 Message-ID: <20260224092434.202122-3-me@linux.beauty> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260224092434.202122-1-me@linux.beauty> References: <20260224092434.202122-1-me@linux.beauty> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" ext4 journal commit callbacks access jbd2_inode dirty range fields without holding journal->j_list_lock. Use jbd2_jinode_get_dirty_range() to get the range in bytes, and read i_transaction with READ_ONCE() in the redirty check. Suggested-by: Jan Kara Reviewed-by: Jan Kara Signed-off-by: Li Chen --- Changes since v2: - Use jbd2_jinode_get_dirty_range() instead of direct i_dirty_* reads. - Drop per-caller page->byte conversion (now handled by the accessor). fs/ext4/inode.c | 10 ++++++++-- fs/ext4/super.c | 16 +++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index da96db5f23450..f87d35bda9276 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3031,17 +3031,23 @@ static int ext4_writepages(struct address_space *ma= pping, =20 int ext4_normal_submit_inode_data_buffers(struct jbd2_inode *jinode) { + loff_t range_start, range_end; struct writeback_control wbc =3D { .sync_mode =3D WB_SYNC_ALL, .nr_to_write =3D LONG_MAX, - .range_start =3D jinode->i_dirty_start, - .range_end =3D jinode->i_dirty_end, }; struct mpage_da_data mpd =3D { .inode =3D jinode->i_vfs_inode, .wbc =3D &wbc, .can_map =3D 0, }; + + if (!jbd2_jinode_get_dirty_range(jinode, &range_start, &range_end)) + return 0; + + wbc.range_start =3D range_start; + wbc.range_end =3D range_end; + return ext4_do_writepages(&mpd); } =20 diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 69eb63dde9839..685951cd58394 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -521,6 +521,7 @@ static bool ext4_journalled_writepage_needs_redirty(str= uct jbd2_inode *jinode, { struct buffer_head *bh, *head; struct journal_head *jh; + transaction_t *trans =3D READ_ONCE(jinode->i_transaction); =20 bh =3D head =3D folio_buffers(folio); do { @@ -539,7 +540,7 @@ static bool ext4_journalled_writepage_needs_redirty(str= uct jbd2_inode *jinode, */ jh =3D bh2jh(bh); if (buffer_dirty(bh) || - (jh && (jh->b_transaction !=3D jinode->i_transaction || + (jh && (jh->b_transaction !=3D trans || jh->b_next_transaction))) return true; } while ((bh =3D bh->b_this_page) !=3D head); @@ -550,15 +551,20 @@ static bool ext4_journalled_writepage_needs_redirty(s= truct jbd2_inode *jinode, static int ext4_journalled_submit_inode_data_buffers(struct jbd2_inode *ji= node) { struct address_space *mapping =3D jinode->i_vfs_inode->i_mapping; + loff_t range_start, range_end; struct writeback_control wbc =3D { - .sync_mode =3D WB_SYNC_ALL, + .sync_mode =3D WB_SYNC_ALL, .nr_to_write =3D LONG_MAX, - .range_start =3D jinode->i_dirty_start, - .range_end =3D jinode->i_dirty_end, - }; + }; struct folio *folio =3D NULL; int error; =20 + if (!jbd2_jinode_get_dirty_range(jinode, &range_start, &range_end)) + return 0; + + wbc.range_start =3D range_start; + wbc.range_end =3D range_end; + /* * writeback_iter() already checks for dirty pages and calls * folio_clear_dirty_for_io(), which we want to write protect the --=20 2.52.0 From nobody Fri Apr 17 01:43:56 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FCC4369224; Tue, 24 Feb 2026 09:26:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925162; cv=pass; b=TUuybatyCvei38LJTVslt0ZmWaelkP65v3BUP5dgQ+1mKC2tQLVZrKU04oM47G56XB0n9aEiD3yGq/cShIXRpTny3XbSbcbWnlp2M86QpSaDUqXky+/L0IiiJRm2i8Ck+c/fYlpeIptY3kQ2ua0U052ID5ky2u0CMHEQrFaTXdA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925162; c=relaxed/simple; bh=6HnR2vQVyFMxEanvtrB7UYHlNmO1A2TCYspJNnFuYxU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EZhFJBjPYNfMKr5Jb7LwpfI5x7D+M2DsiQFjQ1+Bb8KaAuUP9d7/Dfc5QRZuJOmomb36kChAWeWzeRC2ijdkUkjvAujMlLwHzR7Md6GGQr9+1zde2t2vd+OqGIgmnT1gxEULO5HFRrrFJXFN5nKb91tFNO55ruI8E4EWP/RMF34= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty; spf=pass smtp.mailfrom=linux.beauty; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b=tJOqJMyi; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.beauty Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b="tJOqJMyi" ARC-Seal: i=1; a=rsa-sha256; t=1771925101; cv=none; d=zohomail.com; s=zohoarc; b=gYKI749D5gnkusH9m4h5yE5lm+r0gaD9vups5gCzl+D/0udmui2IRtvOEOc/PeeOS2dddYCrxcQAL5cOjpC8U5Tp+XLW0A9ri/20CoPgHj5cROyoYVlnWUh+BK+wmhbtTn4ayin+OBVoZTHfo8Ufam8eAv7DWiKigyrCk26jFIY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771925101; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=i4ISv/Mq3feuc2xrr0ho5gyou48ed2HrxZS5FR03aSY=; b=Ubp4CqatKC9rnHaHsrLKbacG0G2Mw3/mpIMnBQgaCJLa795/x5Rspmwwg2l3uaofSnGpr2dgNE+IHJiM//p5nFjhPpPi+v4qbZjeclG5a445ENhPXqxi90IPpkI+Q4qbVyGnV12IcaRQDjB6IUUA543s5ARLUIdQcnCfyb+WROE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=linux.beauty; spf=pass smtp.mailfrom=me@linux.beauty; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1771925101; s=zmail; d=linux.beauty; i=me@linux.beauty; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=i4ISv/Mq3feuc2xrr0ho5gyou48ed2HrxZS5FR03aSY=; b=tJOqJMyivEmJw9bor3La9WsQh/aRg3xYNTxDjvxMKhFW75uYx6wdI/qYG6ANr6Fv Tpsc5ioRiFvaKnaQbv0lxhAaqFNkAKq0VQt+HZX/aFCzO8JOP+opvlK5H6+nihAjewA c9dd3k1gG79p3KpeUrXY32YJqKzHfUTC6nNoQk4M= Received: by mx.zohomail.com with SMTPS id 1771925100358315.28790750738244; Tue, 24 Feb 2026 01:25:00 -0800 (PST) From: Li Chen To: Theodore Ts'o , Jan Kara , Mark Fasheh , linux-ext4@vger.kernel.org, ocfs2-devel@lists.linux.dev, Joel Becker , Joseph Qi , linux-kernel@vger.kernel.org Cc: Li Chen Subject: [PATCH v3 3/4] ocfs2: use jbd2 jinode dirty range accessor Date: Tue, 24 Feb 2026 17:24:32 +0800 Message-ID: <20260224092434.202122-4-me@linux.beauty> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260224092434.202122-1-me@linux.beauty> References: <20260224092434.202122-1-me@linux.beauty> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" ocfs2 journal commit callback reads jbd2_inode dirty range fields without holding journal->j_list_lock. Use jbd2_jinode_get_dirty_range() to get the range in bytes. Suggested-by: Jan Kara Signed-off-by: Li Chen Reviewed-by: Jan Kara --- Changes since v2: - Use jbd2_jinode_get_dirty_range() instead of direct i_dirty_* reads. - Drop per-caller page->byte conversion (now handled by the accessor). fs/ocfs2/journal.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index 85239807dec78..68c2f567e6e1b 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c @@ -902,8 +902,13 @@ int ocfs2_journal_alloc(struct ocfs2_super *osb) =20 static int ocfs2_journal_submit_inode_data_buffers(struct jbd2_inode *jino= de) { - return filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping, - jinode->i_dirty_start, jinode->i_dirty_end); + struct address_space *mapping =3D jinode->i_vfs_inode->i_mapping; + loff_t range_start, range_end; + + if (!jbd2_jinode_get_dirty_range(jinode, &range_start, &range_end)) + return 0; + + return filemap_fdatawrite_range(mapping, range_start, range_end); } =20 int ocfs2_journal_init(struct ocfs2_super *osb, int *dirty) --=20 2.52.0 From nobody Fri Apr 17 01:43:56 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A4F336B074; Tue, 24 Feb 2026 09:26:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925172; cv=pass; b=Iil2zglZ/ginItQVc+bgWSlOLm1ClJxBKs+75vssdewK9mdpmOMTBdnN4enyK5tBziue3H27mROwFQHC2UC4Y/oDcABAcgQDMosYSFojZxQKlp8nNmDcwL/nebQnFmmBGX+STM1fY5/Ab02ozNf5ckTfRxo/DK959lIYrL/rVV8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771925172; c=relaxed/simple; bh=SpEOrG8BruIwlAXoDDQ+sHu2HlZvCFDxLKBd8cGlyCA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dnRoOznWDYKHcEKeradDeELYNmVursNI/6LiXX3y16PG15lLtMl3gWpN/MC9AChSdlrjuJIu08P9hSl5O6bvGZfRKo4esJvtDvTgv1mKaJ1UaoCoImScPBoyTjWHglq8IwiiXxdsEfv2TFUcFj3BtPnuAmVLyItkUaS23nyW1Wk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty; spf=pass smtp.mailfrom=linux.beauty; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b=hUUrFNIl; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.beauty Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.beauty Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty header.b="hUUrFNIl" ARC-Seal: i=1; a=rsa-sha256; t=1771925107; cv=none; d=zohomail.com; s=zohoarc; b=iopPRz9hDPZCAnG4PHLVSO4weHW79yL9daTVimG1s3Uqv4D7hLDtyKwHbOVsdM+Wi/okVLwD1vWtbd1iR5cEaE1xOIbr8fPDZXPq4oJ6BANI/e4Ct4TSBfKEU7BdOsAmLNJGDEZOaJnZceIP+FQqolRlv+I30slTWN4trCZd7SQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771925107; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=mq6CvdUqWgJ4gBbMc2n/hmzqs6lN6MzptQ2EZaBiaT0=; b=dYgUA7KgpPK/hEfSakKfQGm6zsf5EuGFUstoMb0gx43BZBDv5yWFgeO6zeBVOQe6DLFBq5WVNdNl8zFhF6iHDP8Jfy5p6M4TXFPva0EWrlHvBsQ3lC6QfNeKclhd1ITwdpdOAUvEVEfUKT2VncdkqETgCW2mXHBuKzSY6ztK4XY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=linux.beauty; spf=pass smtp.mailfrom=me@linux.beauty; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1771925107; s=zmail; d=linux.beauty; i=me@linux.beauty; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=mq6CvdUqWgJ4gBbMc2n/hmzqs6lN6MzptQ2EZaBiaT0=; b=hUUrFNIl5vWVYqys3tBtmj8Mzfhax/QgmZXTsavqo9lIcGHmVyWETEu2cwSgxbkE lNuTRkZUu6mJX9ZNNIMaEKg4fOm9jPM8bxISOu4NlGgKGUSzHC8bqry6JlxfJXy7HKW uULpEVNi4wfwrdsz0Ye104sTrOISKEDIkdCh60VY= Received: by mx.zohomail.com with SMTPS id 1771925105176916.3666791846287; Tue, 24 Feb 2026 01:25:05 -0800 (PST) From: Li Chen To: Theodore Ts'o , Jan Kara , Mark Fasheh , linux-ext4@vger.kernel.org, ocfs2-devel@lists.linux.dev, Jan Kara , linux-kernel@vger.kernel.org Cc: Li Chen Subject: [PATCH v3 4/4] jbd2: store jinode dirty range in PAGE_SIZE units Date: Tue, 24 Feb 2026 17:24:33 +0800 Message-ID: <20260224092434.202122-5-me@linux.beauty> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260224092434.202122-1-me@linux.beauty> References: <20260224092434.202122-1-me@linux.beauty> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" jbd2_inode fields are updated under journal->j_list_lock, but some paths read them without holding the lock (e.g. fast commit helpers and ordered truncate helpers). READ_ONCE() alone is not sufficient for the dirty range fields when they are stored as loff_t because 32-bit platforms can observe torn loads. Store the dirty range in PAGE_SIZE units as pgoff_t instead. Use READ_ONCE() on the read side and WRITE_ONCE() on the write side for the dirty range and i_flags to match the existing lockless access pattern. Suggested-by: Jan Kara Reviewed-by: Jan Kara Signed-off-by: Li Chen --- Changes since v2: - Rename i_dirty_start/end to i_dirty_start_page/end_page. - Use jbd2_jinode_get_dirty_range() for byte conversions in commit paths. fs/jbd2/commit.c | 56 +++++++++++++++++++++++++++++++++---------- fs/jbd2/journal.c | 5 ++-- fs/jbd2/transaction.c | 20 ++++++++++------ include/linux/jbd2.h | 31 ++++++++++++++---------- 4 files changed, 77 insertions(+), 35 deletions(-) diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 7203d2d2624d7..514f204aa1db1 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -180,7 +180,13 @@ static int journal_wait_on_commit_record(journal_t *jo= urnal, /* Send all the data buffers related to an inode */ int jbd2_submit_inode_data(journal_t *journal, struct jbd2_inode *jinode) { - if (!jinode || !(jinode->i_flags & JI_WRITE_DATA)) + unsigned long flags; + + if (!jinode) + return 0; + + flags =3D READ_ONCE(jinode->i_flags); + if (!(flags & JI_WRITE_DATA)) return 0; =20 trace_jbd2_submit_inode_data(jinode->i_vfs_inode); @@ -191,12 +197,30 @@ EXPORT_SYMBOL(jbd2_submit_inode_data); =20 int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode) { - if (!jinode || !(jinode->i_flags & JI_WAIT_DATA) || - !jinode->i_vfs_inode || !jinode->i_vfs_inode->i_mapping) + struct address_space *mapping; + struct inode *inode; + unsigned long flags; + loff_t start_byte, end_byte; + + if (!jinode) + return 0; + + flags =3D READ_ONCE(jinode->i_flags); + if (!(flags & JI_WAIT_DATA)) + return 0; + + inode =3D jinode->i_vfs_inode; + if (!inode) + return 0; + + mapping =3D inode->i_mapping; + if (!mapping) + return 0; + + if (!jbd2_jinode_get_dirty_range(jinode, &start_byte, &end_byte)) return 0; return filemap_fdatawait_range_keep_errors( - jinode->i_vfs_inode->i_mapping, jinode->i_dirty_start, - jinode->i_dirty_end); + mapping, start_byte, end_byte); } EXPORT_SYMBOL(jbd2_wait_inode_data); =20 @@ -218,7 +242,8 @@ static int journal_submit_data_buffers(journal_t *journ= al, list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { if (!(jinode->i_flags & JI_WRITE_DATA)) continue; - jinode->i_flags |=3D JI_COMMIT_RUNNING; + WRITE_ONCE(jinode->i_flags, + jinode->i_flags | JI_COMMIT_RUNNING); spin_unlock(&journal->j_list_lock); /* submit the inode data buffers. */ trace_jbd2_submit_inode_data(jinode->i_vfs_inode); @@ -229,7 +254,8 @@ static int journal_submit_data_buffers(journal_t *journ= al, } spin_lock(&journal->j_list_lock); J_ASSERT(jinode->i_transaction =3D=3D commit_transaction); - jinode->i_flags &=3D ~JI_COMMIT_RUNNING; + WRITE_ONCE(jinode->i_flags, + jinode->i_flags & ~JI_COMMIT_RUNNING); smp_mb(); wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); } @@ -240,10 +266,13 @@ static int journal_submit_data_buffers(journal_t *jou= rnal, int jbd2_journal_finish_inode_data_buffers(struct jbd2_inode *jinode) { struct address_space *mapping =3D jinode->i_vfs_inode->i_mapping; + loff_t start_byte, end_byte; + + if (!jbd2_jinode_get_dirty_range(jinode, &start_byte, &end_byte)) + return 0; =20 return filemap_fdatawait_range_keep_errors(mapping, - jinode->i_dirty_start, - jinode->i_dirty_end); + start_byte, end_byte); } =20 /* @@ -262,7 +291,7 @@ static int journal_finish_inode_data_buffers(journal_t = *journal, list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { if (!(jinode->i_flags & JI_WAIT_DATA)) continue; - jinode->i_flags |=3D JI_COMMIT_RUNNING; + WRITE_ONCE(jinode->i_flags, jinode->i_flags | JI_COMMIT_RUNNING); spin_unlock(&journal->j_list_lock); /* wait for the inode data buffers writeout. */ if (journal->j_finish_inode_data_buffers) { @@ -272,7 +301,7 @@ static int journal_finish_inode_data_buffers(journal_t = *journal, } cond_resched(); spin_lock(&journal->j_list_lock); - jinode->i_flags &=3D ~JI_COMMIT_RUNNING; + WRITE_ONCE(jinode->i_flags, jinode->i_flags & ~JI_COMMIT_RUNNING); smp_mb(); wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); } @@ -288,8 +317,9 @@ static int journal_finish_inode_data_buffers(journal_t = *journal, &jinode->i_transaction->t_inode_list); } else { jinode->i_transaction =3D NULL; - jinode->i_dirty_start =3D 0; - jinode->i_dirty_end =3D 0; + WRITE_ONCE(jinode->i_dirty_start_page, 0); + WRITE_ONCE(jinode->i_dirty_end_page, + JBD2_INODE_DIRTY_RANGE_NONE); } } spin_unlock(&journal->j_list_lock); diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index c973162d5b316..eb26c3088a164 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -3020,8 +3020,8 @@ void jbd2_journal_init_jbd_inode(struct jbd2_inode *j= inode, struct inode *inode) jinode->i_next_transaction =3D NULL; jinode->i_vfs_inode =3D inode; jinode->i_flags =3D 0; - jinode->i_dirty_start =3D 0; - jinode->i_dirty_end =3D 0; + jinode->i_dirty_start_page =3D 0; + jinode->i_dirty_end_page =3D JBD2_INODE_DIRTY_RANGE_NONE; INIT_LIST_HEAD(&jinode->i_list); } =20 @@ -3178,4 +3178,3 @@ MODULE_DESCRIPTION("Generic filesystem journal-writin= g module"); MODULE_LICENSE("GPL"); module_init(journal_init); module_exit(journal_exit); - diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index dca4b5d8aaaa3..f5226b6d47d24 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -2646,6 +2646,7 @@ static int jbd2_journal_file_inode(handle_t *handle, = struct jbd2_inode *jinode, { transaction_t *transaction =3D handle->h_transaction; journal_t *journal; + pgoff_t start_page, end_page; =20 if (is_handle_aborted(handle)) return -EROFS; @@ -2654,15 +2655,20 @@ static int jbd2_journal_file_inode(handle_t *handle= , struct jbd2_inode *jinode, jbd2_debug(4, "Adding inode %lu, tid:%d\n", jinode->i_vfs_inode->i_ino, transaction->t_tid); =20 + start_page =3D (pgoff_t)(start_byte >> PAGE_SHIFT); + end_page =3D (pgoff_t)(end_byte >> PAGE_SHIFT); + spin_lock(&journal->j_list_lock); - jinode->i_flags |=3D flags; + WRITE_ONCE(jinode->i_flags, jinode->i_flags | flags); =20 - if (jinode->i_dirty_end) { - jinode->i_dirty_start =3D min(jinode->i_dirty_start, start_byte); - jinode->i_dirty_end =3D max(jinode->i_dirty_end, end_byte); + if (jinode->i_dirty_end_page !=3D JBD2_INODE_DIRTY_RANGE_NONE) { + WRITE_ONCE(jinode->i_dirty_start_page, + min(jinode->i_dirty_start_page, start_page)); + WRITE_ONCE(jinode->i_dirty_end_page, + max(jinode->i_dirty_end_page, end_page)); } else { - jinode->i_dirty_start =3D start_byte; - jinode->i_dirty_end =3D end_byte; + WRITE_ONCE(jinode->i_dirty_start_page, start_page); + WRITE_ONCE(jinode->i_dirty_end_page, end_page); } =20 /* Is inode already attached where we need it? */ @@ -2739,7 +2745,7 @@ int jbd2_journal_begin_ordered_truncate(journal_t *jo= urnal, int ret =3D 0; =20 /* This is a quick check to avoid locking if not necessary */ - if (!jinode->i_transaction) + if (!READ_ONCE(jinode->i_transaction)) goto out; /* Locks are here just to force reading of recent values, it is * enough that the transaction was not committing before we started diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 64392baf5f4b4..4fffbd13d38d4 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -390,6 +390,8 @@ static inline void jbd_unlock_bh_journal_head(struct bu= ffer_head *bh) /* Wait for outstanding data writes for this inode before commit */ #define JI_WAIT_DATA (1 << __JI_WAIT_DATA) =20 +#define JBD2_INODE_DIRTY_RANGE_NONE ((pgoff_t)-1) + /** * struct jbd2_inode - The jbd_inode type is the structure linking inodes = in * ordered mode present in a transaction so that we can sync them during c= ommit. @@ -429,33 +431,38 @@ struct jbd2_inode { unsigned long i_flags; =20 /** - * @i_dirty_start: + * @i_dirty_start_page: + * + * Dirty range start in PAGE_SIZE units. + * + * The dirty range is empty if @i_dirty_end_page is set to + * %JBD2_INODE_DIRTY_RANGE_NONE. * - * Offset in bytes where the dirty range for this inode starts. * [j_list_lock] */ - loff_t i_dirty_start; + pgoff_t i_dirty_start_page; =20 /** - * @i_dirty_end: + * @i_dirty_end_page: * - * Inclusive offset in bytes where the dirty range for this inode - * ends. [j_list_lock] + * Dirty range end in PAGE_SIZE units (inclusive). + * + * [j_list_lock] */ - loff_t i_dirty_end; + pgoff_t i_dirty_end_page; }; =20 static inline bool jbd2_jinode_get_dirty_range(const struct jbd2_inode *ji= node, loff_t *start, loff_t *end) { - loff_t start_byte =3D jinode->i_dirty_start; - loff_t end_byte =3D jinode->i_dirty_end; + pgoff_t start_page =3D READ_ONCE(jinode->i_dirty_start_page); + pgoff_t end_page =3D READ_ONCE(jinode->i_dirty_end_page); =20 - if (!end_byte) + if (end_page =3D=3D JBD2_INODE_DIRTY_RANGE_NONE) return false; =20 - *start =3D start_byte; - *end =3D end_byte; + *start =3D (loff_t)start_page << PAGE_SHIFT; + *end =3D ((loff_t)end_page << PAGE_SHIFT) + PAGE_SIZE - 1; return true; } =20 --=20 2.52.0