Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
No build reason found for SLE-Module-Public-Cloud:s390x
SUSE:SLE-12-SP1:GA
xfsprogs.970
0001-libxlog-add-xlog_is_empty-helper.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-libxlog-add-xlog_is_empty-helper.patch of Package xfsprogs.970
From 7ac353a9b3ed56b85d20aee60638a8285248ad9c Mon Sep 17 00:00:00 2001 From: Eric Sandeen <sandeen@sandeen.net> Date: Wed, 29 Jul 2015 09:04:35 +1000 Subject: [PATCH 01/20] libxlog: add xlog_is_empty() helper References: bsc#939367 CVE-2012-2150 xfs_repair and xfs_db both check for a dirty log, using roughly the same cut and pasted code. Add a new helper to do this, xlog_is_dirty(), and use it instead. Note, the helper (and the code before it) is a little odd in that it (re-)initializes some libxfs_init_t members before proceeding, I haven't yet worked out if that's necessary or correct, so I've just kept the same behavior for now. Still, it seems like this should be done in libxfs_init, or not at all. Signed-off-by: Eric Sandeen <sandeen@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> Acked-by: Jan Kara <jack@suse.com> --- db/sb.c | 25 ++++++------------------- include/libxlog.h | 2 ++ libxlog/util.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/db/sb.c b/db/sb.c index 974abd247333..f0c21456645b 100644 --- a/db/sb.c +++ b/db/sb.c @@ -225,8 +225,7 @@ int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p) int sb_logcheck(void) { - struct xlog log; - xfs_daddr_t head_blk, tail_blk; + int dirty; if (mp->m_sb.sb_logstart) { if (x.logdev && x.logdev != x.ddev) { @@ -242,26 +241,13 @@ sb_logcheck(void) } } - memset(&log, 0, sizeof(log)); libxfs_buftarg_init(mp, x.ddev, x.logdev, x.rtdev); - x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); - x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); - x.lbsize = BBSIZE; - if (xfs_sb_version_hassector(&mp->m_sb)) - x.lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT); - - log.l_dev = mp->m_logdev_targp; - log.l_logsize = BBTOB(log.l_logBBsize); - log.l_logBBsize = x.logBBsize; - log.l_logBBstart = x.logBBstart; - log.l_sectBBsize = BTOBB(x.lbsize); - log.l_mp = mp; - - if (xlog_find_tail(&log, &head_blk, &tail_blk)) { + + dirty = xlog_is_dirty(mp, &x, 0); + if (dirty == -1) { dbprintf(_("ERROR: cannot find log head/tail, run xfs_repair\n")); return 0; - } - if (head_blk != tail_blk) { + } else if (dirty == 1) { dbprintf(_( "ERROR: The filesystem has valuable metadata changes in a log which needs to\n" "be replayed. Mount the filesystem to replay the log, and unmount it before\n" @@ -271,6 +257,7 @@ sb_logcheck(void) "of the filesystem before doing this.\n"), progname); return 0; } + /* Log is clean */ return 1; } diff --git a/include/libxlog.h b/include/libxlog.h index a61e437e67a6..d2a33c1bf026 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -78,6 +78,8 @@ extern int print_record_header; /* libxfs parameters */ extern libxfs_init_t x; + +extern int xlog_is_dirty(xfs_mount_t *mp, libxfs_init_t *x, int verbose); extern struct xfs_buf *xlog_get_bp(struct xlog *, int); extern void xlog_put_bp(struct xfs_buf *); extern int xlog_bread(struct xlog *log, xfs_daddr_t blk_no, int nbblks, diff --git a/libxlog/util.c b/libxlog/util.c index 949b79d6cebc..edb23a8eb974 100644 --- a/libxlog/util.c +++ b/libxlog/util.c @@ -23,6 +23,62 @@ int print_skip_uuid; int print_record_header; libxfs_init_t x; +/* + * Return 1 for dirty, 0 for clean, -1 for errors + */ +int +xlog_is_dirty( + xfs_mount_t *mp, + libxfs_init_t *x, + int verbose) +{ + int error; + struct xlog log; + xfs_daddr_t head_blk, tail_blk; + + memset(&log, 0, sizeof(log)); + + /* We (re-)init members of libxfs_init_t here? really? */ + x->logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); + x->logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); + x->lbsize = BBSIZE; + if (xfs_sb_version_hassector(&mp->m_sb)) + x->lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT); + + log.l_dev = mp->m_logdev_targp; + log.l_logBBsize = x->logBBsize; + log.l_logBBstart = x->logBBstart; + log.l_sectBBsize = BTOBB(x->lbsize); + log.l_mp = mp; + if (xfs_sb_version_hassector(&mp->m_sb)) { + log.l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; + ASSERT(log.l_sectbb_log <= mp->m_sectbb_log); + /* for larger sector sizes, must have v2 or external log */ + ASSERT(log.l_sectbb_log == 0 || + log.l_logBBstart == 0 || + xfs_sb_version_haslogv2(&mp->m_sb)); + ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT); + } + log.l_sectbb_mask = (1 << log.l_sectbb_log) - 1; + + if ((error = xlog_find_tail(&log, &head_blk, &tail_blk))) { + xlog_warn(_("%s: cannot find log head/tail " + "(xlog_find_tail=%d)\n"), + __func__, error); + return -1; + } + + if (verbose) + xlog_warn( + _("%s: head block %" PRId64 " tail block %" PRId64 "\n"), + __func__, head_blk, tail_blk); + + if (head_blk != tail_blk) + return 1; + + return 0; +} + static int header_check_uuid(xfs_mount_t *mp, xlog_rec_header_t *head) { -- 2.1.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor