aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-03-08 20:35:23 -0600
committerEric Sandeen <sandeen@redhat.com>2018-03-08 20:35:23 -0600
commitad9ac929a32cc8f09bfab7d4f1c5f13f1fa9adc7 (patch)
tree390c35d9cb9e4d47270a6ae5e69b5dbd9bac8cb3
parente24ee6b654599b5c129994921777cc3d3ad2b420 (diff)
downloadxfsprogs-dev-ad9ac929a32cc8f09bfab7d4f1c5f13f1fa9adc7.tar.gz
xfs_db: print transaction reservation type information
Create a new xfs_db command to print the transaction reservation info for a given filesystem. This will make it easier to compare the calculations made by the kernel and xfsprogs in case there is a discrepancy. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--db/command.c1
-rw-r--r--db/logformat.c59
-rw-r--r--db/logformat.h1
-rw-r--r--libxfs/libxfs_api_defs.h2
-rw-r--r--man/man8/xfs_db.86
5 files changed, 68 insertions, 1 deletions
diff --git a/db/command.c b/db/command.c
index 5ff3c4f0b4..12ae5b781b 100644
--- a/db/command.c
+++ b/db/command.c
@@ -138,6 +138,7 @@ init_commands(void)
hash_init();
inode_init();
input_init();
+ logres_init();
logformat_init();
io_init();
metadump_init();
diff --git a/db/logformat.c b/db/logformat.c
index 70097bc184..b290bd3547 100644
--- a/db/logformat.c
+++ b/db/logformat.c
@@ -147,3 +147,62 @@ logformat_init(void)
add_command(&logformat_cmd);
}
+
+static void
+print_logres(
+ int i,
+ struct xfs_trans_res *res)
+{
+ dbprintf(_("type %d logres %u logcount %d flags 0x%x\n"),
+ i, res->tr_logres, res->tr_logcount, res->tr_logflags);
+}
+
+int
+logres_f(
+ int argc,
+ char **argv)
+{
+ struct xfs_trans_res resv;
+ struct xfs_trans_res *res;
+ struct xfs_trans_res *end_res;
+ int i;
+
+ res = (struct xfs_trans_res *)M_RES(mp);
+ end_res = (struct xfs_trans_res *)(M_RES(mp) + 1);
+ for (i = 0; res < end_res; i++, res++)
+ print_logres(i, res);
+ libxfs_log_get_max_trans_res(mp, &resv);
+ print_logres(-1, &resv);
+
+ return 0;
+}
+
+static void
+logres_help(void)
+{
+ dbprintf(_(
+"\n"
+" The 'logres' command prints information about all log reservation types.\n"
+" This includes the reservation space, the intended transaction roll count,\n"
+" and the reservation flags, if any.\n"
+"\n"
+ ));
+}
+
+static const struct cmdinfo logres_cmd = {
+ .name = "logres",
+ .altname = NULL,
+ .cfunc = logres_f,
+ .argmin = 0,
+ .argmax = 0,
+ .canpush = 0,
+ .args = NULL,
+ .oneline = N_("dump log reservations"),
+ .help = logres_help,
+};
+
+void
+logres_init(void)
+{
+ add_command(&logres_cmd);
+}
diff --git a/db/logformat.h b/db/logformat.h
index f9763ee315..60396c07db 100644
--- a/db/logformat.h
+++ b/db/logformat.h
@@ -17,3 +17,4 @@
*/
void logformat_init(void);
+void logres_init(void);
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index d2ab02a5dc..5d56340c06 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -60,7 +60,7 @@
#define xfs_trans_roll libxfs_trans_roll
#define xfs_trans_get_buf_map libxfs_trans_get_buf_map
#define xfs_trans_resv_calc libxfs_trans_resv_calc
-
+#define xfs_log_get_max_trans_res libxfs_log_get_max_trans_res
#define xfs_attr_get libxfs_attr_get
#define xfs_attr_set libxfs_attr_set
#define xfs_attr_remove libxfs_attr_remove
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index 37018a7a37..524b1ef61a 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -690,6 +690,12 @@ Start logging output to
.IR filename ,
stop logging, or print the current logging status.
.TP
+.B logres
+Print transaction reservation size information for each transaction type.
+This makes it easier to find discrepancies in the reservation calculations
+between xfsprogs and the kernel, which will help when diagnosing minimum
+log size calculation errors.
+.TP
.BI "metadump [\-egow] " filename
Dumps metadata to a file. See
.BR xfs_metadump (8)