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