summaryrefslogtreecommitdiffstats
path: root/sbin/growfs
diff options
context:
space:
mode:
authorgavin <gavin@FreeBSD.org>2010-02-13 16:22:08 +0000
committergavin <gavin@FreeBSD.org>2010-02-13 16:22:08 +0000
commitbea18441527f0793b3aeb163069d6d878d4d6750 (patch)
tree903350991c829c9a63e062f0f114cbc833afa935 /sbin/growfs
parentb056acb8640e378c0d878874ce7f56a67b32ac83 (diff)
downloadFreeBSD-src-bea18441527f0793b3aeb163069d6d878d4d6750.zip
FreeBSD-src-bea18441527f0793b3aeb163069d6d878d4d6750.tar.gz
When growing a UFS1 filesystem, we need to initialise all inodes in any new
cylinder groups that are created. When the filesystem is first created, newfs always initialises the first two blocks of inodes, and then in the UFS1 case will also initialise the remaining inode blocks. The changes in growfs.c 1.23 broke the initialisation of all inodes, seemingly based on this implementation detail in newfs(8). The result was that instead of initialising all inodes, we would actually end up initialising all but the first two blocks of inodes. If the filesystem was grown into empty (all-zeros) space then the resulting filesystem was fine, however when grown onto non-zeroed space the filesystem produced would appear to have massive corruption on the first fsck after growing. A test case for this problem can be found in the PR audit trail. Fix this by once again initialising all inodes in the UFS1 case. PR: bin/115174 Submitted by: Nate Eldredgei nge cs.hmc.edu Reviewed by: mjacob MFC after: 1 month
Diffstat (limited to 'sbin/growfs')
-rw-r--r--sbin/growfs/growfs.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c
index a715ec1..5e950fc 100644
--- a/sbin/growfs/growfs.c
+++ b/sbin/growfs/growfs.c
@@ -450,13 +450,11 @@ initcg(int cylno, time_t utime, int fso, unsigned int Nflag)
acg.cg_cs.cs_nifree--;
}
/*
- * XXX Newfs writes out two blocks of initialized inodes
- * unconditionally. Should we check here to make sure that they
- * were actually written?
+ * For the old file system, we have to initialize all the inodes.
*/
if (sblock.fs_magic == FS_UFS1_MAGIC) {
bzero(iobuf, sblock.fs_bsize);
- for (i = 2 * sblock.fs_frag; i < sblock.fs_ipg / INOPF(&sblock);
+ for (i = 0; i < sblock.fs_ipg / INOPF(&sblock);
i += sblock.fs_frag) {
dp1 = (struct ufs1_dinode *)iobuf;
#ifdef FSIRAND
OpenPOWER on IntegriCloud