Commit 50e9ceef authored by Jeff Layton's avatar Jeff Layton Committed by Christian Brauner

btrfs: convert to multigrain timestamps

Enable multigrain timestamps, which should ensure that there is an
apparent change to the timestamp whenever it has been written after
being actively observed via getattr.

Beyond enabling the FS_MGTIME flag, this patch eliminates
update_time_for_write, which goes to great pains to avoid in-memory
stores. Just have it overwrite the timestamps unconditionally.
Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Acked-by: default avatarDavid Sterba <dsterba@suse.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Message-Id: <20230807-mgctime-v7-13-d1dec143a704@kernel.org>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 0269b585
...@@ -1106,25 +1106,6 @@ void btrfs_check_nocow_unlock(struct btrfs_inode *inode) ...@@ -1106,25 +1106,6 @@ void btrfs_check_nocow_unlock(struct btrfs_inode *inode)
btrfs_drew_write_unlock(&inode->root->snapshot_lock); btrfs_drew_write_unlock(&inode->root->snapshot_lock);
} }
static void update_time_for_write(struct inode *inode)
{
struct timespec64 now, ctime;
if (IS_NOCMTIME(inode))
return;
now = current_time(inode);
if (!timespec64_equal(&inode->i_mtime, &now))
inode->i_mtime = now;
ctime = inode_get_ctime(inode);
if (!timespec64_equal(&ctime, &now))
inode_set_ctime_to_ts(inode, now);
if (IS_I_VERSION(inode))
inode_inc_iversion(inode);
}
static int btrfs_write_check(struct kiocb *iocb, struct iov_iter *from, static int btrfs_write_check(struct kiocb *iocb, struct iov_iter *from,
size_t count) size_t count)
{ {
...@@ -1156,7 +1137,10 @@ static int btrfs_write_check(struct kiocb *iocb, struct iov_iter *from, ...@@ -1156,7 +1137,10 @@ static int btrfs_write_check(struct kiocb *iocb, struct iov_iter *from,
* need to start yet another transaction to update the inode as we will * need to start yet another transaction to update the inode as we will
* update the inode when we finish writing whatever data we write. * update the inode when we finish writing whatever data we write.
*/ */
update_time_for_write(inode); if (!IS_NOCMTIME(inode)) {
inode->i_mtime = inode_set_ctime_current(inode);
inode_inc_iversion(inode);
}
start_pos = round_down(pos, fs_info->sectorsize); start_pos = round_down(pos, fs_info->sectorsize);
oldsize = i_size_read(inode); oldsize = i_size_read(inode);
......
...@@ -2144,7 +2144,7 @@ static struct file_system_type btrfs_fs_type = { ...@@ -2144,7 +2144,7 @@ static struct file_system_type btrfs_fs_type = {
.name = "btrfs", .name = "btrfs",
.mount = btrfs_mount, .mount = btrfs_mount,
.kill_sb = btrfs_kill_super, .kill_sb = btrfs_kill_super,
.fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA, .fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA | FS_MGTIME,
}; };
static struct file_system_type btrfs_root_fs_type = { static struct file_system_type btrfs_root_fs_type = {
...@@ -2152,7 +2152,8 @@ static struct file_system_type btrfs_root_fs_type = { ...@@ -2152,7 +2152,8 @@ static struct file_system_type btrfs_root_fs_type = {
.name = "btrfs", .name = "btrfs",
.mount = btrfs_mount_root, .mount = btrfs_mount_root,
.kill_sb = btrfs_kill_super, .kill_sb = btrfs_kill_super,
.fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA | FS_ALLOW_IDMAP, .fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA |
FS_ALLOW_IDMAP | FS_MGTIME,
}; };
MODULE_ALIAS_FS("btrfs"); MODULE_ALIAS_FS("btrfs");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment