Hello community,

here is the log from the commit of package xfsprogs for openSUSE:Factory 
checked in at 2015-08-05 06:48:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xfsprogs (Old)
 and      /work/SRC/openSUSE:Factory/.xfsprogs.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xfsprogs"

Changes:
--------
--- /work/SRC/openSUSE:Factory/xfsprogs/xfsprogs.changes        2015-07-16 
17:16:11.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.xfsprogs.new/xfsprogs.changes   2015-08-05 
06:48:48.000000000 +0200
@@ -1,0 +2,6 @@
+Fri Jul 31 10:21:06 UTC 2015 - [email protected]
+
+- Update to 3.2.4
+  * properly obfuscate images created by xfs_metadump
+
+-------------------------------------------------------------------

Old:
----
  xfsprogs-3.2.3.tar.gz
  xfsprogs-3.2.3.tar.gz.sig

New:
----
  xfsprogs-3.2.4.tar.gz
  xfsprogs-3.2.4.tar.gz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xfsprogs.spec ++++++
--- /var/tmp/diff_new_pack.XvHyfP/_old  2015-08-05 06:48:49.000000000 +0200
+++ /var/tmp/diff_new_pack.XvHyfP/_new  2015-08-05 06:48:49.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           xfsprogs
-Version:        3.2.3
+Version:        3.2.4
 Release:        0
 Summary:        Utilities for managing the XFS file system
 License:        GPL-2.0+

++++++ xfsprogs-3.2.3.tar.gz -> xfsprogs-3.2.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/VERSION new/xfsprogs-3.2.4/VERSION
--- old/xfsprogs-3.2.3/VERSION  2015-06-10 02:10:43.000000000 +0200
+++ new/xfsprogs-3.2.4/VERSION  2015-07-30 01:21:08.000000000 +0200
@@ -3,5 +3,5 @@
 #
 PKG_MAJOR=3
 PKG_MINOR=2
-PKG_REVISION=3
+PKG_REVISION=4
 PKG_BUILD=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/config.sub 
new/xfsprogs-3.2.4/config.sub
--- old/xfsprogs-3.2.3/config.sub       2015-06-10 02:12:38.000000000 +0200
+++ new/xfsprogs-3.2.4/config.sub       2015-07-30 01:58:49.000000000 +0200
@@ -2,7 +2,7 @@
 # Configuration validation subroutine script.
 #   Copyright 1992-2014 Free Software Foundation, Inc.
 
-timestamp='2014-05-01'
+timestamp='2014-09-11'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -302,6 +302,7 @@
        | pdp10 | pdp11 | pj | pjl \
        | powerpc | powerpc64 | powerpc64le | powerpcle \
        | pyramid \
+       | riscv32 | riscv64 \
        | rl78 | rx \
        | score \
        | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | 
shbe | shle | sh[1234]le | sh3ele \
@@ -828,6 +829,10 @@
                basic_machine=powerpc-unknown
                os=-morphos
                ;;
+       moxiebox)
+               basic_machine=moxie-unknown
+               os=-moxiebox
+               ;;
        msdos)
                basic_machine=i386-pc
                os=-msdos
@@ -1373,7 +1378,7 @@
              | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* 
\
              | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
              | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
              | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/db/metadump.c 
new/xfsprogs-3.2.4/db/metadump.c
--- old/xfsprogs-3.2.3/db/metadump.c    2015-06-10 02:08:50.000000000 +0200
+++ new/xfsprogs-3.2.4/db/metadump.c    2015-07-30 01:21:08.000000000 +0200
@@ -17,6 +17,7 @@
  */
 
 #include <libxfs.h>
+#include <libxlog.h>
 #include "bmap.h"
 #include "command.h"
 #include "metadump.h"
@@ -56,7 +57,7 @@
 
 static const cmdinfo_t metadump_cmd =
        { "metadump", NULL, metadump_f, 0, -1, 0,
-               N_("[-e] [-g] [-m max_extent] [-w] [-o] filename"),
+               N_("[-a] [-e] [-g] [-m max_extent] [-w] [-o] filename"),
                N_("dump metadata to a file"), metadump_help };
 
 static FILE            *outf;          /* metadump file */
@@ -73,7 +74,8 @@
 static int             show_progress = 0;
 static int             stop_on_read_error = 0;
 static int             max_extent_size = DEFAULT_MAX_EXT_SIZE;
-static int             dont_obfuscate = 0;
+static int             obfuscate = 1;
+static int             zero_stale_data = 1;
 static int             show_warnings = 0;
 static int             progress_since_warning = 0;
 
@@ -92,6 +94,7 @@
 " for compressing and sending to an XFS maintainer for corruption analysis \n"
 " or xfs_repair failures.\n\n"
 " Options:\n"
+"   -a -- Copy full metadata blocks without zeroing unused space\n"
 "   -e -- Ignore read errors and keep going\n"
 "   -g -- Display dump progress\n"
 "   -m -- Specify max extent size in blocks to copy (default = %d blocks)\n"
@@ -242,6 +245,124 @@
        return seenint() ? -EINTR : 0;
 }
 
