Move the functions that handle EFI items into a separate file to
avoid cluttering up log_misc.c even more when we start adding the
other redo item types.
Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
---
logprint/Makefile | 2
logprint/log_misc.c | 144 -----------------------------
logprint/log_print_all.c | 60 ------------
logprint/log_redo.c | 226 ++++++++++++++++++++++++++++++++++++++++++++++
logprint/logprint.h | 6 +
5 files changed, 232 insertions(+), 206 deletions(-)
create mode 100644 logprint/log_redo.c
diff --git a/logprint/Makefile b/logprint/Makefile
index 7bcf27f..534bf5b 100644
--- a/logprint/Makefile
+++ b/logprint/Makefile
@@ -10,7 +10,7 @@ LTCOMMAND = xfs_logprint
HFILES = logprint.h
CFILES = logprint.c \
log_copy.c log_dump.c log_misc.c \
- log_print_all.c log_print_trans.c
+ log_print_all.c log_print_trans.c log_redo.c
LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD)
LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG)
diff --git a/logprint/log_misc.c b/logprint/log_misc.c
index e6ee832..57d397c 100644
--- a/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -475,100 +475,6 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int
num_ops)
int
-xlog_print_trans_efd(char **ptr, uint len)
-{
- xfs_efd_log_format_t *f;
- xfs_efd_log_format_t lbuf;
- /* size without extents at end */
- uint core_size = sizeof(xfs_efd_log_format_t) - sizeof(xfs_extent_t);
-
- /*
- * memmove to ensure 8-byte alignment for the long longs in
- * xfs_efd_log_format_t structure
- */
- memmove(&lbuf, *ptr, MIN(core_size, len));
- f = &lbuf;
- *ptr += len;
- if (len >= core_size) {
- printf(_("EFD: #regs: %d num_extents: %d id: 0x%llx\n"),
- f->efd_size, f->efd_nextents, (unsigned long long)f->efd_efi_id);
-
- /* don't print extents as they are not used */
-
- return 0;
- } else {
- printf(_("EFD: Not enough data to decode further\n"));
- return 1;
- }
-} /* xlog_print_trans_efd */
-
-
-int
-xlog_print_trans_efi(
- char **ptr,
- uint src_len,
- int continued)
-{
- xfs_efi_log_format_t *src_f, *f = NULL;
- uint dst_len;
- xfs_extent_t *ex;
- int i;
- int error = 0;
- int core_size = offsetof(xfs_efi_log_format_t,
efi_extents);
-
- /*
- * memmove to ensure 8-byte alignment for the long longs in
- * xfs_efi_log_format_t structure
- */
- if ((src_f = (xfs_efi_log_format_t *)malloc(src_len)) == NULL) {
- fprintf(stderr, _("%s: xlog_print_trans_efi: malloc failed\n"),
progname);
- exit(1);
- }
- memmove((char*)src_f, *ptr, src_len);
- *ptr += src_len;
-
- /* convert to native format */
- dst_len = sizeof(xfs_efi_log_format_t) + (src_f->efi_nextents - 1) *
sizeof(xfs_extent_t);
-
- if (continued && src_len < core_size) {
- printf(_("EFI: Not enough data to decode further\n"));
- error = 1;
- goto error;
- }
-
- if ((f = (xfs_efi_log_format_t *)malloc(dst_len)) == NULL) {
- fprintf(stderr, _("%s: xlog_print_trans_efi: malloc failed\n"),
progname);
- exit(1);
- }
- if (xfs_efi_copy_format((char*)src_f, src_len, f, continued)) {
- error = 1;
- goto error;
- }
-
- printf(_("EFI: #regs: %d num_extents: %d id: 0x%llx\n"),
- f->efi_size, f->efi_nextents, (unsigned long long)f->efi_id);
-
- if (continued) {
- printf(_("EFI free extent data skipped (CONTINUE set, no space)\n"));
- goto error;
- }
-
- ex = f->efi_extents;
- for (i=0; i < f->efi_nextents; i++) {
- printf("(s: 0x%llx, l: %d) ",
- (unsigned long long)ex->ext_start, ex->ext_len);
- if (i % 4 == 3) printf("\n");
- ex++;
- }
- if (i % 4 != 0) printf("\n");
-error:
- free(src_f);
- free(f);
- return error;
-} /* xlog_print_trans_efi */
-
-
-int
xlog_print_trans_qoff(char **ptr, uint len)
{
xfs_qoff_logformat_t *f;
@@ -1617,53 +1523,3 @@ xfs_inode_item_format_convert(char *src_buf, uint len,
xfs_inode_log_format_t *i
}
return in_f;
}
-
-int
-xfs_efi_copy_format(
- char *buf,
- uint len,
- struct xfs_efi_log_format *dst_efi_fmt,
- int continued)
-{
- uint i;
- uint nextents = ((xfs_efi_log_format_t *)buf)->efi_nextents;
- uint dst_len = sizeof(xfs_efi_log_format_t) + (nextents - 1) *
sizeof(xfs_extent_t);
- uint len32 = sizeof(xfs_efi_log_format_32_t) + (nextents - 1) *
sizeof(xfs_extent_32_t);
- uint len64 = sizeof(xfs_efi_log_format_64_t) + (nextents - 1) *
sizeof(xfs_extent_64_t);
-
- if (len == dst_len || continued) {
- memcpy((char *)dst_efi_fmt, buf, len);
- return 0;
- } else if (len == len32) {
- xfs_efi_log_format_32_t *src_efi_fmt_32 =
(xfs_efi_log_format_32_t *)buf;
-
- dst_efi_fmt->efi_type = src_efi_fmt_32->efi_type;
- dst_efi_fmt->efi_size = src_efi_fmt_32->efi_size;
- dst_efi_fmt->efi_nextents = src_efi_fmt_32->efi_nextents;
- dst_efi_fmt->efi_id = src_efi_fmt_32->efi_id;
- for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
- dst_efi_fmt->efi_extents[i].ext_start =
- src_efi_fmt_32->efi_extents[i].ext_start;
- dst_efi_fmt->efi_extents[i].ext_len =
- src_efi_fmt_32->efi_extents[i].ext_len;
- }
- return 0;
- } else if (len == len64) {
- xfs_efi_log_format_64_t *src_efi_fmt_64 =
(xfs_efi_log_format_64_t *)buf;
-
- dst_efi_fmt->efi_type = src_efi_fmt_64->efi_type;
- dst_efi_fmt->efi_size = src_efi_fmt_64->efi_size;
- dst_efi_fmt->efi_nextents = src_efi_fmt_64->efi_nextents;
- dst_efi_fmt->efi_id = src_efi_fmt_64->efi_id;
- for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
- dst_efi_fmt->efi_extents[i].ext_start =
- src_efi_fmt_64->efi_extents[i].ext_start;
- dst_efi_fmt->efi_extents[i].ext_len =
- src_efi_fmt_64->efi_extents[i].ext_len;
- }
- return 0;
- }
- fprintf(stderr, _("%s: bad size of efi format: %u; expected %u or %u;
nextents = %u\n"),
- progname, len, len32, len64, nextents);
- return 1;
-}
diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c
index f95f4aa..4d92c3b 100644
--- a/logprint/log_print_all.c
+++ b/logprint/log_print_all.c
@@ -372,66 +372,6 @@ xlog_recover_print_inode(
}
}
-STATIC void
-xlog_recover_print_efd(
- xlog_recover_item_t *item)
-{
- xfs_efd_log_format_t *f;
-
- f = (xfs_efd_log_format_t *)item->ri_buf[0].i_addr;
- /*
- * An xfs_efd_log_format structure contains a variable length array
- * as the last field.
- * Each element is of size xfs_extent_32_t or xfs_extent_64_t.
- * However, the extents are never used and won't be printed.
- */
- printf(_(" EFD: #regs: %d num_extents: %d id: 0x%llx\n"),
- f->efd_size, f->efd_nextents, (unsigned long long)f->efd_efi_id);
-}
-
-
-STATIC void
-xlog_recover_print_efi(
- xlog_recover_item_t *item)
-{
- xfs_efi_log_format_t *f, *src_f;
- xfs_extent_t *ex;
- int i;
- uint src_len, dst_len;
-
- src_f = (xfs_efi_log_format_t *)item->ri_buf[0].i_addr;
- src_len = item->ri_buf[0].i_len;
- /*
- * An xfs_efi_log_format structure contains a variable length array
- * as the last field.
- * Each element is of size xfs_extent_32_t or xfs_extent_64_t.
- * Need to convert to native format.
- */
- dst_len = sizeof(xfs_efi_log_format_t) + (src_f->efi_nextents - 1) *
sizeof(xfs_extent_t);
- if ((f = (xfs_efi_log_format_t *)malloc(dst_len)) == NULL) {
- fprintf(stderr, _("%s: xlog_recover_print_efi: malloc failed\n"),
progname);
- exit(1);
- }
- if (xfs_efi_copy_format((char*)src_f, src_len, f, 0)) {
- free(f);
- return;
- }
-
- printf(_(" EFI: #regs:%d num_extents:%d id:0x%llx\n"),
- f->efi_size, f->efi_nextents, (unsigned long long)f->efi_id);
- ex = f->efi_extents;
- printf(" ");
- for (i=0; i< f->efi_nextents; i++) {
- printf("(s: 0x%llx, l: %d) ",
- (unsigned long long)ex->ext_start, ex->ext_len);
- if (i % 4 == 3)
- printf("\n");
- ex++;
- }
- if (i % 4 != 0)
- printf("\n");
- free(f);
-}
STATIC void
xlog_recover_print_icreate(
diff --git a/logprint/log_redo.c b/logprint/log_redo.c
new file mode 100644
index 0000000..a9608f0
--- /dev/null
+++ b/logprint/log_redo.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
+ * Copyright (c) 2016 Oracle, Inc.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libxfs.h"
+#include "libxlog.h"
+
+#include "logprint.h"
+
+/* Extent Free Items */
+
+int
+xfs_efi_copy_format(
+ char *buf,
+ uint len,
+ struct xfs_efi_log_format *dst_efi_fmt,
+ int continued)
+{
+ uint i;
+ uint nextents = ((xfs_efi_log_format_t *)buf)->efi_nextents;
+ uint dst_len = sizeof(xfs_efi_log_format_t) + (nextents - 1) *
sizeof(xfs_extent_t);
+ uint len32 = sizeof(xfs_efi_log_format_32_t) + (nextents - 1) *
sizeof(xfs_extent_32_t);
+ uint len64 = sizeof(xfs_efi_log_format_64_t) + (nextents - 1) *
sizeof(xfs_extent_64_t);
+
+ if (len == dst_len || continued) {
+ memcpy((char *)dst_efi_fmt, buf, len);
+ return 0;
+ } else if (len == len32) {
+ xfs_efi_log_format_32_t *src_efi_fmt_32 =
(xfs_efi_log_format_32_t *)buf;
+
+ dst_efi_fmt->efi_type = src_efi_fmt_32->efi_type;
+ dst_efi_fmt->efi_size = src_efi_fmt_32->efi_size;
+ dst_efi_fmt->efi_nextents = src_efi_fmt_32->efi_nextents;
+ dst_efi_fmt->efi_id = src_efi_fmt_32->efi_id;
+ for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
+ dst_efi_fmt->efi_extents[i].ext_start =
+ src_efi_fmt_32->efi_extents[i].ext_start;
+ dst_efi_fmt->efi_extents[i].ext_len =
+ src_efi_fmt_32->efi_extents[i].ext_len;
+ }
+ return 0;
+ } else if (len == len64) {
+ xfs_efi_log_format_64_t *src_efi_fmt_64 =
(xfs_efi_log_format_64_t *)buf;
+
+ dst_efi_fmt->efi_type = src_efi_fmt_64->efi_type;
+ dst_efi_fmt->efi_size = src_efi_fmt_64->efi_size;
+ dst_efi_fmt->efi_nextents = src_efi_fmt_64->efi_nextents;
+ dst_efi_fmt->efi_id = src_efi_fmt_64->efi_id;
+ for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
+ dst_efi_fmt->efi_extents[i].ext_start =
+ src_efi_fmt_64->efi_extents[i].ext_start;
+ dst_efi_fmt->efi_extents[i].ext_len =
+ src_efi_fmt_64->efi_extents[i].ext_len;
+ }
+ return 0;
+ }
+ fprintf(stderr, _("%s: bad size of efi format: %u; expected %u or %u;
nextents = %u\n"),
+ progname, len, len32, len64, nextents);
+ return 1;
+}
+
+int
+xlog_print_trans_efi(
+ char **ptr,
+ uint src_len,
+ int continued)
+{
+ xfs_efi_log_format_t *src_f, *f = NULL;
+ uint dst_len;
+ xfs_extent_t *ex;
+ int i;
+ int error = 0;
+ int core_size = offsetof(xfs_efi_log_format_t,
efi_extents);
+
+ /*
+ * memmove to ensure 8-byte alignment for the long longs in
+ * xfs_efi_log_format_t structure
+ */
+ if ((src_f = (xfs_efi_log_format_t *)malloc(src_len)) == NULL) {
+ fprintf(stderr, _("%s: xlog_print_trans_efi: malloc failed\n"),
progname);
+ exit(1);
+ }
+ memmove((char*)src_f, *ptr, src_len);
+ *ptr += src_len;
+
+ /* convert to native format */
+ dst_len = sizeof(xfs_efi_log_format_t) + (src_f->efi_nextents - 1) *
sizeof(xfs_extent_t);
+
+ if (continued && src_len < core_size) {
+ printf(_("EFI: Not enough data to decode further\n"));
+ error = 1;
+ goto error;
+ }
+
+ if ((f = (xfs_efi_log_format_t *)malloc(dst_len)) == NULL) {
+ fprintf(stderr, _("%s: xlog_print_trans_efi: malloc failed\n"),
progname);
+ exit(1);
+ }
+ if (xfs_efi_copy_format((char*)src_f, src_len, f, continued)) {
+ error = 1;
+ goto error;
+ }
+
+ printf(_("EFI: #regs: %d num_extents: %d id: 0x%llx\n"),
+ f->efi_size, f->efi_nextents, (unsigned long long)f->efi_id);
+
+ if (continued) {
+ printf(_("EFI free extent data skipped (CONTINUE set, no space)\n"));
+ goto error;
+ }
+
+ ex = f->efi_extents;
+ for (i=0; i < f->efi_nextents; i++) {
+ printf("(s: 0x%llx, l: %d) ",
+ (unsigned long long)ex->ext_start, ex->ext_len);
+ if (i % 4 == 3) printf("\n");
+ ex++;
+ }
+ if (i % 4 != 0) printf("\n");
+error:
+ free(src_f);
+ free(f);
+ return error;
+} /* xlog_print_trans_efi */
+
+void
+xlog_recover_print_efi(
+ xlog_recover_item_t *item)
+{
+ xfs_efi_log_format_t *f, *src_f;
+ xfs_extent_t *ex;
+ int i;
+ uint src_len, dst_len;
+
+ src_f = (xfs_efi_log_format_t *)item->ri_buf[0].i_addr;
+ src_len = item->ri_buf[0].i_len;
+ /*
+ * An xfs_efi_log_format structure contains a variable length array
+ * as the last field.
+ * Each element is of size xfs_extent_32_t or xfs_extent_64_t.
+ * Need to convert to native format.
+ */
+ dst_len = sizeof(xfs_efi_log_format_t) + (src_f->efi_nextents - 1) *
sizeof(xfs_extent_t);
+ if ((f = (xfs_efi_log_format_t *)malloc(dst_len)) == NULL) {
+ fprintf(stderr, _("%s: xlog_recover_print_efi: malloc failed\n"),
progname);
+ exit(1);
+ }
+ if (xfs_efi_copy_format((char*)src_f, src_len, f, 0)) {
+ free(f);
+ return;
+ }
+
+ printf(_(" EFI: #regs:%d num_extents:%d id:0x%llx\n"),
+ f->efi_size, f->efi_nextents, (unsigned long long)f->efi_id);
+ ex = f->efi_extents;
+ printf(" ");
+ for (i=0; i< f->efi_nextents; i++) {
+ printf("(s: 0x%llx, l: %d) ",
+ (unsigned long long)ex->ext_start, ex->ext_len);
+ if (i % 4 == 3)
+ printf("\n");
+ ex++;
+ }
+ if (i % 4 != 0)
+ printf("\n");
+ free(f);
+}
+
+int
+xlog_print_trans_efd(char **ptr, uint len)
+{
+ xfs_efd_log_format_t *f;
+ xfs_efd_log_format_t lbuf;
+ /* size without extents at end */
+ uint core_size = sizeof(xfs_efd_log_format_t) - sizeof(xfs_extent_t);
+
+ /*
+ * memmove to ensure 8-byte alignment for the long longs in
+ * xfs_efd_log_format_t structure
+ */
+ memmove(&lbuf, *ptr, MIN(core_size, len));
+ f = &lbuf;
+ *ptr += len;
+ if (len >= core_size) {
+ printf(_("EFD: #regs: %d num_extents: %d id: 0x%llx\n"),
+ f->efd_size, f->efd_nextents, (unsigned long long)f->efd_efi_id);
+
+ /* don't print extents as they are not used */
+
+ return 0;
+ } else {
+ printf(_("EFD: Not enough data to decode further\n"));
+ return 1;
+ }
+} /* xlog_print_trans_efd */
+
+void
+xlog_recover_print_efd(
+ xlog_recover_item_t *item)
+{
+ xfs_efd_log_format_t *f;
+
+ f = (xfs_efd_log_format_t *)item->ri_buf[0].i_addr;
+ /*
+ * An xfs_efd_log_format structure contains a variable length array
+ * as the last field.
+ * Each element is of size xfs_extent_32_t or xfs_extent_64_t.
+ * However, the extents are never used and won't be printed.
+ */
+ printf(_(" EFD: #regs: %d num_extents: %d id: 0x%llx\n"),
+ f->efd_size, f->efd_nextents, (unsigned long long)f->efd_efi_id);
+}
diff --git a/logprint/logprint.h b/logprint/logprint.h
index 018af81..517e852 100644
--- a/logprint/logprint.h
+++ b/logprint/logprint.h
@@ -45,6 +45,10 @@ extern void print_stars(void);
extern xfs_inode_log_format_t *
xfs_inode_item_format_convert(char *, uint, xfs_inode_log_format_t *);
-extern int xfs_efi_copy_format(char *, uint, xfs_efi_log_format_t *, int);
+
+extern int xlog_print_trans_efi(char **ptr, uint src_len, int continued);
+extern void xlog_recover_print_efi(xlog_recover_item_t *item);
+extern int xlog_print_trans_efd(char **ptr, uint len);
+extern void xlog_recover_print_efd(xlog_recover_item_t *item);
#endif /* LOGPRINT_H */
|