{"id":2198117,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2198117/?format=json","project":{"id":8,"url":"http://patchwork.ozlabs.org/api/1.0/projects/8/?format=json","name":"Linux ext4 filesystem development","link_name":"linux-ext4","list_id":"linux-ext4.vger.kernel.org","list_email":"linux-ext4@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260219114645.778338-3-me@linux.beauty>","date":"2026-02-19T11:46:43","name":"[v2,2/3] ext4: use READ_ONCE for lockless jinode reads","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"21f095af8a086c30d2d05acb26e0e06935573636","submitter":{"id":84264,"url":"http://patchwork.ozlabs.org/api/1.0/people/84264/?format=json","name":"Li Chen","email":"me@linux.beauty"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-ext4/patch/20260219114645.778338-3-me@linux.beauty/mbox/","series":[{"id":492665,"url":"http://patchwork.ozlabs.org/api/1.0/series/492665/?format=json","date":"2026-02-19T11:46:41","name":"jbd2/ext4/ocfs2: lockless jinode dirty range","version":2,"mbox":"http://patchwork.ozlabs.org/series/492665/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2198117/checks/","tags":{},"headers":{"Return-Path":"\n <SRS0=eFYx=AX=vger.kernel.org=linux-ext4+bounces-13745-patchwork-incoming=ozlabs.org@ozlabs.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-ext4@vger.kernel.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","patchwork-incoming@ozlabs.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=linux.beauty header.i=me@linux.beauty\n header.a=rsa-sha256 header.s=zmail header.b=eAFAeZ7n;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=150.107.74.76; helo=mail.ozlabs.org;\n envelope-from=srs0=efyx=ax=vger.kernel.org=linux-ext4+bounces-13745-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)","gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=\"2600:3c0a:e001:db::12fc:5321\"\n arc.chain=\"subspace.kernel.org:zohomail.com\"","gandalf.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty","gandalf.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=linux.beauty header.i=me@linux.beauty\n header.a=rsa-sha256 header.s=zmail header.b=eAFAeZ7n;\n\tdkim-atps=neutral","gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-ext4+bounces-13745-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty\n header.b=\"eAFAeZ7n\"","smtp.subspace.kernel.org;\n arc=pass smtp.client-ip=136.143.188.15","smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=linux.beauty"],"Received":["from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fGs9511ghz1xvg\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 19 Feb 2026 22:48:57 +1100 (AEDT)","from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4fGs950b4Gz4w1v\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 19 Feb 2026 22:48:57 +1100 (AEDT)","by gandalf.ozlabs.org (Postfix)\n\tid 4fGs950Wj0z4w9Z; Thu, 19 Feb 2026 22:48:57 +1100 (AEDT)","from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby gandalf.ozlabs.org (Postfix) with ESMTPS id 4fGs914hrJz4w1v\n\tfor <patchwork-incoming@ozlabs.org>; Thu, 19 Feb 2026 22:48:53 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id DE1E4303389E\n\tfor <patchwork-incoming@ozlabs.org>; Thu, 19 Feb 2026 11:48:23 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 0603F326927;\n\tThu, 19 Feb 2026 11:48:23 +0000 (UTC)","from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com\n [136.143.188.15])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id B4ACA2EFD86;\n\tThu, 19 Feb 2026 11:48:21 +0000 (UTC)","by mx.zohomail.com with SMTPS id 1771501628192513.36154051907;\n\tThu, 19 Feb 2026 03:47:08 -0800 (PST)"],"ARC-Seal":["i=3; a=rsa-sha256; d=ozlabs.org; s=201707; t=1771501737; cv=pass;\n\tb=FKqYAfXd6OQ/6xeR61/CKofWX7q5TxqzchxGDIhe2T5XHD0Uz4fqZF7u96arnReng3nZoZNW4uKGHwLr9cqjcSue4+2NHqoSuQqZ6jnsQu/0ZrbUOzBvkAb97rK50FL6I9O7vFrFi5pzpCPMR5UKrrON0TAtOpqADF/2Q2jdx5E8ZqUHWPWlnm+SQV7jfP5ky11kjxo5Dvuu6h31+nKe+XCJ+jJSq+rf7feHkFoCmReYj8kZa5yT5bBGivzRI6zhej7knKRgdLafQq4GqUnkqLIUZzZd35/YoN9I26+P72uJ0ueDvqewR5vv/8om0/N/Cw1b6SvfRSpEt9e44cTTlg==","i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771501702; cv=pass;\n b=uG2jDayJyHvaZHykKdAHNrMCfHCn4YpBv6hoJyLTjWEqY6jN9le3qq8BuNrNyp+y6xLgyTHoTbg97tsgCyx16I4wHZJdBQX8xdSWZgKUH/DBz2nTBfiPrwnKY6tb5izCFmkwiomQ3WkqpCJYdX1FTQVFxGXqeZKd5gyxJu5/h4Y=","i=1; a=rsa-sha256; t=1771501631; cv=none;\n\td=zohomail.com; s=zohoarc;\n\tb=BLLjINCRcCrNf9rP94nXr8sycTIoyTwYEn0NWtyoa0fxMWFlddOCcgnB5si2ZTgfhQQSl7it20roIu691iqDwVQQ/GuSbj8uzCDnV+gs6+T8KKYLdVp+/yor4EetvQgvS+0MaIzVBo8aCuy9C5JzpBtURNbtBmYJIB+zj9kI2Rc="],"ARC-Message-Signature":["i=3; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1771501737; c=relaxed/relaxed;\n\tbh=IQX5SyqcG0wh5Bi5VE3B6d+bUgJTb51NNcjjNAFka70=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=gPcJPy1NvSjwm4ONymI/AMersuwHQ5Iw8u5WQykJVkjAitRHreMvMfq3AG+CziWgXwiukb98AUizZrWYXRdPi+9Qv97ZFB6ynHn3FT7TLT5EMPuBRYDcGYrlRj/3ESXPyma3FmKAcYrVbhigfKK85Upeo2qlFdg/b5Qh8vZeUJbkovNvJ5NR4X2WcOzDNDVa1D+829tu+qfJruWfQ3KbXuLEPsPzeFmsRJsd2juWtId5HPZTlv6vtY2+kv/nF7AJUp9dI7b3ZQFWCmki0wVzeY11ZNzVO/W/6vxRIKKzbbbCGods6N1WGcoGmpg3WMoiwfSRa+TythzKZyzU2IcGIg==","i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771501702; c=relaxed/simple;\n\tbh=Ole/adKa/E4g2kQnOjK+SLIVG2KZQBU0gCHp48N2DBc=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=M/RKOqKFBoMAHaUkBb1svSHsedUTGhLoW74EoX/TanDi1tr9j7XXs50Bs7gs7OA9m2de6uhv3zHSjZjAQsee4wgcAJKp74lPA8sbil3JEQqq4KGSevHLi27sMVekUdTbx/WtBAsLv+hFtPfHMu6055OY/Tjlw0d29kqEngrLvow=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;\n s=zohoarc;\n\tt=1771501631;\n 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;\n\tbh=IQX5SyqcG0wh5Bi5VE3B6d+bUgJTb51NNcjjNAFka70=;\n\tb=Vq7kO7NhT5Z1XnDag9UVctdnIIQ6wCaDxQbCqUqpWSfWw4H6wo8+hCXIFaHMj0j9ZX6el8yql3+0yBkSk82j82Cc/UWZCStPhui50HLmKszP6xztPkgsilXaQH0EscCdkal+6r4i4UBkOZDw268AIEI4T/ltasCJf1SFuxnH6IQ="],"ARC-Authentication-Results":["i=3; gandalf.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty;\n dkim=pass (1024-bit key;\n unprotected) header.d=linux.beauty header.i=me@linux.beauty\n header.a=rsa-sha256 header.s=zmail header.b=eAFAeZ7n; dkim-atps=neutral;\n spf=pass (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-ext4+bounces-13745-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org","i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty;\n spf=pass smtp.mailfrom=linux.beauty;\n dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty\n header.b=eAFAeZ7n; arc=pass smtp.client-ip=136.143.188.15","i=1; mx.zohomail.com;\n\tdkim=pass  header.i=linux.beauty;\n\tspf=pass  smtp.mailfrom=me@linux.beauty;\n\tdmarc=pass header.from=<me@linux.beauty>"],"DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1771501631;\n\ts=zmail; d=linux.beauty; i=me@linux.beauty;\n\th=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;\n\tbh=IQX5SyqcG0wh5Bi5VE3B6d+bUgJTb51NNcjjNAFka70=;\n\tb=eAFAeZ7n7qruS6FoC6n5Ua4W/5U5cfFQCVEo6vMjnjTjsXGlua06lIkPQFyTPAWM\n\tPw92xUJig0NdVI2mZUhBSXd97sijZCR3k3cyfaR2OINFQCXQWhDkKO2EhC+AqBAxf8e\n\tS4qjUXQM81PepLLG7jP1FI3/QpT6vOqf9b7Q3S9w=","From":"Li Chen <me@linux.beauty>","To":"Theodore Ts'o <tytso@mit.edu>,\n\tJan Kara <jack@suse.cz>,\n\tMark Fasheh <mark@fasheh.com>,\n\tlinux-ext4@vger.kernel.org,\n\tocfs2-devel@lists.linux.dev,\n\tMatthew Wilcox <willy@infradead.org>,\n\tAndreas Dilger <adilger.kernel@dilger.ca>,\n\tlinux-kernel@vger.kernel.org","Cc":"Li Chen <me@linux.beauty>","Subject":"[PATCH v2 2/3] ext4: use READ_ONCE for lockless jinode reads","Date":"Thu, 19 Feb 2026 19:46:43 +0800","Message-ID":"<20260219114645.778338-3-me@linux.beauty>","X-Mailer":"git-send-email 2.52.0","In-Reply-To":"<20260219114645.778338-1-me@linux.beauty>","References":"<20260219114645.778338-1-me@linux.beauty>","Precedence":"bulk","X-Mailing-List":"linux-ext4@vger.kernel.org","List-Id":"<linux-ext4.vger.kernel.org>","List-Subscribe":"<mailto:linux-ext4+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-ext4+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-ZohoMailClient":"External","X-Spam-Status":"No, score=-1.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,\n\tHEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,\n\tSPF_PASS autolearn=disabled version=4.0.1","X-Spam-Checker-Version":"SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"},"content":"ext4 journal commit callbacks access jbd2_inode fields such as\ni_transaction and i_dirty_start/end without holding journal->j_list_lock.\n\nUse READ_ONCE() for these reads to match the lockless access pattern.\nConvert the dirty range from PAGE_SIZE units back to byte offsets before\npassing it to writeback.\n\nSuggested-by: Jan Kara <jack@suse.cz>\nReviewed-by: Jan Kara <jack@suse.cz>\nSigned-off-by: Li Chen <me@linux.beauty>\n---\nChanges since v1:\n- Convert the jinode dirty range from PAGE_SIZE units (pgoff_t) back to byte\n  offsets before passing it to writeback.\n\n fs/ext4/inode.c | 12 ++++++++++--\n fs/ext4/super.c | 19 ++++++++++++++-----\n 2 files changed, 24 insertions(+), 7 deletions(-)","diff":"diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c\nindex d99296d7315f..5ec60580a2d0 100644\n--- a/fs/ext4/inode.c\n+++ b/fs/ext4/inode.c\n@@ -3033,11 +3033,19 @@ static int ext4_writepages(struct address_space *mapping,\n \n int ext4_normal_submit_inode_data_buffers(struct jbd2_inode *jinode)\n {\n+\tpgoff_t dirty_start = READ_ONCE(jinode->i_dirty_start);\n+\tpgoff_t dirty_end = READ_ONCE(jinode->i_dirty_end);\n+\tloff_t range_start, range_end;\n+\n+\tif (dirty_end == JBD2_INODE_DIRTY_RANGE_NONE)\n+\t\treturn 0;\n+\trange_start = (loff_t)dirty_start << PAGE_SHIFT;\n+\trange_end = ((loff_t)dirty_end << PAGE_SHIFT) + PAGE_SIZE - 1;\n \tstruct writeback_control wbc = {\n \t\t.sync_mode = WB_SYNC_ALL,\n \t\t.nr_to_write = LONG_MAX,\n-\t\t.range_start = jinode->i_dirty_start,\n-\t\t.range_end = jinode->i_dirty_end,\n+\t\t.range_start = range_start,\n+\t\t.range_end = range_end,\n \t};\n \tstruct mpage_da_data mpd = {\n \t\t.inode = jinode->i_vfs_inode,\ndiff --git a/fs/ext4/super.c b/fs/ext4/super.c\nindex 69eb63dde983..27062c8ad60a 100644\n--- a/fs/ext4/super.c\n+++ b/fs/ext4/super.c\n@@ -521,6 +521,7 @@ static bool ext4_journalled_writepage_needs_redirty(struct jbd2_inode *jinode,\n {\n \tstruct buffer_head *bh, *head;\n \tstruct journal_head *jh;\n+\ttransaction_t *trans = READ_ONCE(jinode->i_transaction);\n \n \tbh = head = folio_buffers(folio);\n \tdo {\n@@ -539,7 +540,7 @@ static bool ext4_journalled_writepage_needs_redirty(struct jbd2_inode *jinode,\n \t\t */\n \t\tjh = bh2jh(bh);\n \t\tif (buffer_dirty(bh) ||\n-\t\t    (jh && (jh->b_transaction != jinode->i_transaction ||\n+\t\t    (jh && (jh->b_transaction != trans ||\n \t\t\t    jh->b_next_transaction)))\n \t\t\treturn true;\n \t} while ((bh = bh->b_this_page) != head);\n@@ -550,12 +551,20 @@ static bool ext4_journalled_writepage_needs_redirty(struct jbd2_inode *jinode,\n static int ext4_journalled_submit_inode_data_buffers(struct jbd2_inode *jinode)\n {\n \tstruct address_space *mapping = jinode->i_vfs_inode->i_mapping;\n+\tpgoff_t dirty_start = READ_ONCE(jinode->i_dirty_start);\n+\tpgoff_t dirty_end = READ_ONCE(jinode->i_dirty_end);\n+\tloff_t range_start, range_end;\n+\n+\tif (dirty_end == JBD2_INODE_DIRTY_RANGE_NONE)\n+\t\treturn 0;\n+\trange_start = (loff_t)dirty_start << PAGE_SHIFT;\n+\trange_end = ((loff_t)dirty_end << PAGE_SHIFT) + PAGE_SIZE - 1;\n \tstruct writeback_control wbc = {\n-\t\t.sync_mode =  WB_SYNC_ALL,\n+\t\t.sync_mode = WB_SYNC_ALL,\n \t\t.nr_to_write = LONG_MAX,\n-\t\t.range_start = jinode->i_dirty_start,\n-\t\t.range_end = jinode->i_dirty_end,\n-        };\n+\t\t.range_start = range_start,\n+\t\t.range_end = range_end,\n+\t};\n \tstruct folio *folio = NULL;\n \tint error;\n \n","prefixes":["v2","2/3"]}