]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_logprint: Fix super block buffer interpretation issue
authorChi Zhiling <chizhiling@kylinos.cn>
Thu, 16 Jan 2025 09:09:39 +0000 (17:09 +0800)
committerAndrey Albershteyn <aalbersh@kernel.org>
Fri, 24 Jan 2025 11:32:01 +0000 (12:32 +0100)
When using xfs_logprint to interpret the buffer of the super block, the
icount will always be 6360863066640355328 (0x5846534200001000). This is
because the offset of icount is incorrect, causing xfs_logprint to
misinterpret the MAGIC number as icount.
This patch fixes the offset value of the SB counters in xfs_logprint.

Before this patch:
icount: 6360863066640355328  ifree: 5242880  fdblks: 0  frext: 0

After this patch:
icount: 10240  ifree: 4906  fdblks: 37  frext: 0

Suggested-by: Darrick J. Wong <djwong@kernel.org>
Suggested-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Chi Zhiling <chizhiling@kylinos.cn>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
logprint/log_misc.c
logprint/log_print_all.c

index 1df8c5d377c02dba75d4de96b0aceea291187ae0..8336f26e093310f22a82832c1281fc230ba13874 100644 (file)
@@ -282,22 +282,15 @@ xlog_print_trans_buffer(char **ptr, int len, int *i, int num_ops)
                if (be32_to_cpu(head->oh_len) < 4*8) {
                        printf(_("Out of space\n"));
                } else {
-                       __be64           a, b;
+                       struct xfs_dsb  *dsb = (struct xfs_dsb *) *ptr;
 
                        printf("\n");
-                       /*
-                        * memmove because *ptr may not be 8-byte aligned
-                        */
-                       memmove(&a, *ptr, sizeof(__be64));
-                       memmove(&b, *ptr+8, sizeof(__be64));
                        printf(_("icount: %llu  ifree: %llu  "),
-                              (unsigned long long) be64_to_cpu(a),
-                              (unsigned long long) be64_to_cpu(b));
-                       memmove(&a, *ptr+16, sizeof(__be64));
-                       memmove(&b, *ptr+24, sizeof(__be64));
+                              (unsigned long long) get_unaligned_be64(&dsb->sb_icount),
+                              (unsigned long long) get_unaligned_be64(&dsb->sb_ifree));
                        printf(_("fdblks: %llu  frext: %llu\n"),
-                              (unsigned long long) be64_to_cpu(a),
-                              (unsigned long long) be64_to_cpu(b));
+                              (unsigned long long) get_unaligned_be64(&dsb->sb_fdblocks),
+                              (unsigned long long) get_unaligned_be64(&dsb->sb_frextents));
                }
                super_block = 0;
        } else if (be32_to_cpu(*(__be32 *)(*ptr)) == XFS_AGI_MAGIC) {
index 5a9ddd05ab12887a1bd89cf8ace5910a65f0e2b3..ed5f234975ccada299f62dcc1c9feda9bee7fdd8 100644 (file)
@@ -91,22 +91,20 @@ xlog_recover_print_buffer(
                len = item->ri_buf[i].i_len;
                i++;
                if (blkno == 0) { /* super block */
+                       struct xfs_dsb  *dsb = (struct xfs_dsb *)p;
+
                        printf(_("      SUPER Block Buffer:\n"));
                        if (!print_buffer)
                                continue;
-                      printf(_("              icount:%llu ifree:%llu  "),
-                              (unsigned long long)
-                                      be64_to_cpu(*(__be64 *)(p)),
-                              (unsigned long long)
-                                      be64_to_cpu(*(__be64 *)(p+8)));
-                      printf(_("fdblks:%llu  frext:%llu\n"),
-                              (unsigned long long)
-                                      be64_to_cpu(*(__be64 *)(p+16)),
-                              (unsigned long long)
-                                      be64_to_cpu(*(__be64 *)(p+24)));
+                       printf(_("              icount:%llu ifree:%llu  "),
+                               (unsigned long long) get_unaligned_be64(&dsb->sb_icount),
+                               (unsigned long long) get_unaligned_be64(&dsb->sb_ifree));
+                       printf(_("fdblks:%llu  frext:%llu\n"),
+                               (unsigned long long) get_unaligned_be64(&dsb->sb_fdblocks),
+                               (unsigned long long) get_unaligned_be64(&dsb->sb_frextents));
                        printf(_("              sunit:%u  swidth:%u\n"),
-                              be32_to_cpu(*(__be32 *)(p+56)),
-                              be32_to_cpu(*(__be32 *)(p+60)));
+                               get_unaligned_be32(&dsb->sb_unit),
+                               get_unaligned_be32(&dsb->sb_width));
                } else if (be32_to_cpu(*(__be32 *)p) == XFS_AGI_MAGIC) {
                        int bucket, buckets;
                        agi = (xfs_agi_t *)p;