+static void
+zero_btree_node(
+       struct xfs_btree_block  *block,
+       typnm_t                 btype)
+{
+       int                     nrecs;
+       xfs_bmbt_ptr_t          *bpp;
+       xfs_bmbt_key_t          *bkp;
+       xfs_inobt_ptr_t         *ipp;
+       xfs_inobt_key_t         *ikp;
+       xfs_alloc_ptr_t         *app;
+       xfs_alloc_key_t         *akp;
+       void                    *zp1, *zp2;
+       int                     zlen1, zlen2;
+
+       nrecs = be16_to_cpu(block->bb_numrecs);
+
+       switch (btype) {
+       case TYP_BMAPBTA:
+       case TYP_BMAPBTD:
+               bkp = XFS_BMBT_KEY_ADDR(mp, block, 1);
+               bpp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]);
+               zp1 = &bkp[nrecs];
+               zlen1 = (char *)&bpp[0] - (char *)&bkp[nrecs];
+               zp2 = &bpp[nrecs];
+               zlen2 = (char *)block + mp->m_sb.sb_blocksize -
+                                                       (char *)&bpp[nrecs];
+               break;
+       case TYP_INOBT:
+       case TYP_FINOBT:
+               ikp = XFS_INOBT_KEY_ADDR(mp, block, 1);
+               ipp = XFS_INOBT_PTR_ADDR(mp, block, 1, mp->m_inobt_mxr[1]);
+               zp1 = &ikp[nrecs];
+               zlen1 = (char *)&ipp[0] - (char *)&ikp[nrecs];
+               zp2 = &ipp[nrecs];
+               zlen2 = (char *)block + mp->m_sb.sb_blocksize -
+                                                       (char *)&ipp[nrecs];
+               break;
+       case TYP_BNOBT:
+       case TYP_CNTBT:
+               akp = XFS_ALLOC_KEY_ADDR(mp, block, 1);
+               app = XFS_ALLOC_PTR_ADDR(mp, block, 1, mp->m_alloc_mxr[1]);
+               zp1 = &akp[nrecs];
+               zlen1 = (char *)&app[0] - (char *)&akp[nrecs];
+               zp2 = &app[nrecs];
+               zlen2 = (char *)block + mp->m_sb.sb_blocksize -
+                                                       (char *)&app[nrecs];
+               break;
+       default:
+               zp1 = NULL;
+               break;
+       }
+
+       if (zp1 && zp2) {
+               /* Zero from end of keys to beginning of pointers */
+               memset(zp1, 0, zlen1);
+               /* Zero from end of pointers to end of block */
+               memset(zp2, 0, zlen2);
+       }
+}
+
+static void
+zero_btree_leaf(
+       struct xfs_btree_block  *block,
+       typnm_t                 btype)
+{
+       int                     nrecs;
+       struct xfs_bmbt_rec     *brp;
+       struct xfs_inobt_rec    *irp;
+       struct xfs_alloc_rec    *arp;
+       void                    *zp;
+       int                     zlen;
+
+       nrecs = be16_to_cpu(block->bb_numrecs);
+
+       switch (btype) {
+       case TYP_BMAPBTA:
+       case TYP_BMAPBTD:
+               brp = XFS_BMBT_REC_ADDR(mp, block, 1);
+               zp = &brp[nrecs];
+               zlen = (char *)block + mp->m_sb.sb_blocksize - (char 
*)&brp[nrecs];
+               break;
+       case TYP_INOBT:
+       case TYP_FINOBT:
+               irp = XFS_INOBT_REC_ADDR(mp, block, 1);
+               zp = &irp[nrecs];
+               zlen = (char *)block + mp->m_sb.sb_blocksize - (char 
*)&irp[nrecs];
+               break;
+       case TYP_BNOBT:
+       case TYP_CNTBT:
+               arp = XFS_ALLOC_REC_ADDR(mp, block, 1);
+               zp = &arp[nrecs];
+               zlen = (char *)block + mp->m_sb.sb_blocksize - (char 
*)&arp[nrecs];
+               break;
+       default:
+               zp = NULL;
+               break;
+       }
+
+       /* Zero from end of records to end of block */
+       if (zp && zlen < mp->m_sb.sb_blocksize)
+               memset(zp, 0, zlen);
+}
+
+static void
+zero_btree_block(
+       struct xfs_btree_block  *block,
+       typnm_t                 btype)
+{
+       int                     level;
+
+       level = be16_to_cpu(block->bb_level);
+
+       if (level > 0)
+               zero_btree_node(block, btype);
+       else
+               zero_btree_leaf(block, btype);
+}
 
 static int
 scan_btree(
@@ -268,6 +389,12 @@
                rval = !stop_on_read_error;
                goto pop_out;
        }
+
+       if (zero_stale_data) {
+               zero_btree_block(iocur_top->data, btype);
+               iocur_top->need_crc = 1;
+       }
+
        if (write_buf(iocur_top))
                goto pop_out;
 
@@ -960,7 +1087,7 @@
 }
 
 static void
-obfuscate_sf_dir(
+process_sf_dir(
        xfs_dinode_t            *dip)
 {
        struct xfs_dir2_sf_hdr  *sfp;
@@ -1007,12 +1134,18 @@
                                         (char *)sfp);
                }
 
-               generate_obfuscated_name(xfs_dir3_sfe_get_ino(mp, sfp, sfep),
+               if (obfuscate)
+                       generate_obfuscated_name(
+                                        xfs_dir3_sfe_get_ino(mp, sfp, sfep),
                                         namelen, &sfep->name[0]);
 
                sfep = (xfs_dir2_sf_entry_t *)((char *)sfep +
                                xfs_dir3_sf_entsize(mp, sfp, namelen));
        }
+
+       /* zero stale data in rest of space in data fork, if any */
+       if (zero_stale_data && (ino_dir_size < XFS_DFORK_DSIZE(dip, mp)))
+               memset(sfep, 0, XFS_DFORK_DSIZE(dip, mp) - ino_dir_size);
 }
 
 /*
@@ -1059,7 +1192,7 @@
 }
 
 static void
-obfuscate_sf_symlink(
+process_sf_symlink(
        xfs_dinode_t            *dip)
 {
        __uint64_t              len;
@@ -1074,16 +1207,21 @@
        }
 
        buf = (char *)XFS_DFORK_DPTR(dip);
-       obfuscate_path_components(buf, len);
+       if (obfuscate)
+               obfuscate_path_components(buf, len);
+
+       /* zero stale data in rest of space in data fork, if any */
+       if (zero_stale_data && len < XFS_DFORK_DSIZE(dip, mp))
+               memset(&buf[len], 0, XFS_DFORK_DSIZE(dip, mp) - len);
 }
 
 static void
-obfuscate_sf_attr(
+process_sf_attr(
        xfs_dinode_t            *dip)
 {
        /*
-        * with extended attributes, obfuscate the names and zero the actual
-        * values.
+        * with extended attributes, obfuscate the names and fill the actual
+        * values with 'v' (to see a valid string length, as opposed to NULLs)
         */
 
        xfs_attr_shortform_t    *asfp;
@@ -1122,16 +1260,24 @@
                        break;
                }
 
-               generate_obfuscated_name(0, asfep->namelen, &asfep->nameval[0]);
-               memset(&asfep->nameval[asfep->namelen], 0, asfep->valuelen);
+               if (obfuscate) {
+                       generate_obfuscated_name(0, asfep->namelen,
+                                                &asfep->nameval[0]);
+                       memset(&asfep->nameval[asfep->namelen], 'v',
+                              asfep->valuelen);
+               }
 
                asfep = (xfs_attr_sf_entry_t *)((char *)asfep +
                                XFS_ATTR_SF_ENTSIZE(asfep));
        }
+
+       /* zero stale data in rest of space in attr fork, if any */
+       if (zero_stale_data && (ino_attr_size < XFS_DFORK_ASIZE(dip, mp)))
+               memset(asfep, 0, XFS_DFORK_ASIZE(dip, mp) - ino_attr_size);
 }
 
 static void
