Author: imp
Date: Sun Jan 14 16:55:14 2018
New Revision: 327970
URL: https://svnweb.freebsd.org/changeset/base/327970

Log:
  Report CG checksum mismatches. These errors are non-fatal. The
  previous behavior is preserved (the CG checksum is fixed). We're just
  noisy about it now.
  
  Reviewed by: kirk@
  Sponsored by: Netflix
  Differential Revision: https://reviews.freebsd.org/D13884

Modified:
  head/sbin/fsck_ffs/pass5.c

Modified: head/sbin/fsck_ffs/pass5.c
==============================================================================
--- head/sbin/fsck_ffs/pass5.c  Sun Jan 14 16:04:51 2018        (r327969)
+++ head/sbin/fsck_ffs/pass5.c  Sun Jan 14 16:55:14 2018        (r327970)
@@ -63,7 +63,7 @@ pass5(void)
        int inomapsize, blkmapsize;
        struct fs *fs = &sblock;
        ufs2_daddr_t d, dbase, dmax, start;
-       int rewritecg = 0;
+       int rewritecg = 0, cgckadd = 0;
        struct csum *cs;
        struct csum_total cstotal;
        struct inodesc idesc[3];
@@ -80,6 +80,7 @@ pass5(void)
            reply("ADD CYLINDER GROUP CHECKSUM PROTECTION") != 0) {
                fs->fs_metackhash |= CK_CYLGRP;
                rewritecg = 1;
+               cgckadd = 1;
                sbdirty();
        }
        if (cvtlevel >= 3) {
@@ -177,6 +178,16 @@ pass5(void)
                cg = cgbp->b_un.b_cg;
                if (!cg_chkmagic(cg))
                        pfatal("CG %d: BAD MAGIC NUMBER\n", c);
+               if ((fs->fs_metackhash & CK_CYLGRP) != 0 && cgckadd == 0) {
+                       uint32_t ckhash, thishash;
+
+                       ckhash = cg->cg_ckhash;
+                       cg->cg_ckhash = 0;
+                       thishash = calculate_crc32c(~0L, cg, fs->fs_cgsize);
+                       if (ckhash != thishash)
+                               pwarn("CG %d: BAD CHECKSUM %#x vs %#x", c, 
ckhash, thishash);
+                       cg->cg_ckhash = ckhash;
+               }
                newcg->cg_time = cg->cg_time;
                newcg->cg_old_time = cg->cg_old_time;
                newcg->cg_unrefs = cg->cg_unrefs;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to