Blame SOURCES/xfsprogs-5.10.0-xfs-redefine-xfs_timestamp_t.patch

0bf83d
From a252aadfc977473e0851acf0d529c930c6e8e181 Mon Sep 17 00:00:00 2001
0bf83d
From: "Darrick J. Wong" <darrick.wong@oracle.com>
0bf83d
Date: Tue, 10 Nov 2020 16:29:40 -0500
0bf83d
Subject: [PATCH] xfs: redefine xfs_timestamp_t
0bf83d
0bf83d
Source kernel commit: 5a0bb066f60fa02f453d7721844eae59f505c06e
0bf83d
0bf83d
Redefine xfs_timestamp_t as a __be64 typedef in preparation for the
0bf83d
bigtime functionality.  Preserve the legacy structure format so that we
0bf83d
can let the compiler take care of masking and shifting.
0bf83d
0bf83d
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
0bf83d
Reviewed-by: Christoph Hellwig <hch@lst.de>
0bf83d
Reviewed-by: Gao Xiang <hsiangkao@redhat.com>
0bf83d
Reviewed-by: Dave Chinner <dchinner@redhat.com>
0bf83d
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
0bf83d
---
0bf83d
0bf83d
diff --git a/db/field.c b/db/field.c
0bf83d
index 66fa37e..4a45c66 100644
0bf83d
--- a/db/field.c
0bf83d
+++ b/db/field.c
0bf83d
@@ -350,7 +350,7 @@ const ftattr_t	ftattrtab[] = {
0bf83d
 	{ FLDT_TIME, "time", fp_time, NULL, SI(bitsz(int32_t)), FTARG_SIGNED,
0bf83d
 	  NULL, NULL },
0bf83d
 	{ FLDT_TIMESTAMP, "timestamp", NULL, (char *)timestamp_flds,
0bf83d
-	  SI(bitsz(xfs_timestamp_t)), 0, NULL, timestamp_flds },
0bf83d
+	  SI(bitsz(struct xfs_legacy_timestamp)), 0, NULL, timestamp_flds },
0bf83d
 	{ FLDT_UINT1, "uint1", fp_num, "%u", SI(1), 0, NULL, NULL },
0bf83d
 	{ FLDT_UINT16D, "uint16d", fp_num, "%u", SI(bitsz(uint16_t)), 0, NULL,
0bf83d
 	  NULL },
0bf83d
diff --git a/db/inode.c b/db/inode.c
0bf83d
index 697f7fe..b308538 100644
0bf83d
--- a/db/inode.c
0bf83d
+++ b/db/inode.c
0bf83d
@@ -176,7 +176,7 @@ const field_t	inode_v3_flds[] = {
0bf83d
 };
0bf83d
 
0bf83d
 
