[PATCH 03/22] xfsprogs: teach logprint about icreate transaction

Dave Chinner
2013-06-12T10:36:52Z

include/libxlog.h | 1 +
logprint/log_misc.c | 36 ++++++++++++++++++++++++++++++++++++
logprint/log_print_all.c | 21 +++++++++++++++++++++
3 files changed, 58 insertions(+)

diff --git a/include/libxlog.h b/include/libxlog.h
index bd71bfe..ff711e9 100644
--- a/include/libxlog.h
+++ b/include/libxlog.h
@@ -51,6 +51,7 @@ struct xlog {
#include <xfs/xfs_buf_item.h>
#include <xfs/xfs_inode_item.h>
#include <xfs/xfs_extfree_item.h>
+#include <xfs/xfs_icreate_item.h>

typedef union {
xlog_rec_header_t hic_header;
diff --git a/logprint/log_misc.c b/logprint/log_misc.c
index 7012208..9526ec4 100644
--- a/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -70,6 +70,7 @@ char *trans_type[] = {
"SWAPEXT",
"SB_COUNT",
"CHECKPOINT",
+ "ICREATE",
};

typedef struct xlog_split_item {
@@ -792,6 +793,35 @@ xlog_print_trans_dquot(xfs_caddr_t *ptr, int len, int *i, int num_ops)
} /* xlog_print_trans_dquot */

+STATIC int
+xlog_print_trans_icreate(
+ xfs_caddr_t *ptr,
+ int len,
+ int *i,
+ int num_ops)
+{
+ struct xfs_icreate_log icl_buf = {0};
+ struct xfs_icreate_log *icl;
+
+ memmove(&icl_buf, *ptr, MIN(sizeof(struct xfs_icreate_log), len));
+ icl = &icl_buf;
+ (*i)++;
+ *ptr += len;
+
+ /* handle complete header only */
+ if (len != sizeof(struct xfs_icreate_log)) {
+ printf(_("ICR: split header, not printing\n"));
+ return 1; /* to skip leftover in next region */
+ }
+
+ printf(_("ICR: #ag: %d agbno: 0x%x len: %d\n"
+ " cnt: %d isize: %d gen: 0x%x\n"),
+ be32_to_cpu(icl->icl_ag), be32_to_cpu(icl->icl_agbno),
+ be32_to_cpu(icl->icl_length), be32_to_cpu(icl->icl_count),
+ be32_to_cpu(icl->icl_isize), be32_to_cpu(icl->icl_gen));
+ return 0;
+}
+
/******************************************************************************
*
* Log print routines
@@ -974,6 +1004,12 @@ xlog_print_record(int fd,
&i, num_ops);
break;
}
+ case XFS_LI_ICREATE: {
+ skip = xlog_print_trans_icreate(&ptr,
+ be32_to_cpu(op_head->oh_len),
+ &i, num_ops);
+ break;
+ }
case XFS_LI_INODE: {
skip = xlog_print_trans_inode(&ptr,
be32_to_cpu(op_head->oh_len),
diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c
index 4626186..7f87016 100644
--- a/logprint/log_print_all.c
+++ b/logprint/log_print_all.c
@@ -435,6 +435,21 @@ xlog_recover_print_efi(
free(f);
}

+STATIC void
+xlog_recover_print_icreate(
+ struct xlog_recover_item *item)
+{
+ struct xfs_icreate_log *icl;
+
+ icl = (struct xfs_icreate_log *)item->ri_buf[0].i_addr;
+
+ printf(_(" ICR: #ag: %d agbno: 0x%x len: %d\n"
+ " cnt: %d isize: %d gen: 0x%x\n"),
+ be32_to_cpu(icl->icl_ag), be32_to_cpu(icl->icl_agbno),
+ be32_to_cpu(icl->icl_length), be32_to_cpu(icl->icl_count),
+ be32_to_cpu(icl->icl_isize), be32_to_cpu(icl->icl_gen));
+}
+
void
xlog_recover_print_logitem(
xlog_recover_item_t *item)
@@ -443,6 +458,9 @@ xlog_recover_print_logitem(
case XFS_LI_BUF:
xlog_recover_print_buffer(item);
break;
+ case XFS_LI_ICREATE:
+ xlog_recover_print_icreate(item);
+ break;
case XFS_LI_INODE:
xlog_recover_print_inode(item);
break;
@@ -474,6 +492,9 @@ xlog_recover_print_item(
case XFS_LI_BUF:
printf("BUF");
break;
+ case XFS_LI_ICREATE:
+ printf("ICR");
+ break;
case XFS_LI_INODE:
printf("INO");
break;