xfs: widen ondisk inode timestamps to deal with y2038+
Redesign the ondisk inode timestamps to be a simple unsigned 64-bit counter of nanoseconds since 14 Dec 1901 (i.e. the minimum time in the 32-bit unix time epoch). This enables us to handle dates up to 2486, which solves the y2038 problem. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Gao Xiang <hsiangkao@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
@@ -115,15 +115,25 @@ out_free_ip:
|
||||
return error;
|
||||
}
|
||||
|
||||
static inline bool xfs_log_dinode_has_bigtime(const struct xfs_log_dinode *ld)
|
||||
{
|
||||
return ld->di_version >= 3 &&
|
||||
(ld->di_flags2 & XFS_DIFLAG2_BIGTIME);
|
||||
}
|
||||
|
||||
/* Convert a log timestamp to an ondisk timestamp. */
|
||||
static inline xfs_timestamp_t
|
||||
xfs_log_dinode_to_disk_ts(
|
||||
struct xfs_log_dinode *from,
|
||||
const xfs_ictimestamp_t its)
|
||||
{
|
||||
struct xfs_legacy_timestamp *lts;
|
||||
struct xfs_legacy_ictimestamp *lits;
|
||||
xfs_timestamp_t ts;
|
||||
|
||||
if (xfs_log_dinode_has_bigtime(from))
|
||||
return cpu_to_be64(its);
|
||||
|
||||
lts = (struct xfs_legacy_timestamp *)&ts;
|
||||
lits = (struct xfs_legacy_ictimestamp *)&its;
|
||||
lts->t_sec = cpu_to_be32(lits->t_sec);
|
||||
@@ -149,9 +159,9 @@ xfs_log_dinode_to_disk(
|
||||
to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
|
||||
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
|
||||
|
||||
to->di_atime = xfs_log_dinode_to_disk_ts(from->di_atime);
|
||||
to->di_mtime = xfs_log_dinode_to_disk_ts(from->di_mtime);
|
||||
to->di_ctime = xfs_log_dinode_to_disk_ts(from->di_ctime);
|
||||
to->di_atime = xfs_log_dinode_to_disk_ts(from, from->di_atime);
|
||||
to->di_mtime = xfs_log_dinode_to_disk_ts(from, from->di_mtime);
|
||||
to->di_ctime = xfs_log_dinode_to_disk_ts(from, from->di_ctime);
|
||||
|
||||
to->di_size = cpu_to_be64(from->di_size);
|
||||
to->di_nblocks = cpu_to_be64(from->di_nblocks);
|
||||
@@ -167,7 +177,8 @@ xfs_log_dinode_to_disk(
|
||||
|
||||
if (from->di_version == 3) {
|
||||
to->di_changecount = cpu_to_be64(from->di_changecount);
|
||||
to->di_crtime = xfs_log_dinode_to_disk_ts(from->di_crtime);
|
||||
to->di_crtime = xfs_log_dinode_to_disk_ts(from,
|
||||
from->di_crtime);
|
||||
to->di_flags2 = cpu_to_be64(from->di_flags2);
|
||||
to->di_cowextsize = cpu_to_be32(from->di_cowextsize);
|
||||
to->di_ino = cpu_to_be64(from->di_ino);
|
||||
|
Reference in New Issue
Block a user