0bf83d
-#define	TOFF(f)	bitize(offsetof(xfs_timestamp_t, t_ ## f))
0bf83d
+#define	TOFF(f)	bitize(offsetof(struct xfs_legacy_timestamp, t_ ## f))
0bf83d
 const field_t	timestamp_flds[] = {
0bf83d
 	{ "sec", FLDT_TIME, OI(TOFF(sec)), C1, 0, TYP_NONE },
0bf83d
 	{ "nsec", FLDT_NSEC, OI(TOFF(nsec)), C1, 0, TYP_NONE },
0bf83d
diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h
0bf83d
index 8858341..371f5cd 100644
0bf83d
--- a/libxfs/xfs_format.h
0bf83d
+++ b/libxfs/xfs_format.h
0bf83d
@@ -847,12 +847,16 @@ typedef struct xfs_agfl {
0bf83d
  * seconds and nanoseconds; time zero is the Unix epoch, Jan  1 00:00:00 UTC
0bf83d
  * 1970, which means that the timestamp epoch is the same as the Unix epoch.
0bf83d
  * Therefore, the ondisk min and max defined here can be used directly to
0bf83d
- * constrain the incore timestamps on a Unix system.
0bf83d
+ * constrain the incore timestamps on a Unix system.  Note that we actually
0bf83d
+ * encode a __be64 value on disk.
0bf83d
  */
0bf83d
-typedef struct xfs_timestamp {
0bf83d
+typedef __be64 xfs_timestamp_t;
0bf83d
+
0bf83d
+/* Legacy timestamp encoding format. */
0bf83d
+struct xfs_legacy_timestamp {
0bf83d
 	__be32		t_sec;		/* timestamp seconds */
0bf83d
 	__be32		t_nsec;		/* timestamp nanoseconds */
0bf83d
-} xfs_timestamp_t;
0bf83d
+};
0bf83d
 
0bf83d
 /*
0bf83d
  * Smallest possible ondisk seconds value with traditional timestamps.  This
0bf83d
diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c
0bf83d
index f80ce10..d8831a1 100644
0bf83d
--- a/libxfs/xfs_inode_buf.c
0bf83d
+++ b/libxfs/xfs_inode_buf.c
0bf83d
@@ -195,6 +195,21 @@ xfs_imap_to_bp(
0bf83d
 	return 0;
0bf83d
 }
0bf83d
 
0bf83d
+/* Convert an ondisk timestamp to an incore timestamp. */
0bf83d
+struct timespec64
0bf83d
+xfs_inode_from_disk_ts(
0bf83d
+	const xfs_timestamp_t		ts)
0bf83d
+{
0bf83d
+	struct timespec64		tv;
0bf83d
+	struct xfs_legacy_timestamp	*lts;
0bf83d
+
0bf83d
+	lts = (struct xfs_legacy_timestamp *)&ts;
0bf83d
+	tv.tv_sec = (int)be32_to_cpu(lts->t_sec);
0bf83d
+	tv.tv_nsec = (int)be32_to_cpu(lts->t_nsec);
0bf83d
+
0bf83d
+	return tv;
0bf83d
+}
0bf83d
+
0bf83d
 void
0bf83d
 xfs_inode_from_disk(
0bf83d
 	struct xfs_inode	*ip,
0bf83d
@@ -231,12 +246,10 @@ xfs_inode_from_disk(
0bf83d
 	 * a time before epoch is converted to a time long after epoch
0bf83d
 	 * on 64 bit systems.
0bf83d
 	 */
0bf83d
-	inode->i_atime.tv_sec = (int)be32_to_cpu(from->di_atime.t_sec);
0bf83d
-	inode->i_atime.tv_nsec = (int)be32_to_cpu(from->di_atime.t_nsec);
0bf83d
-	inode->i_mtime.tv_sec = (int)be32_to_cpu(from->di_mtime.t_sec);
0bf83d
-	inode->i_mtime.tv_nsec = (int)be32_to_cpu(from->di_mtime.t_nsec);
0bf83d
-	inode->i_ctime.tv_sec = (int)be32_to_cpu(from->di_ctime.t_sec);
0bf83d
-	inode->i_ctime.tv_nsec = (int)be32_to_cpu(from->di_ctime.t_nsec);
0bf83d
+	inode->i_atime = xfs_inode_from_disk_ts(from->di_atime);
0bf83d
+	inode->i_mtime = xfs_inode_from_disk_ts(from->di_mtime);
0bf83d
+	inode->i_ctime = xfs_inode_from_disk_ts(from->di_ctime);
0bf83d
+
0bf83d
 	inode->i_generation = be32_to_cpu(from->di_gen);
0bf83d
 	inode->i_mode = be16_to_cpu(from->di_mode);
0bf83d
 
0bf83d
@@ -254,13 +267,27 @@ xfs_inode_from_disk(
0bf83d
 	if (to->di_version == 3) {
0bf83d
 		inode_set_iversion_queried(inode,
0bf83d
 					   be64_to_cpu(from->di_changecount));
0bf83d
-		to->di_crtime.tv_sec = be32_to_cpu(from->di_crtime.t_sec);
0bf83d
-		to->di_crtime.tv_nsec = be32_to_cpu(from->di_crtime.t_nsec);
0bf83d
+		to->di_crtime = xfs_inode_from_disk_ts(from->di_crtime);
0bf83d
 		to->di_flags2 = be64_to_cpu(from->di_flags2);
0bf83d
 		to->di_cowextsize = be32_to_cpu(from->di_cowextsize);
0bf83d
 	}
0bf83d
 }
0bf83d
 
0bf83d
+/* Convert an incore timestamp to an ondisk timestamp. */
0bf83d
+static inline xfs_timestamp_t
0bf83d
+xfs_inode_to_disk_ts(
0bf83d
+	const struct timespec64		tv)
0bf83d
+{
0bf83d
+	struct xfs_legacy_timestamp	*lts;
0bf83d
+	xfs_timestamp_t			ts;
0bf83d
+
0bf83d
+	lts = (struct xfs_legacy_timestamp *)&ts;
0bf83d
+	lts->t_sec = cpu_to_be32(tv.tv_sec);
0bf83d
+	lts->t_nsec = cpu_to_be32(tv.tv_nsec);
0bf83d
+
0bf83d
+	return ts;
0bf83d
+}
0bf83d
+
0bf83d
 void
0bf83d
 xfs_inode_to_disk(
0bf83d
 	struct xfs_inode	*ip,
0bf83d
@@ -281,12 +308,9 @@ xfs_inode_to_disk(
0bf83d
 	to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
0bf83d
 
0bf83d
 	memset(to->di_pad, 0, sizeof(to->di_pad));
0bf83d
-	to->di_atime.t_sec = cpu_to_be32(inode->i_atime.tv_sec);
0bf83d
-	to->di_atime.t_nsec = cpu_to_be32(inode->i_atime.tv_nsec);
0bf83d
-	to->di_mtime.t_sec = cpu_to_be32(inode->i_mtime.tv_sec);
0bf83d
-	to->di_mtime.t_nsec = cpu_to_be32(inode->i_mtime.tv_nsec);
0bf83d
-	to->di_ctime.t_sec = cpu_to_be32(inode->i_ctime.tv_sec);
0bf83d
-	to->di_ctime.t_nsec = cpu_to_be32(inode->i_ctime.tv_nsec);
0bf83d
+	to->di_atime = xfs_inode_to_disk_ts(inode->i_atime);
0bf83d
+	to->di_mtime = xfs_inode_to_disk_ts(inode->i_mtime);
0bf83d
+	to->di_ctime = xfs_inode_to_disk_ts(inode->i_ctime);
0bf83d
 	to->di_nlink = cpu_to_be32(inode->i_nlink);
0bf83d
 	to->di_gen = cpu_to_be32(inode->i_generation);
0bf83d
 	to->di_mode = cpu_to_be16(inode->i_mode);
0bf83d
@@ -304,8 +328,7 @@ xfs_inode_to_disk(
0bf83d
 
0bf83d
 	if (from->di_version == 3) {
0bf83d
 		to->di_changecount = cpu_to_be64(inode_peek_iversion(inode));
0bf83d
-		to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.tv_sec);
0bf83d
-		to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.tv_nsec);
0bf83d
+		to->di_crtime = xfs_inode_to_disk_ts(from->di_crtime);
0bf83d
 		to->di_flags2 = cpu_to_be64(from->di_flags2);
0bf83d
 		to->di_cowextsize = cpu_to_be32(from->di_cowextsize);
0bf83d
 		to->di_ino = cpu_to_be64(ip->i_ino);
0bf83d
diff --git a/libxfs/xfs_inode_buf.h b/libxfs/xfs_inode_buf.h
0bf83d
index 0343368..6147f42 100644
0bf83d
--- a/libxfs/xfs_inode_buf.h
0bf83d
+++ b/libxfs/xfs_inode_buf.h
0bf83d
@@ -76,4 +76,6 @@ xfs_failaddr_t xfs_inode_validate_cowextsize(struct xfs_mount *mp,
0bf83d
 		uint32_t cowextsize, uint16_t mode, uint16_t flags,
0bf83d
 		uint64_t flags2);
0bf83d
 
0bf83d
+struct timespec64 xfs_inode_from_disk_ts(const xfs_timestamp_t ts);
0bf83d
+
0bf83d
 #endif	/* __XFS_INODE_BUF_H__ */
0bf83d
diff --git a/repair/dinode.c b/repair/dinode.c
0bf83d
index 8fa5f88..0c40f2a 100644
0bf83d
--- a/repair/dinode.c
0bf83d
+++ b/repair/dinode.c
0bf83d
@@ -2213,9 +2213,12 @@ static void
0bf83d
 check_nsec(
0bf83d
 	const char		*name,
0bf83d
 	xfs_ino_t		lino,
0bf83d
-	struct xfs_timestamp	*t,
0bf83d
+	xfs_timestamp_t		*ts,
0bf83d
 	int			*dirty)
0bf83d
 {
0bf83d
+	struct xfs_legacy_timestamp *t;
0bf83d
+
0bf83d
+	t = (struct xfs_legacy_timestamp *)ts;
0bf83d
 	if (be32_to_cpu(t->t_nsec) < NSEC_PER_SEC)
0bf83d
 		return;
0bf83d