]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
metadump: Zero unused portions of DA_NODE blocks
authorEric Sandeen <sandeen@sandeen.net>
Wed, 29 Jul 2015 23:21:08 +0000 (09:21 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 29 Jul 2015 23:21:08 +0000 (09:21 +1000)
Zero out unused portions of interior nodes of DA btrees

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/metadump.c

index 32a2f70369dd248fe4fe579e1f91561fad9d943f..d2935810733b1e775d9e3868c101a0d561a459da 100644 (file)
@@ -1483,6 +1483,31 @@ process_single_fsb_objects(
                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: