From: Dave Chinner <david@fromorbit.com>
To: xfs@oss.sgi.com
Subject: [PATCH 11/8] xfs_logprint: fix continuation transactions
Date: Wed, 1 May 2013 16:31:37 +1000 [thread overview]
Message-ID: <20130501063136.GL10481@dastard> (raw)
In-Reply-To: <20130430121300.GB10481@dastard>
From: Dave Chinner <dchinner@redhat.com>
As demonstrated by xfs/295, continuation transactions cause of
problems for xfs_logprint. The failure demonstrated by the test is
that the buffer log format structures are variable sized on disk -
the dirty bitmap is sized according to the buffer length, not fixed
to the length of the maximum supported buffer size.
xfs_logprint assumes that the buf log format reocrds are of fixed
size, and so when a short buffer is found it fails to handle it
properly and treats it like a continuation record. This causses the
opheader pointer to be incremented incorrectly and then logprint
wanders off into a dark corner and gets eaten by a grue.
While fixing this, make the xlog_print_record code that does the
transaction opheader walking a little easier to read and stop it
from outputting binary data direct to the console by converting the
no-data-print case to use a hex dumping loop.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
logprint/log_misc.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/logprint/log_misc.c b/logprint/log_misc.c
index 30b7ea6..d08f900 100644
--- a/logprint/log_misc.c
+++ b/logprint/log_misc.c
@@ -268,7 +268,13 @@ xlog_print_trans_buffer(xfs_caddr_t *ptr, int len, int *i, int num_ops)
blen = f->blf_len;
map_size = f->blf_map_size;
flags = f->blf_flags;
- struct_size = sizeof(xfs_buf_log_format_t);
+
+ /*
+ * size of the format header is dependent on the size of the bitmap, not
+ * the size of the in-memory structure. Hence the slightly obtuse
+ * calculation.
+ */
+ struct_size = offsetof(struct xfs_buf_log_format, blf_map_size) + map_size;
if (len >= struct_size) {
ASSERT((len - sizeof(struct_size)) % sizeof(int) == 0);
@@ -933,22 +939,28 @@ xlog_print_record(int fd,
continued = ((op_head->oh_flags & XLOG_WAS_CONT_TRANS) ||
(op_head->oh_flags & XLOG_CONTINUE_TRANS));
- /* print transaction data */
- if (print_no_data ||
- (continued && be32_to_cpu(op_head->oh_len) == 0)) {
+ if (continued && be32_to_cpu(op_head->oh_len) == 0)
+ continue;
+
+ if (print_no_data) {
for (n = 0; n < be32_to_cpu(op_head->oh_len); n++) {
- printf("%c", *ptr);
+ printf("0x%02x ", (unsigned int)*ptr);
+ if (n % 16 == 15)
+ printf("\n");
ptr++;
}
printf("\n");
continue;
}
+
+ /* print transaction data */
if (xlog_print_find_tid(be32_to_cpu(op_head->oh_tid),
op_head->oh_flags & XLOG_WAS_CONT_TRANS)) {
printf(_("Left over region from split log item\n"));
ptr += be32_to_cpu(op_head->oh_len);
continue;
}
+
if (be32_to_cpu(op_head->oh_len) != 0) {
if (*(uint *)ptr == XFS_TRANS_HEADER_MAGIC) {
skip = xlog_print_trans_header(&ptr,
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2013-05-01 6:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20130430121300.GB10481@dastard>
2013-05-01 0:17 ` [PATCH 9/8] libxlog: fix log buffer alignment Dave Chinner
2013-05-09 15:07 ` Mark Tinguely
2013-05-01 6:30 ` [PATCH 10/8] xfsdb: re-instate DA btree node headers Dave Chinner
2013-05-09 15:23 ` Mark Tinguely
2013-05-09 16:21 ` Mark Tinguely
2013-05-01 6:31 ` Dave Chinner [this message]
2013-05-09 14:59 ` [PATCH 11/8] xfs_logprint: fix continuation transactions Mark Tinguely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130501063136.GL10481@dastard \
--to=david@fromorbit.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.