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