Unverified Commit 5cf06ea5 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christian Brauner
Browse files

fs: add a ->sync_lazytime method



Allow the file system to explicitly implement lazytime syncing instead
of pigging back on generic inode dirtying.  This allows to simplify
the XFS implementation and prepares for non-blocking lazytime timestamp
updates.

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


Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 188344c8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ prototypes::
	int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len);
	void (*update_time)(struct inode *inode, enum fs_update_time type,
			    int flags);
	void (*sync_lazytime)(struct inode *inode);
	int (*atomic_open)(struct inode *, struct dentry *,
				struct file *, unsigned open_flag,
				umode_t create_mode);
@@ -118,6 +119,7 @@ getattr: no
listxattr:	no
fiemap:		no
update_time:	no
sync_lazytime:	no
atomic_open:	shared (exclusive if O_CREAT is set in open flags)
tmpfile:	no
fileattr_get:	no or exclusive
+6 −0
Original line number Diff line number Diff line
@@ -487,6 +487,7 @@ As of kernel 2.6.22, the following members are defined:
		ssize_t (*listxattr) (struct dentry *, char *, size_t);
		void (*update_time)(struct inode *inode, enum fs_update_time type,
				    int flags);
		void (*sync_lazytime)(struct inode *inode);
		int (*atomic_open)(struct inode *, struct dentry *, struct file *,
				   unsigned open_flag, umode_t create_mode);
		int (*tmpfile) (struct mnt_idmap *, struct inode *, struct file *, umode_t);
@@ -643,6 +644,11 @@ otherwise noted.
	an inode.  If this is not defined the VFS will update the inode
	itself and call mark_inode_dirty_sync.

``sync_lazytime``:
	called by the writeback code to update the lazy time stamps to
	regular time stamp updates that get syncing into the on-disk
	inode.

``atomic_open``
	called on the last component of an open.  Using this optional
	method the filesystem can look up, possibly create and open the
+11 −2
Original line number Diff line number Diff line
@@ -1717,6 +1717,9 @@ bool sync_lazytime(struct inode *inode)
		return false;

	trace_writeback_lazytime(inode);
	if (inode->i_op->sync_lazytime)
		inode->i_op->sync_lazytime(inode);
	else
		mark_inode_dirty_sync(inode);
	return true;
}
@@ -2569,6 +2572,8 @@ void __mark_inode_dirty(struct inode *inode, int flags)
	trace_writeback_mark_inode_dirty(inode, flags);

	if (flags & I_DIRTY_INODE) {
		bool was_dirty_time = false;

		/*
		 * Inode timestamp update will piggback on this dirtying.
		 * We tell ->dirty_inode callback that timestamps need to
@@ -2579,6 +2584,7 @@ void __mark_inode_dirty(struct inode *inode, int flags)
			if (inode_state_read(inode) & I_DIRTY_TIME) {
				inode_state_clear(inode, I_DIRTY_TIME);
				flags |= I_DIRTY_TIME;
				was_dirty_time = true;
			}
			spin_unlock(&inode->i_lock);
		}
@@ -2591,9 +2597,12 @@ void __mark_inode_dirty(struct inode *inode, int flags)
		 * for just I_DIRTY_PAGES or I_DIRTY_TIME.
		 */
		trace_writeback_dirty_inode_start(inode, flags);
		if (sb->s_op->dirty_inode)
		if (sb->s_op->dirty_inode) {
			sb->s_op->dirty_inode(inode,
				flags & (I_DIRTY_INODE | I_DIRTY_TIME));
		} else if (was_dirty_time && inode->i_op->sync_lazytime) {
			inode->i_op->sync_lazytime(inode);
		}
		trace_writeback_dirty_inode(inode, flags);

		/* I_DIRTY_INODE supersedes I_DIRTY_TIME. */
+1 −0
Original line number Diff line number Diff line
@@ -2024,6 +2024,7 @@ struct inode_operations {
		      u64 len);
	int (*update_time)(struct inode *inode, enum fs_update_time type,
			   unsigned int flags);
	void (*sync_lazytime)(struct inode *inode);
	int (*atomic_open)(struct inode *, struct dentry *,
			   struct file *, unsigned open_flag,
			   umode_t create_mode);