[[Timestamps]]
= Timestamps

XFS needs to be able to persist the concept of a point in time.  This chapter
discusses how timestamps are represented on disk.

[[Inode_Timestamps]]
== Inode Timestamps

The filesystem preserves up to four different timestamps for each file stored
in the filesystem.  These quantities are: the time when the file was created
(+di_crtime+), the last time the file metadata were changed (+di_ctime+), the
last time the file contents were changed (+di_mtime+), and the last time the
file contents were accessed (+di_atime+).  The filesystem epoch is aligned with
the Unix epoch, which is to say that a value of all zeroes represents 00:00:00
UTC on January 1st, 1970.

Prior to the introduction of the bigtime feature, inode timestamps were
laid out as as segmented counter of seconds and nanoseconds:

[source, c]
----
struct xfs_legacy_timestamp {
     __int32_t                 t_sec;
     __int32_t                 t_nsec;
};
----

The smallest date this format can represent is 20:45:52 UTC on December 13st,
1901, and the largest date supported is 03:14:07 UTC on January 19, 2038.

With the introduction of the bigtime feature, the format is changed to
interpret the timestamp as a 64-bit count of nanoseconds since the smallest
date supported by the old encoding.  This means that the smallest date
supported is still 20:45:52 UTC on December 13st, 1901; but now the largest
date supported is 20:20:24 UTC on July 2nd, 2486.

[[Quota_Timers]]
== Quota Grace Period Expiration Timers

XFS' quota control allows administrators to set a soft limit on each type of
resource that a regular user can consume: inodes, blocks, and realtime blocks.
The administrator can establish a grace period after which the soft limit
becomes a hard limit for the user.  Therefore, XFS needs to be able to store
the exact time when a grace period expires.

Prior to the introduction of the bigtime feature, quota grace period
expirations were unsigned 32-bit seconds counters, with the magic value zero
meaning that the soft limit has not been exceeded.  Therefore, the smallest
expiration date that can be expressed is 00:00:01 UTC on January 1st, 1970; and
the largest is 06:28:15 on February 7th, 2106.

With the introduction of the bigtime feature, the ondisk field now encodes the
upper 32 bits of an unsigned 34-bit seconds counter.  Zero is still a magic
value that means the soft limit has not been exceeded.  The smallest quota
expiration date is now 00:00:04 UTC on January 1st, 1970; and the largest is
20:20:24 UTC on July 2nd, 2486.  The format can encode slightly larger
expiration dates, but it was decided to end support for both timers at exactly
the same point.

The default grace periods are stored in the timer fields of the quota record
for id zero.  Since this quantity is an interval, these fields are always
interpreted as an unsigned 32 bit quantity.  Therefore, the longest possible
grace period is approximately 136 years, 29 weeks, 3 days, 6 hours, 28 minutes
and 15 seconds.
