Major changes in v3: - move flag to use bit 31 instead of 0 since the upper bits in the tv_nsec field aren't used for timestamps. This means we don't need to set s_time_gran to a value higher than 1. - use an fstype flag instead of a superblock flag ...plus a lot of smaller cleanups and documentation. The basic idea with multigrain timestamps is to keep track of when an inode's mtime or ctime has been queried and to force a fine-grained timestamp the next time the mtime or ctime is updated. This is a follow-up of the patches I posted last week [1]. The main change in this set is that it no longer uses the lowest-order bit in the tv_nsec field, and instead uses one of the higher-order bits (#31, specifically) since they are otherwise unused. This change makes things much simpler, and we no longer need to twiddle s_time_gran for it. Note that with these changes, the statx06 LTP test will intermittently fail on most filesystems, usually with errors like this: statx06.c:138: TFAIL: Birth time > after_time statx06.c:138: TFAIL: Modified time > after_time The test does this: SAFE_CLOCK_GETTIME(CLOCK_REALTIME_COARSE, &before_time); clock_wait_tick(); tc->operation(); clock_wait_tick(); SAFE_CLOCK_GETTIME(CLOCK_REALTIME_COARSE, &after_time); Converting the second SAFE_CLOCK_GETTIME to use CLOCK_REALTIME instead gets things working again. For now, I've only converted/tested a few filesystems, focusing on the most popular ones exported via NFS. If this approach looks acceptable though, I'll plan to convert more filesystems to it. Another thing we could consider is enabling this unilaterally kernel-wide. I decided not to do that for now, but it's something we could consider for lately. [1]: https://lore.kernel.org/linux-fsdevel/20230424151104.175456-1-jlayton@xxxxxxxxxx/ Jeff Layton (6): fs: add infrastructure for multigrain inode i_m/ctime overlayfs: allow it handle multigrain timestamps shmem: convert to multigrain timestamps xfs: convert to multigrain timestamps ext4: convert to multigrain timestamps btrfs: convert to multigrain timestamps fs/btrfs/delayed-inode.c | 2 +- fs/btrfs/file.c | 10 +++--- fs/btrfs/inode.c | 25 +++++++------- fs/btrfs/ioctl.c | 6 ++-- fs/btrfs/reflink.c | 2 +- fs/btrfs/super.c | 5 +-- fs/btrfs/transaction.c | 2 +- fs/btrfs/tree-log.c | 2 +- fs/btrfs/volumes.c | 2 +- fs/btrfs/xattr.c | 4 +-- fs/ext4/acl.c | 2 +- fs/ext4/extents.c | 10 +++--- fs/ext4/ialloc.c | 2 +- fs/ext4/inline.c | 4 +-- fs/ext4/inode.c | 24 ++++++++++--- fs/ext4/ioctl.c | 8 ++--- fs/ext4/namei.c | 20 +++++------ fs/ext4/super.c | 4 +-- fs/ext4/xattr.c | 2 +- fs/inode.c | 52 ++++++++++++++++++++++++++-- fs/overlayfs/file.c | 7 ++-- fs/overlayfs/util.c | 2 +- fs/stat.c | 32 +++++++++++++++++ fs/xfs/libxfs/xfs_inode_buf.c | 2 +- fs/xfs/libxfs/xfs_trans_inode.c | 2 +- fs/xfs/xfs_acl.c | 2 +- fs/xfs/xfs_bmap_util.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_iops.c | 15 ++++++-- fs/xfs/xfs_super.c | 2 +- include/linux/fs.h | 61 ++++++++++++++++++++++++++++++++- mm/shmem.c | 25 +++++++------- 33 files changed, 255 insertions(+), 89 deletions(-) -- 2.40.1