xfs: redefine xfs_ictimestamp_t
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 24 Aug 2020 23:01:34 +0000 (16:01 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 16 Sep 2020 03:52:41 +0000 (20:52 -0700)
Redefine xfs_ictimestamp_t as a uint64_t typedef in preparation for the
bigtime functionality.  Preserve the legacy structure format so that we
can let the compiler take care of the masking and shifting.

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>
fs/xfs/libxfs/xfs_log_format.h
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_inode_item_recover.c
fs/xfs/xfs_ondisk.h

index e3400c9..8bd00da 100644 (file)
@@ -368,10 +368,13 @@ static inline int xfs_ilog_fdata(int w)
  * directly mirrors the xfs_dinode structure as it must contain all the same
  * information.
  */
-typedef struct xfs_ictimestamp {
+typedef uint64_t xfs_ictimestamp_t;
+
+/* Legacy timestamp encoding format. */
+struct xfs_legacy_ictimestamp {
        int32_t         t_sec;          /* timestamp seconds */
        int32_t         t_nsec;         /* timestamp nanoseconds */
-} xfs_ictimestamp_t;
+};
 
 /*
  * Define the format of the inode core that is logged. This structure must be
index 32fe9ef..94784e6 100644 (file)
@@ -295,6 +295,24 @@ xfs_inode_item_format_attr_fork(
        }
 }
 
+/*
+ * Convert an incore timestamp to a log timestamp.  Note that the log format
+ * specifies host endian format!
+ */
+static inline xfs_ictimestamp_t
+xfs_inode_to_log_dinode_ts(
+       const struct timespec64         tv)
+{
+       struct xfs_legacy_ictimestamp   *lits;
+       xfs_ictimestamp_t               its;
+
+       lits = (struct xfs_legacy_ictimestamp *)&its;
+       lits->t_sec = tv.tv_sec;
+       lits->t_nsec = tv.tv_nsec;
+
+       return its;
+}
+
 static void
 xfs_inode_to_log_dinode(
        struct xfs_inode        *ip,
@@ -313,12 +331,9 @@ xfs_inode_to_log_dinode(
 
        memset(to->di_pad, 0, sizeof(to->di_pad));
        memset(to->di_pad3, 0, sizeof(to->di_pad3));
-       to->di_atime.t_sec = inode->i_atime.tv_sec;
-       to->di_atime.t_nsec = inode->i_atime.tv_nsec;
-       to->di_mtime.t_sec = inode->i_mtime.tv_sec;
-       to->di_mtime.t_nsec = inode->i_mtime.tv_nsec;
-       to->di_ctime.t_sec = inode->i_ctime.tv_sec;
-       to->di_ctime.t_nsec = inode->i_ctime.tv_nsec;
+       to->di_atime = xfs_inode_to_log_dinode_ts(inode->i_atime);
+       to->di_mtime = xfs_inode_to_log_dinode_ts(inode->i_mtime);
+       to->di_ctime = xfs_inode_to_log_dinode_ts(inode->i_ctime);
        to->di_nlink = inode->i_nlink;
        to->di_gen = inode->i_generation;
        to->di_mode = inode->i_mode;
@@ -340,8 +355,7 @@ xfs_inode_to_log_dinode(
        if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
                to->di_version = 3;
                to->di_changecount = inode_peek_iversion(inode);
-               to->di_crtime.t_sec = from->di_crtime.tv_sec;
-               to->di_crtime.t_nsec = from->di_crtime.tv_nsec;
+               to->di_crtime = xfs_inode_to_log_dinode_ts(from->di_crtime);
                to->di_flags2 = from->di_flags2;
                to->di_cowextsize = from->di_cowextsize;
                to->di_ino = ip->i_ino;
index 03fab43..4e895c9 100644 (file)
@@ -121,11 +121,13 @@ xfs_log_dinode_to_disk_ts(
        const xfs_ictimestamp_t         its)
 {
        struct xfs_legacy_timestamp     *lts;
+       struct xfs_legacy_ictimestamp   *lits;
        xfs_timestamp_t                 ts;
 
        lts = (struct xfs_legacy_timestamp *)&ts;
-       lts->t_sec = cpu_to_be32(its.t_sec);
-       lts->t_nsec = cpu_to_be32(its.t_nsec);
+       lits = (struct xfs_legacy_ictimestamp *)&its;
+       lts->t_sec = cpu_to_be32(lits->t_sec);
+       lts->t_nsec = cpu_to_be32(lits->t_nsec);
 
        return ts;
 }
index 4e5f51d..cfa54d6 100644 (file)
@@ -122,7 +122,8 @@ xfs_check_ondisk_structs(void)
        XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64,             16);
        XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode,            176);
        XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log,           28);
-       XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp,           8);
+       XFS_CHECK_STRUCT_SIZE(xfs_ictimestamp_t,                8);
+       XFS_CHECK_STRUCT_SIZE(struct xfs_legacy_ictimestamp,    8);
        XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32,   52);
        XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format,      56);
        XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat,        20);