-obfuscate_dir_data_block(
+process_dir_data_block(
        char            *block,
        xfs_dfiloff_t   offset,
        int             is_block_format)
@@ -1151,9 +1297,6 @@
 
        datahdr = (struct xfs_dir2_data_hdr *)block;
 
-       if (offset % mp->m_dirblkfsbs != 0)
-               return; /* corrupted, leave it alone */
-
        if (is_block_format) {
                xfs_dir2_leaf_entry_t   *blp;
                xfs_dir2_block_tail_t   *btp;
@@ -1186,7 +1329,7 @@
 
        dir_offset = xfs_dir3_data_entry_offset(datahdr);
        ptr = block + dir_offset;
-       endptr = block + mp->m_sb.sb_blocksize;
+       endptr = block + mp->m_dirblksize;
 
        while (ptr < endptr && dir_offset < end_of_data) {
                xfs_dir2_data_entry_t   *dep;
@@ -1210,6 +1353,20 @@
                                return;
                        dir_offset += length;
                        ptr += length;
+                       /*
+                        * Zero the unused space up to the tag - the tag is
+                        * actually at a variable offset, so zeroing &dup->tag
+                        * is zeroing the free space in between
+                        */
+                       if (zero_stale_data) {
+                               int zlen = length -
+                                               sizeof(xfs_dir2_data_unused_t);
+
+                               if (zlen > 0) {
+                                       memset(&dup->tag, 0, zlen);
+                                       iocur_top->need_crc = 1;
+                               }
+                       }
                        if (dir_offset >= end_of_data || ptr >= endptr)
                                return;
                }
@@ -1228,19 +1385,48 @@
                if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) !=
                                dir_offset)
                        return;
-               generate_obfuscated_name(be64_to_cpu(dep->inumber),
+
+               if (obfuscate)
+                       generate_obfuscated_name(be64_to_cpu(dep->inumber),
                                         dep->namelen, &dep->name[0]);
                dir_offset += length;
                ptr += length;
+               /* Zero the unused space after name, up to the tag */
+               if (zero_stale_data) {
+                       /* 1 byte for ftype; don't bother with conditional */
+                       int zlen =
+                               (char *)xfs_dir3_data_entry_tag_p(mp, dep) -
+                               (char *)&dep->name[dep->namelen] - 1;
+                       if (zlen > 0) {
+                               memset(&dep->name[dep->namelen] + 1, 0, zlen);
+                               iocur_top->need_crc = 1;
+                       }
+               }
        }
 }
 
 static void
-obfuscate_symlink_block(
+process_symlink_block(
        char                    *block)
 {
-       /* XXX: need to handle CRC headers */
-       obfuscate_path_components(block, mp->m_sb.sb_blocksize);
+       char *link = block;
+
+       if (xfs_sb_version_hascrc(&(mp)->m_sb))
+               link += sizeof(struct xfs_dsymlink_hdr);
+
+       if (obfuscate)
+               obfuscate_path_components(link, XFS_SYMLINK_BUF_SPACE(mp,
+                                                       mp->m_sb.sb_blocksize));
+       if (zero_stale_data) {
+               size_t  linklen, zlen;
+
+               linklen = strlen(link);
+               zlen = mp->m_sb.sb_blocksize - linklen;
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       zlen -= sizeof(struct xfs_dsymlink_hdr);
+               if (zlen < mp->m_sb.sb_blocksize)
+                       memset(link + linklen, 0, zlen);
+       }
 }
 
 #define MAX_REMOTE_VALS                4095
@@ -1268,39 +1454,61 @@
        }
 }
 
+/* Handle remote and leaf attributes */
 static void
