Blame SOURCES/xfsprogs-5.10.0-xfs_db-refactor-timestamp-printing.patch

5d5cbe
From 300422226c423222e78d82d54b09d0ae27c7d4af Mon Sep 17 00:00:00 2001
5d5cbe
From: "Darrick J. Wong" <darrick.wong@oracle.com>
5d5cbe
Date: Fri, 20 Nov 2020 17:03:27 -0500
5d5cbe
Subject: [PATCH] xfs_db: refactor timestamp printing
5d5cbe
5d5cbe
Introduce type-specific printing functions to xfs_db to print an
5d5cbe
xfs_timestamp instead of open-coding the timestamp decoding.  This is
5d5cbe
needed to stay ahead of changes that we're going to make to
5d5cbe
xfs_timestamp_t in the following patches.
5d5cbe
5d5cbe
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
5d5cbe
Reviewed-by: Christoph Hellwig <hch@lst.de>
5d5cbe
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5d5cbe
---
5d5cbe
5d5cbe
diff --git a/db/field.c b/db/field.c
5d5cbe
index 4a45c66..a187a72 100644
5d5cbe
--- a/db/field.c
5d5cbe
+++ b/db/field.c
5d5cbe
@@ -334,8 +334,8 @@ const ftattr_t	ftattrtab[] = {
5d5cbe
 	  FTARG_SIGNED, NULL, NULL },
5d5cbe
 	{ FLDT_INT8D, "int8d", fp_num, "%d", SI(bitsz(int8_t)), FTARG_SIGNED,
5d5cbe
 	  NULL, NULL },
5d5cbe
-	{ FLDT_NSEC, "nsec", fp_num, "%09d", SI(bitsz(int32_t)), FTARG_SIGNED,
5d5cbe
-	  NULL, NULL },
5d5cbe
+	{ FLDT_NSEC, "nsec", fp_nsec, NULL, SI(bitsz(xfs_timestamp_t)),
5d5cbe
+	  FTARG_SIGNED, NULL, NULL },
5d5cbe
 	{ FLDT_QCNT, "qcnt", fp_num, "%llu", SI(bitsz(xfs_qcnt_t)), 0, NULL,
5d5cbe
 	  NULL },
