linux/fs/xfs/libxfs
Linus Torvalds 6ac81fd55e vfs-6.13.mgtime
-----BEGIN PGP SIGNATURE-----
 
 iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCZzcScQAKCRCRxhvAZXjc
 oj+5AP4k822a77wc/3iPFk379naIvQ4dsrgemh0/Pb6ZvzvkFQEAi3vFCfzCDR2x
 SkJF/RwXXKZv6U31QXMRt2Qo6wfBuAc=
 =nVlm
 -----END PGP SIGNATURE-----

Merge tag 'vfs-6.13.mgtime' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs

Pull vfs multigrain timestamps from Christian Brauner:
 "This is another try at implementing multigrain timestamps. This time
  with significant help from the timekeeping maintainers to reduce the
  performance impact.

  Thomas provided a base branch that contains the required timekeeping
  interfaces for the VFS. It serves as the base for the multi-grain
  timestamp work:

   - Multigrain timestamps allow the kernel to use fine-grained
     timestamps when an inode's attributes is being actively observed
     via ->getattr(). With this support, it's possible for a file to get
     a fine-grained timestamp, and another modified after it to get a
     coarse-grained stamp that is earlier than the fine-grained time. If
     this happens then the files can appear to have been modified in
     reverse order, which breaks VFS ordering guarantees.

     To prevent this, a floor value is maintained for multigrain
     timestamps. Whenever a fine-grained timestamp is handed out, record
     it, and when later coarse-grained stamps are handed out, ensure
     they are not earlier than that value. If the coarse-grained
     timestamp is earlier than the fine-grained floor, return the floor
     value instead.

     The timekeeper changes add a static singleton atomic64_t into
     timekeeper.c that is used to keep track of the latest fine-grained
     time ever handed out. This is tracked as a monotonic ktime_t value
     to ensure that it isn't affected by clock jumps. Because it is
     updated at different times than the rest of the timekeeper object,
     the floor value is managed independently of the timekeeper via a
     cmpxchg() operation, and sits on its own cacheline.

     Two new public timekeeper interfaces are added:

      (1) ktime_get_coarse_real_ts64_mg() fills a timespec64 with the
          later of the coarse-grained clock and the floor time

      (2) ktime_get_real_ts64_mg() gets the fine-grained clock value,
          and tries to swap it into the floor. A timespec64 is filled
          with the result.

   - The VFS has always used coarse-grained timestamps when updating the
     ctime and mtime after a change. This has the benefit of allowing
     filesystems to optimize away a lot metadata updates, down to around
     1 per jiffy, even when a file is under heavy writes.

     Unfortunately, this has always been an issue when we're exporting
     via NFSv3, which relies on timestamps to validate caches. A lot of
     changes can happen in a jiffy, so timestamps aren't sufficient to
     help the client decide when to invalidate the cache. Even with
     NFSv4, a lot of exported filesystems don't properly support a
     change attribute and are subject to the same problems with
     timestamp granularity. Other applications have similar issues with
     timestamps (e.g backup applications).

     If we were to always use fine-grained timestamps, that would
     improve the situation, but that becomes rather expensive, as the
     underlying filesystem would have to log a lot more metadata
     updates.

     This adds a way to only use fine-grained timestamps when they are
     being actively queried. Use the (unused) top bit in
     inode->i_ctime_nsec as a flag that indicates whether the current
     timestamps have been queried via stat() or the like. When it's set,
     we allow the kernel to use a fine-grained timestamp iff it's
     necessary to make the ctime show a different value.

     This solves the problem of being able to distinguish the timestamp
     between updates, but introduces a new problem: it's now possible
     for a file being changed to get a fine-grained timestamp. A file
     that is altered just a bit later can then get a coarse-grained one
     that appears older than the earlier fine-grained time. This
     violates timestamp ordering guarantees.

     This is where the earlier mentioned timkeeping interfaces help. A
     global monotonic atomic64_t value is kept that acts as a timestamp
     floor. When we go to stamp a file, we first get the latter of the
     current floor value and the current coarse-grained time. If the
     inode ctime hasn't been queried then we just attempt to stamp it
     with that value.

     If it has been queried, then first see whether the current coarse
     time is later than the existing ctime. If it is, then we accept
     that value. If it isn't, then we get a fine-grained time and try to
     swap that into the global floor. Whether that succeeds or fails, we
     take the resulting floor time, convert it to realtime and try to
     swap that into the ctime.

     We take the result of the ctime swap whether it succeeds or fails,
     since either is just as valid.

     Filesystems can opt into this by setting the FS_MGTIME fstype flag.
     Others should be unaffected (other than being subject to the same
     floor value as multigrain filesystems)"