-obfuscate_attr_block(
-       char                    *block,
-       xfs_dfiloff_t           offset)
-{
-       xfs_attr_leafblock_t    *leaf;
-       int                     i;
-       int                     nentries;
-       xfs_attr_leaf_entry_t   *entry;
-       xfs_attr_leaf_name_local_t *local;
-       xfs_attr_leaf_name_remote_t *remote;
+process_attr_block(
+       char                            *block,
+       xfs_fileoff_t                   offset)
+{
+       struct xfs_attr_leafblock       *leaf;
+       struct xfs_attr3_icleaf_hdr     hdr;
+       int                             i;
+       int                             nentries;
+       xfs_attr_leaf_entry_t           *entry;
+       xfs_attr_leaf_name_local_t      *local;
+       xfs_attr_leaf_name_remote_t     *remote;
+       __uint32_t                      bs = mp->m_sb.sb_blocksize;
+       char                            *first_name;
+
 
        leaf = (xfs_attr_leafblock_t *)block;
 
-       if (be16_to_cpu(leaf->hdr.info.magic) != XFS_ATTR_LEAF_MAGIC) {
+       /* Remote attributes - attr3 has XFS_ATTR3_RMT_MAGIC, attr has none */
+       if ((be16_to_cpu(leaf->hdr.info.magic) != XFS_ATTR_LEAF_MAGIC) &&
+           (be16_to_cpu(leaf->hdr.info.magic) != XFS_ATTR3_LEAF_MAGIC)) {
                for (i = 0; i < attr_data.remote_val_count; i++) {
-                       /* XXX: need to handle CRC headers */
-                       if (attr_data.remote_vals[i] == offset)
-                               memset(block, 0, XFS_LBSIZE(mp));
+                       if (obfuscate && attr_data.remote_vals[i] == offset)
+                               /* Macros to handle both attr and attr3 */
+                               memset(block +
+                                       (bs - XFS_ATTR3_RMT_BUF_SPACE(mp, bs)),
+                                     'v', XFS_ATTR3_RMT_BUF_SPACE(mp, bs));
                }
                return;
        }
 
-       nentries = be16_to_cpu(leaf->hdr.count);
+       /* Ok, it's a leaf - get header; accounts for crc & non-crc */
+       xfs_attr3_leaf_hdr_from_disk(&hdr, leaf);
+
+       nentries = hdr.count;
        if (nentries * sizeof(xfs_attr_leaf_entry_t) +
-                       sizeof(xfs_attr_leaf_hdr_t) > XFS_LBSIZE(mp)) {
+                       xfs_attr3_leaf_hdr_size(leaf) >
+                               XFS_ATTR3_RMT_BUF_SPACE(mp, bs)) {
                if (show_warnings)
                        print_warning("invalid attr count in inode %llu",
                                        (long long)cur_ino);
                return;
        }
 
-       for (i = 0, entry = &leaf->entries[0]; i < nentries; i++, entry++) {
+       entry = xfs_attr3_leaf_entryp(leaf);
+       /* We will move this as we parse */
+       first_name = NULL;
+       for (i = 0; i < nentries; i++, entry++) {
+               int nlen, vlen, zlen;
+
+               /* Grows up; if this name is topmost, move first_name */
+               if (!first_name || xfs_attr3_leaf_name(leaf, i) < first_name)
+                       first_name = xfs_attr3_leaf_name(leaf, i);
+
                if (be16_to_cpu(entry->nameidx) > XFS_LBSIZE(mp)) {
                        if (show_warnings)
                                print_warning(
@@ -1317,10 +1525,20 @@
                                                (long long)cur_ino);
                                break;
                        }
-                       generate_obfuscated_name(0, local->namelen,
-                               &local->nameval[0]);
-                       memset(&local->nameval[local->namelen], 0,
-                               be16_to_cpu(local->valuelen));
+                       if (obfuscate) {
+                               generate_obfuscated_name(0, local->namelen,
+                                       &local->nameval[0]);
+                               memset(&local->nameval[local->namelen], 'v',
+                                       be16_to_cpu(local->valuelen));
+                       }
+                       /* zero from end of nameval[] to next name start */
+                       nlen = local->namelen;
+                       vlen = be16_to_cpu(local->valuelen);
+                       zlen = xfs_attr_leaf_entsize_local(nlen, vlen) -
+                               (sizeof(xfs_attr_leaf_name_local_t) - 1 +
+                                nlen + vlen);
+                       if (zero_stale_data)
+                               memset(&local->nameval[nlen + vlen], 0, zlen);
                } else {
                        remote = xfs_attr3_leaf_name_remote(leaf, i);
                        if (remote->namelen == 0 || remote->valueblk == 0) {
@@ -1330,14 +1548,33 @@
                                                (long long)cur_ino);
                                break;
                        }
-                       generate_obfuscated_name(0, remote->namelen,
-                                                &remote->name[0]);
-                       add_remote_vals(be32_to_cpu(remote->valueblk),
-                                       be32_to_cpu(remote->valuelen));
+                       if (obfuscate) {
+                               generate_obfuscated_name(0, remote->namelen,
+                                                        &remote->name[0]);
+                               add_remote_vals(be32_to_cpu(remote->valueblk),
+                                               be32_to_cpu(remote->valuelen));
+                       }
+                       /* zero from end of name[] to next name start */
+                       nlen = remote->namelen;
+                       zlen = xfs_attr_leaf_entsize_remote(nlen) -
+                               (sizeof(xfs_attr_leaf_name_remote_t) - 1 +
+                                nlen);
+                       if (zero_stale_data)
+                               memset(&remote->name[nlen], 0, zlen);
                }
        }
+
+       /* Zero from end of entries array to the first name/val */
+       if (zero_stale_data) {
+               struct xfs_attr_leaf_entry *entries;
+
+               entries = xfs_attr3_leaf_entryp(leaf);
+               memset(&entries[nentries], 0,
+                      first_name - (char *)&entries[nentries]);
+       }
 }
 
+/* Processes symlinks, attrs, directories ... */
 static int
 process_single_fsb_objects(
        xfs_dfiloff_t   o,
@@ -1367,25 +1604,50 @@
 
                }
 
-               if (dont_obfuscate)
+               if (!obfuscate && !zero_stale_data)
                        goto write;
 
+               /* Zero unused part of interior nodes */
+               if (zero_stale_data) {
+                       xfs_da_intnode_t *node = iocur_top->data;
+                       int magic = be16_to_cpu(node->hdr.info.magic);
+
+                       if (magic == XFS_DA_NODE_MAGIC ||
+                           magic == XFS_DA3_NODE_MAGIC) {
+                               struct xfs_da3_icnode_hdr hdr;
+                               int used;
+
+                               xfs_da3_node_hdr_from_disk(&hdr, node);
+                               used = xfs_da3_node_hdr_size(node);
+
+                               used += hdr.count
+                                       * sizeof(struct xfs_da_node_entry);
+
+                               if (used < mp->m_sb.sb_blocksize) {
+                                       memset((char *)node + used, 0,
+                                               mp->m_sb.sb_blocksize - used);
+                                       iocur_top->need_crc = 1;
+                               }
+                       }
+               }
+
+               /* Handle leaf nodes */
                dp = iocur_top->data;
                switch (btype) {
                case TYP_DIR2:
                        if (o >= mp->m_dirleafblk)
                                break;
 
-                       obfuscate_dir_data_block(dp, o,
+                       process_dir_data_block(dp, o,
                                                 last == mp->m_dirblkfsbs);
                        iocur_top->need_crc = 1;
                        break;
                case TYP_SYMLINK:
-                       obfuscate_symlink_block(dp);
+                       process_symlink_block(dp);
                        iocur_top->need_crc = 1;
                        break;
                case TYP_ATTR:
-                       obfuscate_attr_block(dp, o);
+                       process_attr_block(dp, o);
                        iocur_top->need_crc = 1;
                        break;
                default:
@@ -1459,13 +1721,14 @@
 
                        }
 
-                       if (dont_obfuscate || o >= mp->m_dirleafblk) {
+                       if ((!obfuscate && !zero_stale_data) ||
+                            o >= mp->m_dirleafblk) {
                                ret = write_buf(iocur_top);
                                goto out_pop;
                        }
 
-                       obfuscate_dir_data_block(iocur_top->data, o,
-                                                 last == mp->m_dirblkfsbs);
+                       process_dir_data_block(iocur_top->data, o,
+                                              last == mp->m_dirblkfsbs);
                        iocur_top->need_crc = 1;
                        ret = write_buf(iocur_top);
 out_pop:
@@ -1700,19 +1963,26 @@
        typnm_t                 itype)
 {
        int                     whichfork;
+       int                     used;
        xfs_extnum_t            nex;
 
        whichfork = (itype == TYP_ATTR) ? XFS_ATTR_FORK : XFS_DATA_FORK;
 
        nex = XFS_DFORK_NEXTENTS(dip, whichfork);
-       if (nex < 0 || nex > XFS_DFORK_SIZE(dip, mp, whichfork) /
-                                               sizeof(xfs_bmbt_rec_t)) {
+       used = nex * sizeof(xfs_bmbt_rec_t);
+       if (nex < 0 || used > XFS_DFORK_SIZE(dip, mp, whichfork)) {
                if (show_warnings)
                        print_warning("bad number of extents %d in inode %lld",
                                nex, (long long)cur_ino);
                return 1;
        }
 
+       /* Zero unused data fork past used extents */
+       if (zero_stale_data && (used < XFS_DFORK_SIZE(dip, mp, whichfork)))
+               memset(XFS_DFORK_PTR(dip, whichfork) + used, 0,
+                      XFS_DFORK_SIZE(dip, mp, whichfork) - used);
+
+
        return process_bmbt_reclist((xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip,
                                        whichfork), nex, itype);
 }
@@ -1724,14 +1994,14 @@
 {
        switch (dip->di_format) {
                case XFS_DINODE_FMT_LOCAL:
-                       if (!dont_obfuscate)
+                       if (obfuscate || zero_stale_data)
                                switch (itype) {
                                        case TYP_DIR2:
-                                               obfuscate_sf_dir(dip);
+                                               process_sf_dir(dip);
                                                break;
 
                                        case TYP_SYMLINK:
-                                               obfuscate_sf_symlink(dip);
+                                               process_sf_symlink(dip);
                                                break;
 
                                        default: ;
@@ -1758,7 +2028,8 @@
 process_inode(
        xfs_agnumber_t          agno,
        xfs_agino_t             agino,
-       xfs_dinode_t            *dip)
+       xfs_dinode_t            *dip,
+       bool                    free_inode)
 {
        int                     success;
        bool                    crc_was_ok = false; /* no recalc by default */
@@ -1767,13 +2038,22 @@
        success = 1;
        cur_ino = XFS_AGINO_TO_INO(mp, agno, agino);
 
-       /* we only care about crc recalculation if we are obfuscating names. */
-       if (!dont_obfuscate) {
+       /* we only care about crc recalculation if we will modify the inode. */
+       if (obfuscate || zero_stale_data) {
                crc_was_ok = xfs_verify_cksum((char *)dip,
                                        mp->m_sb.sb_inodesize,
                                        offsetof(struct xfs_dinode, di_crc));
        }
 
+       if (free_inode) {
+               if (zero_stale_data) {
+                       /* Zero all of the inode literal area */
+                       memset(XFS_DFORK_DPTR(dip), 0,
+                              XFS_LITINO(mp, dip->di_version));
+               }
+               goto done;
+       }
+
        /* copy appropriate data fork metadata */
        switch (be16_to_cpu(dip->di_mode) & S_IFMT) {
                case S_IFDIR:
@@ -1800,8 +2080,8 @@
                switch (dip->di_aformat) {
                        case XFS_DINODE_FMT_LOCAL:
                                need_new_crc = 1;
-                               if (!dont_obfuscate)
-                                       obfuscate_sf_attr(dip);
+                               if (obfuscate || zero_stale_data)
+                                       process_sf_attr(dip);
                                break;
 
                        case XFS_DINODE_FMT_EXTENTS:
@@ -1815,6 +2095,11 @@
                nametable_clear();
        }
 
+done:
+       /* Heavy handed but low cost; just do it as a catch-all. */
+       if (zero_stale_data)
+               need_new_crc = 1;
+
        if (crc_was_ok && need_new_crc)
                xfs_dinode_calc_crc(mp, dip);
        return success;
@@ -1880,13 +2165,12 @@
        for (i = 0; i < XFS_INODES_PER_CHUNK; i++) {
                xfs_dinode_t            *dip;
 
-               if (XFS_INOBT_IS_FREE_DISK(rp, i))
-                       continue;
-
                dip = (xfs_dinode_t *)((char *)iocur_top->data +
                                ((off + i) << mp->m_sb.sb_inodelog));
 
-               if (!process_inode(agno, agino + i, dip))
+               /* process_inode handles free inodes, too */
+               if (!process_inode(agno, agino + i, dip,
+                                  XFS_INOBT_IS_FREE_DISK(rp, i)))
                        goto pop_out;
        }
 skip_processing:
@@ -2031,6 +2315,13 @@
                if (stop_on_read_error)
                        goto pop_out;
        } else {
+               /* Replace any filesystem label with "L's" */
+               if (obfuscate) {
+                       struct xfs_sb *sb = iocur_top->data;
+                       memset(sb->sb_fname, 'L',
+                              min(strlen(sb->sb_fname), sizeof(sb->sb_fname)));
+                       iocur_top->need_crc = 1;
+               }
                if (write_buf(iocur_top))
                        goto pop_out;
        }
@@ -2075,6 +2366,23 @@
                if (stop_on_read_error)
                        goto pop_out;
        } else {
+               if (agf && zero_stale_data) {
+                       /* Zero out unused bits of agfl */
+                       int i;
+                        __be32  *agfl_bno;
+
+                       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, iocur_top->bp);
+                       i = be32_to_cpu(agf->agf_fllast);
+
+                       for (;;) {
+                               if (++i == XFS_AGFL_SIZE(mp))
+                                       i = 0;
+                               if (i == be32_to_cpu(agf->agf_flfirst))
+                                       break;
+                               agfl_bno[i] = cpu_to_be32(NULLAGBLOCK);
+                       }
+                       iocur_top->need_crc = 1;
+               }
                if (write_buf(iocur_top))
                        goto pop_out;
        }
@@ -2169,6 +2477,8 @@
 static int
 copy_log(void)
 {
+       int dirty;
+
        if (show_progress)
                print_progress("Copying log");
 
@@ -2180,6 +2490,34 @@
                print_warning("cannot read log");
                return !stop_on_read_error;
        }
+
+       /* If not obfuscating or zeroing, just copy the log as it is */
+       if (!obfuscate && !zero_stale_data)
+               goto done;
+
+       dirty = xlog_is_dirty(mp, &x, 0);
+
+       switch (dirty) {
+       case 0:
+               /* clear out a clean log */
+               if (show_progress)
+                       print_progress("Zeroing clean log");
+               memset(iocur_top->data, 0,
+                       mp->m_sb.sb_logblocks * mp->m_sb.sb_blocksize);
+               break;
+       case 1:
+               /* keep the dirty log */
+               print_warning(
+_("Filesystem log is dirty; image will contain unobfuscated metadata in 
log."));
+               break;
+       case -1:
+               /* log detection error */
+               print_warning(
+_("Could not discern log; image will contain unobfuscated metadata in log."));
+               break;
+       }
+
+done:
        return !write_buf(iocur_top);
 }
 
@@ -2204,8 +2542,11 @@
                return 0;
        }
 
-       while ((c = getopt(argc, argv, "egm:ow")) != EOF) {
+       while ((c = getopt(argc, argv, "aegm:ow")) != EOF) {
                switch (c) {
+                       case 'a':
+                               zero_stale_data = 0;
+                               break;
                        case 'e':
                                stop_on_read_error = 1;
                                break;
@@ -2221,7 +2562,7 @@
                                }
                                break;
                        case 'o':
-                               dont_obfuscate = 1;
+                               obfuscate = 0;
                                break;
                        case 'w':
                                show_warnings = 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/db/sb.c new/xfsprogs-3.2.4/db/sb.c
--- old/xfsprogs-3.2.3/db/sb.c  2015-06-10 02:08:50.000000000 +0200
+++ new/xfsprogs-3.2.4/db/sb.c  2015-07-29 01:04:08.000000000 +0200
@@ -225,8 +225,7 @@
 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 @@
                }
        }
 
-       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 @@
 "of the filesystem before doing this.\n"), progname);
                return 0;
        }
+       /* Log is clean */
        return 1;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/db/type.c new/xfsprogs-3.2.4/db/type.c
--- old/xfsprogs-3.2.3/db/type.c        2015-06-10 02:08:50.000000000 +0200
+++ new/xfsprogs-3.2.4/db/type.c        2015-07-30 01:21:08.000000000 +0200
@@ -70,6 +70,7 @@
        { TYP_SB, "sb", handle_struct, sb_hfld, NULL },
        { TYP_SYMLINK, "symlink", handle_string, NULL, NULL },
        { TYP_TEXT, "text", handle_text, NULL, NULL },
+       { TYP_FINOBT, "finobt", handle_struct, inobt_hfld, NULL },
        { TYP_NONE, NULL }
 };
 
@@ -104,6 +105,8 @@
        { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld,
                &xfs_symlink_buf_ops },
        { TYP_TEXT, "text", handle_text, NULL, NULL },
+       { TYP_FINOBT, "finobt", handle_struct, inobt_crc_hfld,
+               &xfs_inobt_buf_ops },
        { TYP_NONE, NULL }
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/db/type.h new/xfsprogs-3.2.4/db/type.h
--- old/xfsprogs-3.2.3/db/type.h        2015-06-10 02:08:50.000000000 +0200
+++ new/xfsprogs-3.2.4/db/type.h        2015-07-30 01:21:08.000000000 +0200
@@ -27,7 +27,7 @@
        TYP_BMAPBTD, TYP_BNOBT, TYP_CNTBT, TYP_DATA,
        TYP_DIR2, TYP_DQBLK, TYP_INOBT, TYP_INODATA, TYP_INODE,
        TYP_LOG, TYP_RTBITMAP, TYP_RTSUMMARY, TYP_SB, TYP_SYMLINK,
-       TYP_TEXT, TYP_NONE
+       TYP_TEXT, TYP_FINOBT, TYP_NONE
 } typnm_t;
 
 #define DB_WRITE 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/db/xfs_metadump.sh 
