Author: mckusick
Date: Wed Jan 31 23:13:37 2018
New Revision: 328644
URL: https://svnweb.freebsd.org/changeset/base/328644

Log:
  When reading a cylinder group, break out reporting of check hash errors
  from other types of errors so that the error is correctly reported.

Modified:
  head/sys/ufs/ffs/ffs_alloc.c

Modified: head/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- head/sys/ufs/ffs/ffs_alloc.c        Wed Jan 31 22:49:50 2018        
(r328643)
+++ head/sys/ufs/ffs/ffs_alloc.c        Wed Jan 31 23:13:37 2018        
(r328644)
@@ -2635,16 +2635,31 @@ ffs_getcg(fs, devvp, cg, bpp, cgpp)
        if (error != 0)
                return (error);
        cgp = (struct cg *)bp->b_data;
-       if (((fs->fs_metackhash & CK_CYLGRP) != 0 &&
+       if ((fs->fs_metackhash & CK_CYLGRP) != 0 &&
            (bp->b_flags & B_CKHASH) != 0 &&
-           cgp->cg_ckhash != bp->b_ckhash) ||
-           !cg_chkmagic(cgp) || cgp->cg_cgx != cg) {
+           cgp->cg_ckhash != bp->b_ckhash) {
                sfs = ffs_getmntstat(devvp);
                printf("UFS %s%s (%s) cylinder checksum failed: cg %u, cgp: "
                    "0x%x != bp: 0x%jx\n",
                    devvp->v_type == VCHR ? "" : "snapshot of ",
                    sfs->f_mntfromname, sfs->f_mntonname,
                    cg, cgp->cg_ckhash, (uintmax_t)bp->b_ckhash);
+               bp->b_flags &= ~B_CKHASH;
+               bp->b_flags |= B_INVAL | B_NOCACHE;
+               brelse(bp);
+               return (EIO);
+       }
+       if (!cg_chkmagic(cgp) || cgp->cg_cgx != cg) {
+               sfs = ffs_getmntstat(devvp);
+               printf("UFS %s%s (%s)",
+                   devvp->v_type == VCHR ? "" : "snapshot of ",
+                   sfs->f_mntfromname, sfs->f_mntonname);
+               if (!cg_chkmagic(cgp))
+                       printf(" cg %u: bad magic number 0x%x should be 0x%x\n",
+                           cg, cgp->cg_magic, CG_MAGIC);
+               else
+                       printf(": wrong cylinder group cg %u != cgx %u\n", cg,
+                           cgp->cg_cgx);
                bp->b_flags &= ~B_CKHASH;
                bp->b_flags |= B_INVAL | B_NOCACHE;
                brelse(bp);
_______________________________________________
[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