Module Name: src Committed By: dholland Date: Wed Aug 24 07:44:05 UTC 2016
Modified Files: src/sbin/resize_ffs: resize_ffs.c Log Message: Fix handling of ffsv2 inode initialization. Retires PR 51116. To generate a diff of this commit: cvs rdiff -u -r1.46 -r1.47 src/sbin/resize_ffs/resize_ffs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/resize_ffs/resize_ffs.c diff -u src/sbin/resize_ffs/resize_ffs.c:1.46 src/sbin/resize_ffs/resize_ffs.c:1.47 --- src/sbin/resize_ffs/resize_ffs.c:1.46 Thu Mar 17 01:41:54 2016 +++ src/sbin/resize_ffs/resize_ffs.c Wed Aug 24 07:44:05 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: resize_ffs.c,v 1.46 2016/03/17 01:41:54 christos Exp $ */ +/* $NetBSD: resize_ffs.c,v 1.47 2016/08/24 07:44:05 dholland Exp $ */ /* From sources sent on February 17, 2003 */ /*- * As its sole author, I explicitly place this code in the public @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: resize_ffs.c,v 1.46 2016/03/17 01:41:54 christos Exp $"); +__RCSID("$NetBSD: resize_ffs.c,v 1.47 2016/08/24 07:44:05 dholland Exp $"); #include <sys/disk.h> #include <sys/disklabel.h> @@ -105,7 +105,8 @@ union dinode { } while (0) /* a cg's worth of brand new squeaky-clean inodes */ -static struct ufs1_dinode *zinodes; +static struct ufs1_dinode *zinodes1; +static struct ufs2_dinode *zinodes2; /* pointers to the in-core cgs, read off disk and possibly modified */ static struct cg **cgs; @@ -615,10 +616,15 @@ initcg(int cgn) newsb->fs_cstotal.cs_nffree += cg->cg_cs.cs_nffree; newsb->fs_cstotal.cs_nbfree += cg->cg_cs.cs_nbfree; newsb->fs_cstotal.cs_nifree += cg->cg_cs.cs_nifree; - if (is_ufs2 == 0) + if (is_ufs2) { + /* Write out the cleared inodes. */ + writeat(FFS_FSBTODB(newsb, cgimin(newsb, cgn)), zinodes2, + cg->cg_initediblk * sizeof(*zinodes2)); + } else { /* Write out the cleared inodes. */ - writeat(FFS_FSBTODB(newsb, cgimin(newsb, cgn)), zinodes, - newsb->fs_ipg * sizeof(*zinodes)); + writeat(FFS_FSBTODB(newsb, cgimin(newsb, cgn)), zinodes1, + newsb->fs_ipg * sizeof(*zinodes1)); + } /* Dirty the cg. */ cgflags[cgn] |= CGF_DIRTY; } @@ -993,8 +999,15 @@ grow(void) /* Update the timestamp. */ newsb->fs_time = timestamp(); /* Allocate and clear the new-inode area, in case we add any cgs. */ - zinodes = alloconce(newsb->fs_ipg * sizeof(*zinodes), "zeroed inodes"); - memset(zinodes, 0, newsb->fs_ipg * sizeof(*zinodes)); + if (is_ufs2) { + zinodes2 = alloconce(newsb->fs_ipg * sizeof(*zinodes2), + "zeroed inodes"); + memset(zinodes2, 0, newsb->fs_ipg * sizeof(*zinodes2)); + } else { + zinodes1 = alloconce(newsb->fs_ipg * sizeof(*zinodes1), + "zeroed inodes"); + memset(zinodes1, 0, newsb->fs_ipg * sizeof(*zinodes1)); + } /* Check that the new last sector (frag, actually) is writable. Since * it's at least one frag larger than it used to be, we know we aren't