new/xfsprogs-3.2.4/db/xfs_metadump.sh
--- old/xfsprogs-3.2.3/db/xfs_metadump.sh       2014-03-03 07:01:30.000000000 
+0100
+++ new/xfsprogs-3.2.4/db/xfs_metadump.sh       2015-07-30 01:17:43.000000000 
+0200
@@ -5,11 +5,12 @@
 
 OPTS=" "
 DBOPTS=" "
-USAGE="Usage: xfs_metadump [-efFogwV] [-m max_extents] [-l logdev] source 
target"
+USAGE="Usage: xfs_metadump [-aefFogwV] [-m max_extents] [-l logdev] source 
target"
 
-while getopts "efgl:m:owFV" c
+while getopts "aefgl:m:owFV" c
 do
        case $c in
+       a)      OPTS=$OPTS"-a ";;
        e)      OPTS=$OPTS"-e ";;
        g)      OPTS=$OPTS"-g ";;
        m)      OPTS=$OPTS"-m "$OPTARG" ";;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/debian/changelog 
new/xfsprogs-3.2.4/debian/changelog
--- old/xfsprogs-3.2.3/debian/changelog 2015-06-10 02:09:20.000000000 +0200
+++ new/xfsprogs-3.2.4/debian/changelog 2015-07-30 01:21:08.000000000 +0200
@@ -1,3 +1,10 @@
+xfsprogs (3.2.4) unstable; urgency=low
+
+  * New upstream release
+  * Fix xfs_metadump information leak (CVE-2012-2150)
+
+ -- Nathan Scott <[email protected]>  Wed, 29 Jul 2015 15:31:27 +1000
+
 xfsprogs (3.2.3) unstable; urgency=low
 
   * New upstream release
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/doc/CHANGES 
new/xfsprogs-3.2.4/doc/CHANGES
--- old/xfsprogs-3.2.3/doc/CHANGES      2015-06-10 02:11:59.000000000 +0200
+++ new/xfsprogs-3.2.4/doc/CHANGES      2015-07-30 01:21:08.000000000 +0200
@@ -1,3 +1,6 @@
+xfsprogs-3.2.4 (30 Jul 2015)
+       - xfs_metadump: information leakage fixes (CVE-2012-2150) (Eric Sandeen)
+
 xfsprogs-3.2.3 (10 Jun 2015)
        - Debian packaging updates (Nathan Scott)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/include/libxlog.h 
