| [[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. |