* tag 'vfs-6.13.mgtime' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs:
  fs: reduce pointer chasing in is_mgtime() test
  tmpfs: add support for multigrain timestamps
  btrfs: convert to multigrain timestamps
  ext4: switch to multigrain timestamps
  xfs: switch to multigrain timestamps
  Documentation: add a new file documenting multigrain timestamps
  fs: add percpu counters for significant multigrain timestamp events
  fs: tracepoints around multigrain timestamp events
  fs: handle delegated timestamps in setattr_copy_mgtime
  timekeeping: Add percpu counter for tracking floor swap events
  timekeeping: Add interfaces for handling timestamps with a floor value
  fs: have setattr_copy handle multigrain timestamps appropriately
  fs: add infrastructure for multigrain timestamps
2024-11-18 09:15:39 -08:00
..
xfs_ag_resv.c xfs: split xfs_mod_freecounter 2024-04-22 18:00:47 +05:30
xfs_ag_resv.h xfs: get rid of xfs_ag_resv_rmapbt_alloc 2024-07-04 14:36:13 +05:30
xfs_ag.c xfs: update the pag for the last AG at recovery time 2024-10-22 13:37:19 +02:00
xfs_ag.h xfs: update the pag for the last AG at recovery time 2024-10-22 13:37:19 +02:00
xfs_alloc_btree.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_alloc_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_alloc.c xfs: Reduce unnecessary searches when searching for the best extents 2024-10-30 11:27:18 +01:00
xfs_alloc.h xfs: don't ifdef around the exact minlen allocations 2024-10-07 08:00:11 +02:00
xfs_attr_leaf.c xfs: distinguish extra split from real ENOSPC from xfs_attr3_leaf_split 2024-10-07 08:00:11 +02:00
xfs_attr_leaf.h xfs: return bool from xfs_attr3_leaf_add 2024-10-07 08:00:11 +02:00
xfs_attr_remote.c xfs: minor cleanups of xfs_attr3_rmt_blocks 2024-05-02 07:48:37 -07:00
xfs_attr_remote.h xfs: create a helper to compute the blockcount of a max sized remote value 2024-05-02 07:48:36 -07:00
xfs_attr_sf.h xfs: pass the attr value to put_listent when possible 2024-04-23 07:47:00 -07:00
xfs_attr.c xfs: distinguish extra split from real ENOSPC from xfs_attr_node_try_addname 2024-10-07 08:00:11 +02:00
xfs_attr.h xfs: fix xfs_init_attr_trans not handling explicit operation codes 2024-05-27 15:55:52 +05:30
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_bmap_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_bmap.c xfs: support lowmode allocations in xfs_bmap_exact_minlen_extent_alloc 2024-10-07 08:00:12 +02:00
xfs_bmap.h xfs: hoist extent size helpers to libxfs 2024-07-02 11:36:55 -07:00
xfs_btree_mem.c xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_btree_mem.h xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_btree_staging.c xfs: xfs_btree_bload_prep_block() should use __GFP_NOFAIL 2024-02-28 14:04:30 +05:30
xfs_btree_staging.h xfs: don't override bc_ops for staging btrees 2024-02-22 12:37:35 -08:00
xfs_btree.c xfs: Avoid races with cnt_btree lastrec updates 2024-07-04 12:44:16 +05:30
xfs_btree.h xfs: Avoid races with cnt_btree lastrec updates 2024-07-04 12:44:16 +05:30
xfs_cksum.h
xfs_da_btree.c xfs: distinguish extra split from real ENOSPC from xfs_attr3_leaf_split 2024-10-07 08:00:11 +02:00
xfs_da_btree.h xfs: create attr log item opcodes and formats for parent pointers 2024-04-23 07:46:57 -07:00
xfs_da_format.h xfs: turn XFS_ATTR3_RMT_BUF_SPACE into a function 2024-05-02 07:48:36 -07:00
xfs_defer.c xfs: Remove duplicate xfs_trans_priv.h header 2024-09-03 10:07:41 +05:30
xfs_defer.h xfs: Increase XFS_DEFER_OPS_NR_INODES to 5 2024-04-15 14:59:01 -07:00
xfs_dir2_block.c xfs: validate explicit directory block buffer owners 2024-04-15 14:58:52 -07:00
xfs_dir2_data.c xfs: don't walk off the end of a directory data block 2024-07-01 09:32:29 +05:30
xfs_dir2_leaf.c xfs: validate explicit directory free block owners 2024-04-15 14:58:52 -07:00
xfs_dir2_node.c xfs: validate explicit directory free block owners 2024-04-15 14:58:52 -07:00
xfs_dir2_priv.h xfs: don't walk off the end of a directory data block 2024-07-01 09:32:29 +05:30
xfs_dir2_sf.c xfs: convert remaining kmem_free() to kfree() 2024-02-13 18:07:34 +05:30
xfs_dir2.c xfs: move dirent update hooks to xfs_dir2.c 2024-07-02 11:37:00 -07:00
xfs_dir2.h xfs: move dirent update hooks to xfs_dir2.c 2024-07-02 11:37:00 -07:00
xfs_dquot_buf.c
xfs_errortag.h xfs: add error injection to test file mapping exchange recovery 2024-04-15 14:54:19 -07:00
xfs_exchmaps.c xfs: refactor dir format helpers 2024-04-26 11:21:46 +05:30
xfs_exchmaps.h xfs: use atomic extent swapping to fix user file fork data 2024-04-15 14:58:53 -07:00
xfs_format.h xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb 2024-07-02 11:37:00 -07:00
xfs_fs.h xfs: fix C++ compilation errors in xfs_fs.h 2024-09-01 08:58:20 -07:00
xfs_health.h xfs: report directory tree corruption in the health information 2024-04-23 16:55:17 -07:00
xfs_ialloc_btree.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_ialloc_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_ialloc.c vfs-6.12.blocksize 2024-09-20 17:53:17 -07:00
xfs_ialloc.h xfs: pass the icreate args object to xfs_dialloc 2024-09-01 08:58:19 -07:00
xfs_iext_tree.c xfs: use __GFP_NOLOCKDEP instead of GFP_NOFS 2024-02-13 18:07:34 +05:30
xfs_inode_buf.c xfs: fix di_onlink checking for V1/V2 inodes 2024-08-26 09:50:41 +05:30
xfs_inode_buf.h
xfs_inode_fork.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_inode_fork.h xfs: simplify iext overflow checking and upgrade 2024-05-03 11:20:06 +05:30
xfs_inode_util.c xfs: remove unnecessary check 2024-09-03 10:07:40 +05:30
xfs_inode_util.h xfs: hoist inode free function to libxfs 2024-07-02 11:36:59 -07:00
xfs_log_format.h xfs: record inode generation in xattr update log intent items 2024-04-23 07:46:57 -07:00
xfs_log_recover.h xfs: capture inode generation numbers in the ondisk exchmaps log item 2024-04-15 14:54:24 -07:00
xfs_log_rlimit.c xfs: drop compatibility minimum log size computations for reflink 2024-04-23 07:47:01 -07:00
xfs_ondisk.h xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb 2024-07-02 11:37:00 -07:00
xfs_parent.c xfs: add raw parent pointer apis to support repair 2024-04-23 07:47:04 -07:00
xfs_parent.h xfs: add raw parent pointer apis to support repair 2024-04-23 07:47:04 -07:00
xfs_quota_defs.h xfs: remove unused parameter in macro XFS_DQUOT_LOGRES 2024-07-29 09:29:31 +05:30
xfs_refcount_btree.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_refcount_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_refcount.c xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_refcount.h xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_rmap_btree.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_rmap_btree.h xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_rmap.c xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rmap.h xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rtbitmap.c xfs: replace m_rsumsize with m_rsumblocks 2024-09-01 08:58:19 -07:00
xfs_rtbitmap.h xfs: remove xfs_{rtbitmap,rtsummary}_wordcount 2024-09-01 08:58:19 -07:00
xfs_sb.c xfs: standardize the btree maxrecs function parameters 2024-09-01 08:58:20 -07:00
xfs_sb.h xfs: ensure rtx mask/shift are correct after growfs 2024-09-01 08:58:19 -07:00
xfs_shared.h xfs: enable block size larger than page size support 2024-09-03 15:00:52 +02:00
xfs_symlink_remote.c xfs: pass the owner to xfs_symlink_write_target 2024-04-15 14:58:57 -07:00
xfs_symlink_remote.h xfs: pass the owner to xfs_symlink_write_target 2024-04-15 14:58:57 -07:00
xfs_trans_inode.c xfs: switch to multigrain timestamps 2024-10-10 10:20:52 +02:00
xfs_trans_resv.c xfs: replace shouty XFS_BM{BT,DR} macros 2024-09-01 08:58:20 -07:00
xfs_trans_resv.h
xfs_trans_space.c xfs: Add parent pointers to rename 2024-04-23 07:46:59 -07:00
xfs_trans_space.h xfs: Add parent pointers to rename 2024-04-23 07:46:59 -07:00
xfs_types.c xfs: rename xfs_verify_rtext to xfs_verify_rtbext 2023-10-17 16:24:22 -07:00
xfs_types.h xfs: remove xfs_validate_rtextents 2024-09-01 08:58:19 -07:00