From: Jan Tulak <jtulak@redhat.com>
To: linux-xfs@vger.kernel.org
Cc: sandeen@sandeen.net, Jan Tulak <jtulak@redhat.com>
Subject: [PATCH 2/2] mdrestore: warn about corruption if log is dirty
Date: Tue, 11 Apr 2017 16:12:37 +0200 [thread overview]
Message-ID: <20170411141237.9274-3-jtulak@redhat.com> (raw)
In-Reply-To: <20170411141237.9274-1-jtulak@redhat.com>
A dirty log in an obfuscated dump means that a corruption can happen
when replaying the log (which contains unobfuscated data). Warn the user
about this possibility.
The xlog workaround is copy&paste solution from repair/phase2.c and
other tools, because the function is not implemented in libxlog.
Signed-off-by: Jan Tulak <jtulak@redhat.com>
---
mdrestore/Makefile | 4 +--
mdrestore/xfs_mdrestore.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+), 2 deletions(-)
diff --git a/mdrestore/Makefile b/mdrestore/Makefile
index 5171306..6355df9 100644
--- a/mdrestore/Makefile
+++ b/mdrestore/Makefile
@@ -8,8 +8,8 @@ include $(TOPDIR)/include/builddefs
LTCOMMAND = xfs_mdrestore
CFILES = xfs_mdrestore.c
-LLDLIBS = $(LIBXFS) $(LIBRT) $(LIBPTHREAD) $(LIBUUID)
-LTDEPENDENCIES = $(LIBXFS)
+LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBRT) $(LIBPTHREAD) $(LIBUUID)
+LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG)
LLDFLAGS = -static
default: depend $(LTCOMMAND)
diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c
index 0d399f1..3797955 100644
--- a/mdrestore/xfs_mdrestore.c
+++ b/mdrestore/xfs_mdrestore.c
@@ -17,6 +17,7 @@
*/
#include "libxfs.h"
+#include "libxlog.h"
#include "xfs_metadump.h"
char *progname;
@@ -190,6 +191,87 @@ perform_restore(
free(metablock);
}
+/* workaround craziness in the xlog routines */
+int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p)
+{
+ return 0;
+}
+
+/*
+ * Warn if we just wrote a dump with a dirty log.
+ */
+void
+test_dirty_log(
+ bool is_target_file,
+ char* target_name)
+{
+ struct xfs_sb *sbp;
+ struct xfs_buf *bp;
+ struct xfs_mount xmount;
+ struct xfs_mount *mp;
+ struct xlog xlog;
+ libxfs_init_t x;
+
+ x.isreadonly = LIBXFS_ISREADONLY;
+ if (is_target_file) {
+ x.dname = target_name;
+ x.disfile = true;
+ } else {
+ x.disfile = false;
+ x.volname = target_name;
+ }
+
+ if (!libxfs_init(&x)) {
+ fatal(_("\nfatal error -- couldn't initialize XFS library\n"),
+ strerror(errno));
+ }
+
+ memset(&xmount, 0, sizeof(struct xfs_mount));
+ libxfs_buftarg_init(&xmount, x.ddev, x.logdev, x.rtdev);
+ bp = libxfs_readbuf(xmount.m_ddev_targp, XFS_SB_DADDR,
+ 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL);
+
+ if (!bp || bp->b_error) {
+ fprintf(stderr, _("%s: %s is invalid (cannot read first 512 "
+ "bytes)\n"), progname, target_name);
+ exit(1);
+ }
+
+ /* copy SB from buffer to in-core, converting architecture as we go */
+ libxfs_sb_from_disk(&xmount.m_sb, XFS_BUF_TO_SBP(bp));
+ libxfs_putbuf(bp);
+ libxfs_purgebuf(bp);
+
+ sbp = &xmount.m_sb;
+ mp = libxfs_mount(&xmount, sbp, x.ddev, x.logdev, x.rtdev,
+ LIBXFS_MOUNT_DEBUGGER);
+ if (!mp) {
+ fprintf(stderr,
+ _("%s: restored device %s unusable (not an XFS filesystem?)\n"),
+ progname, target_name);
+ exit(1);
+ }
+
+ switch (xlog_is_dirty(mp, &xlog, &x,0)) {
+ case -1:
+ /* An error occured and we can't read the log. */
+ fprintf(stderr,
+ _("Warning: can't discern a log.\n"));
+ break;
+ case 1:
+ /* The log is dirty, warn. */
+ fprintf(stderr,
+ _("Warning: The log is dirty. If the image was obfuscated, "
+ "an attempt to replay the log may lead to corruption.\n"));
+ break;
+ case 0:
+ /* Everything is ok. */
+ break;
+ }
+
+}
+
+
static void
usage(void)
{
@@ -271,5 +353,7 @@ main(
if (src_f != stdin)
fclose(src_f);
+ test_dirty_log(is_target_file, argv[optind]);
+
return 0;
}
--
2.1.4
next prev parent reply other threads:[~2017-04-11 14:12 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-11 14:12 [PATCH 0/2] xfsprogs: metadump/mdrestore warns about dirty journal Jan Tulak
2017-04-11 14:12 ` [PATCH 1/2] metadump: warn about corruption if log is dirty Jan Tulak
2017-04-11 18:30 ` Brian Foster
2017-04-11 18:34 ` Eric Sandeen
2017-04-11 18:43 ` Brian Foster
2017-04-11 19:01 ` Eric Sandeen
2017-04-11 23:44 ` Darrick J. Wong
2017-04-12 11:03 ` Brian Foster
2017-04-12 11:24 ` Jan Tulak
2017-04-11 14:12 ` Jan Tulak [this message]
2017-04-11 18:33 ` [PATCH 2/2] mdrestore: " Brian Foster
2017-04-11 18:39 ` Eric Sandeen
2017-04-11 18:49 ` Brian Foster
2017-04-11 18:59 ` Eric Sandeen
2017-04-11 22:34 ` Dave Chinner
2017-04-11 23:43 ` Darrick J. Wong
2017-04-12 1:48 ` Eric Sandeen
2017-04-12 11:26 ` Brian Foster
2017-04-12 11:06 ` Brian Foster
2017-04-12 17:45 ` Darrick J. Wong
2017-04-13 8:12 ` Jan Tulak
2017-04-12 11:04 ` Brian Foster
2017-04-13 2:51 ` Dave Chinner
2017-04-13 13:10 ` Brian Foster
2017-04-14 0:29 ` Dave Chinner
2017-04-14 2:54 ` Brian Foster
2017-05-25 17:29 ` [PATCH 0/2] xfsprogs: metadump/mdrestore warns about dirty journal Eric Sandeen
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=20170411141237.9274-3-jtulak@redhat.com \
--to=jtulak@redhat.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
/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.