From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 5368030C618; Tue, 6 Jan 2026 07:51:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.133 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767685875; cv=none; b=GF6TCScwgXtzqFYPAlpjaTmGMWKB9dpPuKDefQqiMH4/kXklMZQ7wBF6NIuMFBU/JSZ3v9l/LAyzY8WKftPp55daNJmW1k2BH+5n3gAreBicrtE03RGU/T4nH97Dhk+I8Rmt9CQlbXLIoWXTInvpJROnN3ZQQB4ftgyMri7kLAI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767685875; c=relaxed/simple; bh=xc2e+LeVt9Ov0SRaC/SR03Q1XHFTlWhvnWWrn0lR/9U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YpOf7R/dArbEszFykJYLCw9CMdTDAzR0sEWtGwyeyyWoMluOcfRG8DN+wlvP0nSgp2IH6r988U+vfWs86xJhDOG3N0bSWYWPwJA8eDrJ+DLdHl/21Zn6C/cnNQ61jRK8P8zf5K+VlFYCulq3ZvtcuNjQLEJeajrQZT5j/FXqjys= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=lst.de; spf=none smtp.mailfrom=bombadil.srs.infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=bPiw9kd8; arc=none smtp.client-ip=198.137.202.133 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=lst.de Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bombadil.srs.infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="bPiw9kd8" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=ABo2x3mAVAvAso/iY7a/DVgEeqRDHD04pq/J28EYWNM=; b=bPiw9kd8UWlp9mXDo7RlAK/FyJ 3aIUWRO6bYtBuvImcC5w4ujPFd8gdJvziLm9jlt2MYeVTE+0QqiDmgm2krISE2VXtoObvn9aeH6K1 oURWwCNhMnrGPW+/NHiKR/iFQmhwPBsEOG73UZYpSi6yN/RZPbx1NoL9MZ2N79W0SEPAKXT2q9ZtO K6Z3gImTOd7gd7F96MCJS1MMsIN+KbtEDv/zrDAOpFdVSex7mk3d7wL9nlc1w/8hI4QodB04mNt90 sYS+RAWDxVDf/O31S4k7k2qAHb6GcrjY5tnyomRoObDwLImPhC9bvcZNTAziSwkFYlDdxsqy4060J g6DitnPw==; Received: from [2001:4bb8:2af:87cb:5562:685f:c094:6513] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux)) id 1vd1qP-0000000CYq7-42ue; Tue, 06 Jan 2026 07:51:10 +0000 From: Christoph Hellwig To: Christian Brauner Cc: Al Viro , David Sterba , Jan Kara , Mike Marshall , Martin Brandenburg , Carlos Maiolino , Stefan Roesch , Jeff Layton , OGAWA Hirofumi , Trond Myklebust , Anna Schumaker , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, gfs2@lists.linux.dev, io-uring@vger.kernel.org, devel@lists.orangefs.org, linux-unionfs@vger.kernel.org, linux-mtd@lists.infradead.org, linux-xfs@vger.kernel.org, linux-nfs@vger.kernel.org, Chaitanya Kulkarni Subject: [PATCH 06/11] fs: factor out a sync_lazytime helper Date: Tue, 6 Jan 2026 08:50:00 +0100 Message-ID: <20260106075008.1610195-7-hch@lst.de> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260106075008.1610195-1-hch@lst.de> References: <20260106075008.1610195-1-hch@lst.de> Precedence: bulk X-Mailing-List: io-uring@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Centralize how we synchronize a lazytime update into the actual on-disk timestamp into a single helper. Signed-off-by: Christoph Hellwig Reviewed-by: Jan Kara Reviewed-by: Chaitanya Kulkarni Reviewed-by: Jeff Layton --- fs/fs-writeback.c | 22 +++++++++++++++------- fs/inode.c | 5 +---- fs/internal.h | 3 ++- fs/sync.c | 4 ++-- include/trace/events/writeback.h | 6 ------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 6800886c4d10..3d68b757136c 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1711,6 +1711,16 @@ static void requeue_inode(struct inode *inode, struct bdi_writeback *wb, } } +bool sync_lazytime(struct inode *inode) +{ + if (!(inode_state_read_once(inode) & I_DIRTY_TIME)) + return false; + + trace_writeback_lazytime(inode); + mark_inode_dirty_sync(inode); + return true; +} + /* * Write out an inode and its dirty pages (or some of its dirty pages, depending * on @wbc->nr_to_write), and clear the relevant dirty flags from i_state. @@ -1750,17 +1760,15 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) } /* - * If the inode has dirty timestamps and we need to write them, call - * mark_inode_dirty_sync() to notify the filesystem about it and to - * change I_DIRTY_TIME into I_DIRTY_SYNC. + * For data integrity writeback, or when the dirty interval expired, + * ask the file system to propagata lazy timestamp updates into real + * dirty state. */ if ((inode_state_read_once(inode) & I_DIRTY_TIME) && (wbc->sync_mode == WB_SYNC_ALL || time_after(jiffies, inode->dirtied_time_when + - dirtytime_expire_interval * HZ))) { - trace_writeback_lazytime(inode); - mark_inode_dirty_sync(inode); - } + dirtytime_expire_interval * HZ))) + sync_lazytime(inode); /* * Get and clear the dirty flags from i_state. This needs to be done diff --git a/fs/inode.c b/fs/inode.c index 7d8709b0158c..c08682524a8d 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1979,11 +1979,8 @@ void iput(struct inode *inode) if (atomic_add_unless(&inode->i_count, -1, 1)) return; - if ((inode_state_read_once(inode) & I_DIRTY_TIME) && inode->i_nlink) { - trace_writeback_lazytime_iput(inode); - mark_inode_dirty_sync(inode); + if (inode->i_nlink && sync_lazytime(inode)) goto retry; - } spin_lock(&inode->i_lock); if (unlikely((inode_state_read(inode) & I_DIRTY_TIME) && inode->i_nlink)) { diff --git a/fs/internal.h b/fs/internal.h index ab638d41ab81..18a062c1b5b0 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -214,7 +214,8 @@ bool in_group_or_capable(struct mnt_idmap *idmap, /* * fs-writeback.c */ -extern long get_nr_dirty_inodes(void); +long get_nr_dirty_inodes(void); +bool sync_lazytime(struct inode *inode); /* * dcache.c diff --git a/fs/sync.c b/fs/sync.c index 431fc5f5be06..4283af7119d1 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -183,8 +183,8 @@ int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) if (!file->f_op->fsync) return -EINVAL; - if (!datasync && (inode_state_read_once(inode) & I_DIRTY_TIME)) - mark_inode_dirty_sync(inode); + if (!datasync) + sync_lazytime(inode); return file->f_op->fsync(file, start, end, datasync); } EXPORT_SYMBOL(vfs_fsync_range); diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index 311a341e6fe4..7162d03e69a5 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -856,12 +856,6 @@ DEFINE_EVENT(writeback_inode_template, writeback_lazytime, TP_ARGS(inode) ); -DEFINE_EVENT(writeback_inode_template, writeback_lazytime_iput, - TP_PROTO(struct inode *inode), - - TP_ARGS(inode) -); - DEFINE_EVENT(writeback_inode_template, writeback_dirty_inode_enqueue, TP_PROTO(struct inode *inode), -- 2.47.3