new/xfsprogs-3.2.4/include/libxlog.h
--- old/xfsprogs-3.2.3/include/libxlog.h        2015-06-10 02:08:50.000000000 
+0200
+++ new/xfsprogs-3.2.4/include/libxlog.h        2015-07-29 01:02:16.000000000 
+0200
@@ -78,6 +78,8 @@
 /* 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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/libxlog/util.c 
new/xfsprogs-3.2.4/libxlog/util.c
--- old/xfsprogs-3.2.3/libxlog/util.c   2015-06-10 02:08:50.000000000 +0200
+++ new/xfsprogs-3.2.4/libxlog/util.c   2015-07-29 01:02:16.000000000 +0200
@@ -23,6 +23,62 @@
 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)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/ltmain.sh new/xfsprogs-3.2.4/ltmain.sh
--- old/xfsprogs-3.2.3/ltmain.sh        2015-06-10 02:12:38.000000000 +0200
+++ new/xfsprogs-3.2.4/ltmain.sh        2015-07-30 01:58:49.000000000 +0200
@@ -70,7 +70,7 @@
 #         compiler:            $LTCC
 #         compiler flags:              $LTCFLAGS
 #         linker:              $LD (gnu? $with_gnu_ld)
-#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.7
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.11
 #         automake:    $automake_version
 #         autoconf:    $autoconf_version
 #
@@ -80,7 +80,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1.7"
+VERSION="2.4.2 Debian-2.4.2-1.11"
 TIMESTAMP=""
 package_revision=1.3337
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/man/man8/xfs_metadump.8 
new/xfsprogs-3.2.4/man/man8/xfs_metadump.8
--- old/xfsprogs-3.2.3/man/man8/xfs_metadump.8  2014-01-20 23:47:46.000000000 
+0100
+++ new/xfsprogs-3.2.4/man/man8/xfs_metadump.8  2015-07-30 01:17:43.000000000 
+0200
@@ -4,7 +4,7 @@
 .SH SYNOPSIS
 .B xfs_metadump
 [
-.B \-efFgow
+.B \-aefFgow
 ] [
 .B \-m
 .I max_extents
@@ -74,6 +74,14 @@
 .PP
 .SH OPTIONS
 .TP
+.B \-a
+Copies entire metadata blocks.  Normally,
+.B xfs_metadump
+will zero any stale
+bytes interspersed with in-use metadata.  Use this option to copy full metadata
+blocks, to provide more debugging information for a corrupted filesystem.  Note
+that the extra data will be unobfuscated.
+.TP
 .B \-e
 Stops the dump on a read error. Normally, it will ignore read errors and copy
 all the metadata that is accessible.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xfsprogs-3.2.3/po/xfsprogs.pot 
new/xfsprogs-3.2.4/po/xfsprogs.pot
--- old/xfsprogs-3.2.3/po/xfsprogs.pot  2015-06-10 07:19:12.000000000 +0200
+++ new/xfsprogs-3.2.4/po/xfsprogs.pot  2015-07-30 02:07:06.000000000 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-06-10 15:19+1000\n"
+"POT-Creation-Date: 2015-07-30 10:07+1000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <[email protected]>\n"
@@ -330,7 +330,7 @@
 msgstr ""
 
 #: .././db/addr.c:72 .././db/attrset.c:86 .././db/attrset.c:189
-#: .././db/print.c:74 .././db/type.c:142 .././db/write.c:106
+#: .././db/print.c:74 .././db/type.c:145 .././db/write.c:106
 msgid "no current type\n"
 msgstr ""
 
@@ -1029,15 +1029,15 @@
 msgid "%s: out of memory\n"
 msgstr ""
 
-#: .././db/metadump.c:59
-msgid "[-e] [-g] [-m max_extent] [-w] [-o] filename"
+#: .././db/metadump.c:60
+msgid "[-a] [-e] [-g] [-m max_extent] [-w] [-o] filename"
 msgstr ""
 
-#: .././db/metadump.c:60
+#: .././db/metadump.c:61
 msgid "dump metadata to a file"
 msgstr ""
 
-#: .././db/metadump.c:90
+#: .././db/metadump.c:92
 #, c-format
 msgid ""
 "\n"
@@ -1046,6 +1046,7 @@
 " or xfs_repair failures.\n"
 "\n"
 " Options:\n"
+"   -a -- Copy full metadata blocks without zeroing unused space\n"
 "   -e -- Ignore read errors and keep going\n"
 "   -g -- Display dump progress\n"
 "   -m -- Specify max extent size in blocks to copy (default = %d blocks)\n"
@@ -1054,6 +1055,15 @@
 "\n"
 msgstr ""
 
+#: .././db/metadump.c:2511
+msgid ""
+"Filesystem log is dirty; image will contain unobfuscated metadata in log."
+msgstr ""
+
+#: .././db/metadump.c:2516
+msgid "Could not discern log; image will contain unobfuscated metadata in log."
+msgstr ""
+
 #: .././db/check.c:362
 msgid "free block usage information"
 msgstr ""
@@ -2175,19 +2185,19 @@
 msgid "bad sb version # %#x in AG %u\n"
 msgstr ""
 
-#: .././db/sb.c:233
+#: .././db/sb.c:232
 msgid "aborting - external log specified for FS with an internal log\n"
 msgstr ""
 
-#: .././db/sb.c:239
+#: .././db/sb.c:238
 msgid "aborting - no external log specified for FS with an external log\n"
 msgstr ""
 
-#: .././db/sb.c:261
+#: .././db/sb.c:248
 msgid "ERROR: cannot find log head/tail, run xfs_repair\n"
 msgstr ""
 
-#: .././db/sb.c:266
+#: .././db/sb.c:252
 #, c-format
 msgid ""
 "ERROR: The filesystem has valuable metadata changes in a log which needs to\n"
@@ -2198,15 +2208,15 @@
 "of the filesystem before doing this.\n"
 msgstr ""
 
-#: .././db/sb.c:283
+#: .././db/sb.c:270
 msgid "Clearing log and setting UUID\n"
 msgstr ""
 
-#: .././db/sb.c:291
+#: .././db/sb.c:278
 msgid "ERROR: cannot clear the log\n"
 msgstr ""
 
-#: .././db/sb.c:302
+#: .././db/sb.c:289
 msgid ""
 "\n"
 " write/print FS uuid\n"
@@ -2227,71 +2237,71 @@
 "\n"
 msgstr ""
 
-#: .././db/sb.c:354 .././db/sb.c:518
+#: .././db/sb.c:341 .././db/sb.c:505
 msgid "invalid parameters\n"
 msgstr ""
 
-#: .././db/sb.c:361 .././db/sb.c:525 .././db/sb.c:684
+#: .././db/sb.c:348 .././db/sb.c:512 .././db/sb.c:671
 #, c-format
 msgid "%s: not in expert mode, writing disabled\n"
 msgstr ""
 
-#: .././db/sb.c:373
+#: .././db/sb.c:360
 #, c-format
 msgid "%s: only 'rewrite' supported on V5 fs\n"
 msgstr ""
 
-#: .././db/sb.c:385
+#: .././db/sb.c:372
 msgid "failed to read UUID from AG 0\n"
 msgstr ""
 
-#: .././db/sb.c:390
+#: .././db/sb.c:377
 #, c-format
 msgid "old UUID = %s\n"
 msgstr ""
 
-#: .././db/sb.c:393
+#: .././db/sb.c:380
 msgid "invalid UUID\n"
 msgstr ""
 
-#: .././db/sb.c:402 .././db/sb.c:530 .././db/sb.c:770
+#: .././db/sb.c:389 .././db/sb.c:517 .././db/sb.c:757
 msgid "writing all SBs\n"
 msgstr ""
 
-#: .././db/sb.c:405
+#: .././db/sb.c:392
 #, c-format
 msgid "failed to set UUID in AG %d\n"
 msgstr ""
 
-#: .././db/sb.c:410
+#: .././db/sb.c:397
 #, c-format
 msgid "new UUID = %s\n"
 msgstr ""
 
-#: .././db/sb.c:418
+#: .././db/sb.c:405
 #, c-format
 msgid "failed to read UUID from AG %d\n"
 msgstr ""
 
-#: .././db/sb.c:424
+#: .././db/sb.c:411
 #, c-format
 msgid "warning: UUID in AG %d differs to the primary SB\n"
 msgstr ""
 
-#: .././db/sb.c:435
+#: .././db/sb.c:422
 msgid "warning - external log specified for FS with an internal log\n"
 msgstr ""
 
-#: .././db/sb.c:438
+#: .././db/sb.c:425
 msgid "warning - no external log specified for FS with an external log\n"
 msgstr ""
 
-#: .././db/sb.c:443
+#: .././db/sb.c:430
 #, c-format
 msgid "UUID = %s\n"
 msgstr ""
 
-#: .././db/sb.c:454
+#: .././db/sb.c:441
 msgid ""
 "\n"
 " write/print FS label\n"
@@ -2309,37 +2319,37 @@
 "\n"
 msgstr ""
 
-#: .././db/sb.c:491
+#: .././db/sb.c:478
 #, c-format
 msgid "%s: truncating label length from %d to %d\n"
 msgstr ""
 
-#: .././db/sb.c:533
+#: .././db/sb.c:520
 #, c-format
 msgid "failed to set label in AG %d\n"
 msgstr ""
 
-#: .././db/sb.c:536
+#: .././db/sb.c:523
 #, c-format
 msgid "new label = \"%s\"\n"
 msgstr ""
 
-#: .././db/sb.c:543
+#: .././db/sb.c:530
 #, c-format
 msgid "failed to read label in AG %d\n"
 msgstr ""
 
-#: .././db/sb.c:549
+#: .././db/sb.c:536
 #, c-format
 msgid "warning: AG %d label differs\n"
 msgstr ""
 
-#: .././db/sb.c:551
+#: .././db/sb.c:538
 #, c-format
 msgid "label = \"%s\"\n"
 msgstr ""
 
-#: .././db/sb.c:561
+#: .././db/sb.c:548
 msgid ""
 "\n"
 " set/print feature bits in sb version\n"
@@ -2359,42 +2369,42 @@
 "\n"
 msgstr ""
 
-#: .././db/sb.c:590
+#: .././db/sb.c:577
 msgid "Superblock has mismatched features2 fields, skipping modification\n"
 msgstr ""
 
-#: .././db/sb.c:704
+#: .././db/sb.c:691
 msgid "unwritten extents flag is already enabled\n"
 msgstr ""
 
-#: .././db/sb.c:711
+#: .././db/sb.c:698
 msgid "unwritten extents always enabled for v5 superblocks.\n"
 msgstr ""
 
-#: .././db/sb.c:728
+#: .././db/sb.c:715
 msgid "version 2 log format is already in use\n"
 msgstr ""
 
-#: .././db/sb.c:735
+#: .././db/sb.c:722
 msgid "Version 2 logs always enabled for v5 superblocks.\n"
 msgstr ""
 
-#: .././db/sb.c:740
+#: .././db/sb.c:727
 #, c-format
 msgid "%s: Cannot change %s on v5 superblocks.\n"
 msgstr ""
 
-#: .././db/sb.c:764
+#: .././db/sb.c:751
 #, c-format
 msgid "%s: invalid version change command \"%s\"\n"
 msgstr ""
 
-#: .././db/sb.c:773
+#: .././db/sb.c:760
 #, c-format
 msgid "failed to set versionnum in AG %d\n"
 msgstr ""
 
-#: .././db/sb.c:791
+#: .././db/sb.c:778
 #, c-format
 msgid "versionnum [0x%x+0x%x] = %s\n"
 msgstr ""
@@ -2503,24 +2513,24 @@
 msgid "set/show current data type"
 msgstr ""
 
-#: .././db/type.c:144
+#: .././db/type.c:147
 #, c-format
 msgid "current type is \"%s\"\n"
 msgstr ""
 
-#: .././db/type.c:146
+#: .././db/type.c:149
 msgid ""
 "\n"
 " supported types are:\n"
 " "
 msgstr ""
 
-#: .././db/type.c:163
+#: .././db/type.c:166
 #, c-format
 msgid "no such type %s\n"
 msgstr ""
 
-#: .././db/type.c:166
+#: .././db/type.c:169
 msgid "no current object\n"
 msgstr ""
 
@@ -5448,7 +5458,17 @@
 msgid "%s: cannot reserve space: %s\n"
 msgstr ""
 
-#: .././libxlog/util.c:37
+#: .././libxlog/util.c:65
+#, c-format
+msgid "%s: cannot find log head/tail (xlog_find_tail=%d)\n"
+msgstr ""
+
+#: .././libxlog/util.c:73
+#, c-format
+msgid "%s: head block %<PRId64> tail block %<PRId64>\n"
+msgstr ""
+
+#: .././libxlog/util.c:93
 #, c-format
 msgid ""
 "* ERROR: mismatched uuid in log\n"
@@ -5456,24 +5476,24 @@
 "*            log: %s\n"
 msgstr ""
 
-#: .././libxlog/util.c:50
+#: .././libxlog/util.c:106
 #, c-format
 msgid ""
 "\n"
 "LOG REC AT LSN cycle %d block %d (0x%x, 0x%x)\n"
 msgstr ""
 
-#: .././libxlog/util.c:58
+#: .././libxlog/util.c:114
 #, c-format
 msgid "* ERROR: bad magic number in log header: 0x%x\n"
 msgstr ""
 
-#: .././libxlog/util.c:67
+#: .././libxlog/util.c:123
 #, c-format
 msgid "* ERROR: log format incompatible (log=%d, ours=%d)\n"
 msgstr ""
 
-#: .././libxlog/util.c:77 .././libxlog/util.c:89
+#: .././libxlog/util.c:133 .././libxlog/util.c:145
 msgid "Bad log"
 msgstr ""
 



Reply via email to