5d5cbe
 	{ FLDT_QWARNCNT, "qwarncnt", fp_num, "%u", SI(bitsz(xfs_qwarncnt_t)), 0,
5d5cbe
@@ -347,10 +347,10 @@ const ftattr_t	ftattrtab[] = {
5d5cbe
 	{ FLDT_SYMLINK_CRC, "symlink", NULL, (char *)symlink_crc_flds,
5d5cbe
 	  symlink_size, FTARG_SIZE, NULL, symlink_crc_flds },
5d5cbe
 
5d5cbe
-	{ FLDT_TIME, "time", fp_time, NULL, SI(bitsz(int32_t)), FTARG_SIGNED,
5d5cbe
-	  NULL, NULL },
5d5cbe
+	{ FLDT_TIME, "time", fp_time, NULL, SI(bitsz(xfs_timestamp_t)),
5d5cbe
+	  FTARG_SIGNED, NULL, NULL },
5d5cbe
 	{ FLDT_TIMESTAMP, "timestamp", NULL, (char *)timestamp_flds,
5d5cbe
-	  SI(bitsz(struct xfs_legacy_timestamp)), 0, NULL, timestamp_flds },
5d5cbe
+	  SI(bitsz(xfs_timestamp_t)), 0, NULL, timestamp_flds },
5d5cbe
 	{ FLDT_UINT1, "uint1", fp_num, "%u", SI(1), 0, NULL, NULL },
5d5cbe
 	{ FLDT_UINT16D, "uint16d", fp_num, "%u", SI(bitsz(uint16_t)), 0, NULL,
5d5cbe
 	  NULL },
5d5cbe
diff --git a/db/fprint.c b/db/fprint.c
5d5cbe
index c9d07e1..6e72bf0 100644
5d5cbe
--- a/db/fprint.c
5d5cbe
+++ b/db/fprint.c
5d5cbe
@@ -112,22 +112,21 @@ fp_sarray(
5d5cbe
 	return 1;
5d5cbe
 }
5d5cbe
 
5d5cbe
-/*ARGSUSED*/
5d5cbe
 int
5d5cbe
 fp_time(
5d5cbe
-	void	*obj,
5d5cbe
-	int	bit,
5d5cbe
-	int	count,
5d5cbe
-	char	*fmtstr,
5d5cbe
-	int	size,
5d5cbe
-	int	arg,
5d5cbe
-	int	base,
5d5cbe
-	int	array)
5d5cbe
+	void			*obj,
5d5cbe
+	int			bit,
5d5cbe
+	int			count,
5d5cbe
+	char			*fmtstr,
5d5cbe
+	int			size,
5d5cbe
+	int			arg,
5d5cbe
+	int			base,
5d5cbe
+	int			array)
5d5cbe
 {
5d5cbe
-	int	bitpos;
5d5cbe
-	char	*c;
5d5cbe
-	int	i;
5d5cbe
-	time_t  t;
5d5cbe
+	struct timespec64	tv;
5d5cbe
+	xfs_timestamp_t		*ts;
5d5cbe
+	int			bitpos;
5d5cbe
+	int			i;
5d5cbe
 
5d5cbe
 	ASSERT(bitoffs(bit) == 0);
5d5cbe
 	for (i = 0, bitpos = bit;
5d5cbe
@@ -135,10 +134,46 @@ fp_time(
5d5cbe
 	     i++, bitpos += size) {
5d5cbe
 		if (array)
5d5cbe
 			dbprintf("%d:", i + base);
5d5cbe
-		t = (time_t)getbitval((char *)obj + byteize(bitpos), 0,
5d5cbe
-				sizeof(int32_t) * 8, BVSIGNED);
5d5cbe
-		c = ctime(&t);
5d5cbe
-		dbprintf("%24.24s", c);
5d5cbe
+
5d5cbe
+		ts = obj + byteize(bitpos);
5d5cbe
+		tv = libxfs_inode_from_disk_ts(obj, *ts);
5d5cbe
+
5d5cbe
+		dbprintf("%24.24s", tv.tv_sec);
5d5cbe
+
5d5cbe
+		if (i < count - 1)
5d5cbe
+			dbprintf(" ");
5d5cbe
+	}
5d5cbe
+	return 1;
5d5cbe
+}
5d5cbe
+
5d5cbe
+int
5d5cbe
+fp_nsec(
5d5cbe
+	void			*obj,
5d5cbe
+	int			bit,
5d5cbe
+	int			count,
5d5cbe
+	char			*fmtstr,
5d5cbe
+	int			size,
5d5cbe
+	int			arg,
5d5cbe
+	int			base,
5d5cbe
+	int			array)
5d5cbe
+{
5d5cbe
+	struct timespec64	tv;
5d5cbe
+	xfs_timestamp_t		*ts;
5d5cbe
+	int			bitpos;
5d5cbe
+	int			i;
5d5cbe
+
5d5cbe
+	ASSERT(bitoffs(bit) == 0);
5d5cbe
+	for (i = 0, bitpos = bit;
5d5cbe
+	     i < count && !seenint();
5d5cbe
+	     i++, bitpos += size) {
5d5cbe
+		if (array)
5d5cbe
+			dbprintf("%d:", i + base);
5d5cbe
+
5d5cbe
+		ts = obj + byteize(bitpos);
5d5cbe
+		tv = libxfs_inode_from_disk_ts(obj, *ts);
5d5cbe
+
5d5cbe
+		dbprintf("%u", tv.tv_nsec);
5d5cbe
+
5d5cbe
 		if (i < count - 1)
5d5cbe
 			dbprintf(" ");
5d5cbe
 	}
5d5cbe
diff --git a/db/fprint.h b/db/fprint.h
5d5cbe
index c958dca..bfeed15 100644
5d5cbe
--- a/db/fprint.h
5d5cbe
+++ b/db/fprint.h
5d5cbe
@@ -15,6 +15,8 @@ extern int	fp_sarray(void *obj, int bit, int count, char *fmtstr, int size,
5d5cbe
 			  int arg, int base, int array);
5d5cbe
 extern int	fp_time(void *obj, int bit, int count, char *fmtstr, int size,
5d5cbe
 			int arg, int base, int array);
5d5cbe
+extern int	fp_nsec(void *obj, int bit, int count, char *fmtstr, int size,
5d5cbe
+			int arg, int base, int array);
5d5cbe
 extern int	fp_uuid(void *obj, int bit, int count, char *fmtstr, int size,
5d5cbe
 			int arg, int base, int array);
5d5cbe
 extern int	fp_crc(void *obj, int bit, int count, char *fmtstr, int size,
5d5cbe
diff --git a/db/inode.c b/db/inode.c
5d5cbe
index b308538..bbfee74 100644
5d5cbe
--- a/db/inode.c
5d5cbe
+++ b/db/inode.c
5d5cbe
@@ -176,10 +176,9 @@ const field_t	inode_v3_flds[] = {
5d5cbe
 };
5d5cbe
 
5d5cbe
 
5d5cbe
-#define	TOFF(f)	bitize(offsetof(struct xfs_legacy_timestamp, t_ ## f))
5d5cbe
 const field_t	timestamp_flds[] = {
5d5cbe
-	{ "sec", FLDT_TIME, OI(TOFF(sec)), C1, 0, TYP_NONE },
5d5cbe
-	{ "nsec", FLDT_NSEC, OI(TOFF(nsec)), C1, 0, TYP_NONE },
5d5cbe
+	{ "sec", FLDT_TIME, OI(0), C1, 0, TYP_NONE },
5d5cbe
+	{ "nsec", FLDT_NSEC, OI(0), C1, 0, TYP_NONE },
5d5cbe
 	{ NULL }
5d5cbe
 };
5d5cbe
 
5d5cbe
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
5d5cbe
index f4f7626..00f367e 100644
5d5cbe
--- a/libxfs/libxfs_api_defs.h
5d5cbe
+++ b/libxfs/libxfs_api_defs.h
5d5cbe
@@ -89,6 +89,7 @@
5d5cbe
 #define xfs_da_get_buf			libxfs_da_get_buf
5d5cbe
 
5d5cbe
 #define xfs_inode_from_disk		libxfs_inode_from_disk
5d5cbe
+#define xfs_inode_from_disk_ts		libxfs_inode_from_disk_ts
5d5cbe
 #define xfs_inode_to_disk		libxfs_inode_to_disk
5d5cbe
 #define xfs_dinode_calc_crc		libxfs_dinode_calc_crc
5d5cbe
 #define xfs_idata_realloc		libxfs_idata_realloc