aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2018-01-14 16:55:14 +0000
committerWarner Losh <imp@FreeBSD.org>2018-01-14 16:55:14 +0000
commit3922493a2155b51de406efc762ff1be186ad4ee1 (patch)
tree20e95ef421f5966324bfb53786fc7dc0637e63ab /sbin
parentb6bf2e7c3563a66feff727d54c2eca6ec25bfa92 (diff)
Notes
Diffstat (limited to 'sbin')
-rw-r--r--sbin/fsck_ffs/pass5.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sbin/fsck_ffs/pass5.c b/sbin/fsck_ffs/pass5.c
index 3f8c49a8e1c7..db45f4815e82 100644
--- a/sbin/fsck_ffs/pass5.c
+++ b/sbin/fsck_ffs/pass5.c
@@ -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;