summaryrefslogtreecommitdiffstats
path: root/sbin/fsck_ffs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-06-12 21:37:27 +0000
committerkib <kib@FreeBSD.org>2012-06-12 21:37:27 +0000
commit82d8f361abba1ad60fd234e39834abf5eb94d611 (patch)
treee2145ba275ce87e8265e0ff94f8f88731d4f6fcf /sbin/fsck_ffs
parent4ff7dff337b85f1e4a1bb9de724d634e71d86771 (diff)
downloadFreeBSD-src-82d8f361abba1ad60fd234e39834abf5eb94d611.zip
FreeBSD-src-82d8f361abba1ad60fd234e39834abf5eb94d611.tar.gz
For incompleted block allocations or frees, the inode block count usage
must be recalculated. The blk_check pass of suj checker explicitely marks inodes which owned such blocks as needing block count adjustment. But ino_adjblks() is only called by cg_trunc pass, which is performed before blk_check. As result, the block use count for such inodes is left wrong. This causes full fsck run after journaled run to still find inconsistencies like 'INCORRECT BLOCK COUNT I=14557 (328 should be 0)' in phase 1. Fix this issue by running additional adj_blk pass after blk_check, which updates the field. Reviewed by: jeff, mckusick MFC after: 1 week
Diffstat (limited to 'sbin/fsck_ffs')
-rw-r--r--sbin/fsck_ffs/suj.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sbin/fsck_ffs/suj.c b/sbin/fsck_ffs/suj.c
index b784519..8819476 100644
--- a/sbin/fsck_ffs/suj.c
+++ b/sbin/fsck_ffs/suj.c
@@ -1789,6 +1789,20 @@ cg_trunc(struct suj_cg *sc)
}
}
+static void
+cg_adj_blk(struct suj_cg *sc)
+{
+ struct suj_ino *sino;
+ int i;
+
+ for (i = 0; i < SUJ_HASHSIZE; i++) {
+ LIST_FOREACH(sino, &sc->sc_inohash[i], si_next) {
+ if (sino->si_blkadj)
+ ino_adjblks(sino);
+ }
+ }
+}
+
/*
* Free any partially allocated blocks and then resolve inode block
* counts.
@@ -2720,6 +2734,7 @@ suj_check(const char *filesys)
printf("** Processing journal entries.\n");
cg_apply(cg_trunc);
cg_apply(cg_check_blk);
+ cg_apply(cg_adj_blk);
cg_apply(cg_check_ino);
}
if (preen == 0 && (jrecs > 0 || jbytes > 0) && reply("WRITE CHANGES") == 0)
OpenPOWER on IntegriCloud