Unverified Commit 188344c8 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christian Brauner
Browse files

fs: factor out a sync_lazytime helper



Centralize how we synchronize a lazytime update into the actual on-disk
timestamp into a single helper.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260108141934.2052404-7-hch@lst.de


Reviewed-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 76147526
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -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
+1 −4
Original line number Diff line number Diff line
@@ -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)) {
+2 −1
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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);
+0 −6
Original line number Diff line number Diff line
@@ -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),