Blame SOURCES/xfsprogs-5.10.0-xfs_db-report-bigtime-format-timestamps.patch

5d5cbe
From 344f38a9e5d0f938dae337c8c769853e6368d480 Mon Sep 17 00:00:00 2001
5d5cbe
From: "Darrick J. Wong" <darrick.wong@oracle.com>
5d5cbe
Date: Fri, 20 Nov 2020 17:03:28 -0500
5d5cbe
Subject: [PATCH] xfs_db: report bigtime format timestamps
5d5cbe
5d5cbe
Report the large format timestamps in a human-readable manner if it is
5d5cbe
possible to do so without loss of information.
5d5cbe
5d5cbe
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
5d5cbe
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
5d5cbe
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5d5cbe
---
5d5cbe
5d5cbe
diff --git a/db/fprint.c b/db/fprint.c
5d5cbe
index 72ed55f..65accfd 100644
5d5cbe
--- a/db/fprint.c
5d5cbe
+++ b/db/fprint.c
5d5cbe
@@ -112,6 +112,35 @@ fp_sarray(
5d5cbe
 	return 1;
5d5cbe
 }
5d5cbe
 
5d5cbe
+static void
5d5cbe
+fp_time64(
5d5cbe
+	time64_t		sec)
5d5cbe
+{
5d5cbe
+	time_t			tt = sec;
5d5cbe
+	time64_t		tt_sec = tt;
5d5cbe
+	char			*c;
5d5cbe
+
5d5cbe
+	/*
5d5cbe
+	 * Stupid time_t shenanigans -- POSIX.1-2017 only requires that this
5d5cbe
+	 * type represent a time in seconds.  Since we have no idea if our
5d5cbe
+	 * time64_t filesystem timestamps can actually be represented by the C
5d5cbe
+	 * library, we resort to converting the input value from time64_t to
5d5cbe
+	 * time_t and back to time64_t to check for information loss.  If so,
5d5cbe
+	 * we print the raw value; otherwise we print a human-readable value.
5d5cbe
+	 */
5d5cbe
+	if (tt_sec != sec)
5d5cbe
+		goto raw;
5d5cbe
+
5d5cbe
+	c = ctime(&tt;;
5d5cbe
+	if (!c)
5d5cbe
+		goto raw;
5d5cbe
+
5d5cbe
+	dbprintf("%24.24s", c);
5d5cbe
+	return;
5d5cbe
+raw:
5d5cbe
+	dbprintf("%lld", sec);
5d5cbe
+}
5d5cbe
+
5d5cbe
 int
5d5cbe
 fp_time(
5d5cbe
 	void			*obj,
5d5cbe
@@ -138,7 +167,7 @@ fp_time(
5d5cbe
 		ts = obj + byteize(bitpos);
5d5cbe
 		tv = libxfs_inode_from_disk_ts(obj, *ts);
5d5cbe
 
5d5cbe
-		dbprintf("%24.24s", tv.tv_sec);
5d5cbe
+		fp_time64(tv.tv_sec);
5d5cbe
 
5d5cbe
 		if (i < count - 1)
5d5cbe
 			dbprintf(" ");
5d5cbe
@@ -191,7 +220,8 @@ fp_qtimer(
5d5cbe
 	int			base,
5d5cbe
 	int			array)
5d5cbe
 {
5d5cbe
-	uint32_t		sec;
5d5cbe
+	struct xfs_disk_dquot	*ddq = obj;
5d5cbe
+	time64_t		sec;
5d5cbe
 	__be32			*t;
5d5cbe
 	int			bitpos;
5d5cbe
 	int			i;
5d5cbe
@@ -204,9 +234,16 @@ fp_qtimer(
5d5cbe
 			dbprintf("%d:", i + base);
5d5cbe
 
5d5cbe
 		t = obj + byteize(bitpos);
5d5cbe
-		sec = be32_to_cpu(*t);
5d5cbe
+		sec = libxfs_dquot_from_disk_ts(ddq, *t);
5d5cbe
 
5d5cbe
-		dbprintf("%u", sec);
5d5cbe
+		/*
5d5cbe
+		 * Display the raw value if it's the default grace expiration
5d5cbe
+		 * period (root dquot) or if the quota has not expired.
5d5cbe
+		 */
5d5cbe
+		if (ddq->d_id == 0 || sec == 0)
5d5cbe
+			dbprintf("%lld", sec);
5d5cbe
+		else
5d5cbe
+			fp_time64(sec);
5d5cbe
 
5d5cbe
 		if (i < count - 1)
5d5cbe
 			dbprintf(" ");
5d5cbe
diff --git a/db/inode.c b/db/inode.c
5d5cbe
index bbfee74..37c7dc0 100644
5d5cbe
--- a/db/inode.c
5d5cbe
+++ b/db/inode.c
5d5cbe
@@ -172,10 +172,12 @@ const field_t	inode_v3_flds[] = {
5d5cbe
 	{ "cowextsz", FLDT_UINT1,
5d5cbe
 	  OI(COFF(flags2) + bitsz(uint64_t) - XFS_DIFLAG2_COWEXTSIZE_BIT-1), C1,
5d5cbe
 	  0, TYP_NONE },
5d5cbe
+	{ "bigtime", FLDT_UINT1,
5d5cbe
+	  OI(COFF(flags2) + bitsz(uint64_t) - XFS_DIFLAG2_BIGTIME_BIT - 1), C1,
5d5cbe
+	  0, TYP_NONE },
5d5cbe
 	{ NULL }
5d5cbe
 };
5d5cbe
 
5d5cbe
-
5d5cbe
 const field_t	timestamp_flds[] = {
5d5cbe
 	{ "sec", FLDT_TIME, OI(0), C1, 0, TYP_NONE },
5d5cbe
 	{ "nsec", FLDT_NSEC, OI(0), C1, 0, TYP_NONE },
5d5cbe
diff --git a/db/sb.c b/db/sb.c
5d5cbe
index d63fc71..109fdc3 100644
5d5cbe
--- a/db/sb.c
5d5cbe
+++ b/db/sb.c
5d5cbe
@@ -689,6 +689,8 @@ version_string(
5d5cbe
 		strcat(s, ",REFLINK");
5d5cbe
 	if (xfs_sb_version_hasinobtcounts(sbp))
5d5cbe
 		strcat(s, ",INOBTCNT");
5d5cbe
+	if (xfs_sb_version_hasbigtime(sbp))
5d5cbe
+		strcat(s, ",BIGTIME");
5d5cbe
 	return s;
5d5cbe
 }
5d5cbe