Author: imp
Date: Mon Aug  7 21:23:59 2017
New Revision: 322201
URL: https://svnweb.freebsd.org/changeset/base/322201

Log:
  In debug mode, print the differences between the superblock and
  alternate superblock when the values disagree and we're going to
  reject it.
  
  Differential Revision: https://reviews.freebsd.org/D11589

Modified:
  head/sbin/fsck_ffs/setup.c

Modified: head/sbin/fsck_ffs/setup.c
==============================================================================
--- head/sbin/fsck_ffs/setup.c  Mon Aug  7 21:23:54 2017        (r322200)
+++ head/sbin/fsck_ffs/setup.c  Mon Aug  7 21:23:59 2017        (r322201)
@@ -294,7 +294,7 @@ int
 readsb(int listerr)
 {
        ufs2_daddr_t super;
-       int i;
+       int i, bad;
 
        if (bflag) {
                super = bflag;
@@ -344,43 +344,53 @@ readsb(int listerr)
        dev_bsize = sblock.fs_fsize / fsbtodb(&sblock, 1);
        sblk.b_bno = super / dev_bsize;
        sblk.b_size = SBLOCKSIZE;
-       if (bflag)
-               goto out;
        /*
         * Compare all fields that should not differ in alternate super block.
         * When an alternate super-block is specified this check is skipped.
         */
+       if (bflag)
+               goto out;
        getblk(&asblk, cgsblock(&sblock, sblock.fs_ncg - 1), sblock.fs_sbsize);
        if (asblk.b_errs)
                return (0);
-       if (altsblock.fs_sblkno != sblock.fs_sblkno ||
-           altsblock.fs_cblkno != sblock.fs_cblkno ||
-           altsblock.fs_iblkno != sblock.fs_iblkno ||
-           altsblock.fs_dblkno != sblock.fs_dblkno ||
-           altsblock.fs_ncg != sblock.fs_ncg ||
-           altsblock.fs_bsize != sblock.fs_bsize ||
-           altsblock.fs_fsize != sblock.fs_fsize ||
-           altsblock.fs_frag != sblock.fs_frag ||
-           altsblock.fs_bmask != sblock.fs_bmask ||
-           altsblock.fs_fmask != sblock.fs_fmask ||
-           altsblock.fs_bshift != sblock.fs_bshift ||
-           altsblock.fs_fshift != sblock.fs_fshift ||
-           altsblock.fs_fragshift != sblock.fs_fragshift ||
-           altsblock.fs_fsbtodb != sblock.fs_fsbtodb ||
-           altsblock.fs_sbsize != sblock.fs_sbsize ||
-           altsblock.fs_nindir != sblock.fs_nindir ||
-           altsblock.fs_inopb != sblock.fs_inopb ||
-           altsblock.fs_cssize != sblock.fs_cssize ||
-           altsblock.fs_ipg != sblock.fs_ipg ||
-           altsblock.fs_fpg != sblock.fs_fpg ||
-           altsblock.fs_magic != sblock.fs_magic) {
+       bad = 0;
+#define CHK(x, y)                              \
+       if (altsblock.x != sblock.x) {          \
+               bad++;                          \
+               if (listerr && debug)           \
+                       printf("SUPER BLOCK VS ALTERNATE MISMATCH %s: " y " vs 
" y "\n", \
+                           #x, (intmax_t)sblock.x, (intmax_t)altsblock.x); \
+       }
+       CHK(fs_sblkno, "%jd");
+       CHK(fs_cblkno, "%jd");
+       CHK(fs_iblkno, "%jd");
+       CHK(fs_dblkno, "%jd");
+       CHK(fs_ncg, "%jd");
+       CHK(fs_bsize, "%jd");
+       CHK(fs_fsize, "%jd");
+       CHK(fs_frag, "%jd");
+       CHK(fs_bmask, "%#jx");
+       CHK(fs_fmask, "%#jx");
+       CHK(fs_bshift, "%jd");
+       CHK(fs_fshift, "%jd");
+       CHK(fs_fragshift, "%jd");
+       CHK(fs_fsbtodb, "%jd");
+       CHK(fs_sbsize, "%jd");
+       CHK(fs_nindir, "%jd");
+       CHK(fs_inopb, "%jd");
+       CHK(fs_cssize, "%jd");
+       CHK(fs_ipg, "%jd");
+       CHK(fs_fpg, "%jd");
+       CHK(fs_magic, "%#jx");
+#undef CHK
+       if (bad) {
                if (listerr == 0)
                        return (0);
                if (preen)
                        printf("%s: ", cdevname);
                printf(
                    "VALUES IN SUPER BLOCK LSB=%jd DISAGREE WITH THOSE IN\n"
-                   "FIRST ALTERNATE LSB=%jd\n",
+                   "LAST ALTERNATE LSB=%jd\n",
                    sblk.b_bno, asblk.b_bno);
                if (reply("IGNORE ALTERNATE SUPER BLOCK") == 0)
                        return (0);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to