From owner-cvs-etc Fri Mar 10 01:41:29 1995 Return-Path: cvs-etc-owner Received: (from majordom@localhost) by freefall.cdrom.com (8.6.10/8.6.6) id BAA11699 for cvs-etc-outgoing; Fri, 10 Mar 1995 01:41:29 -0800 Received: from godzilla.zeta.org.au (godzilla.zeta.org.au [203.2.228.34]) by freefall.cdrom.com (8.6.10/8.6.6) with ESMTP id BAA11659; Fri, 10 Mar 1995 01:40:49 -0800 Received: (from bde@localhost) by godzilla.zeta.org.au (8.6.9/8.6.9) id TAA28714; Fri, 10 Mar 1995 19:38:30 +1000 Date: Fri, 10 Mar 1995 19:38:30 +1000 From: Bruce Evans Message-Id: <199503100938.TAA28714@godzilla.zeta.org.au> To: CVS-commiters@freefall.cdrom.com, cvs-etc@freefall.cdrom.com, rgrimes@freefall.cdrom.com Subject: Re: cvs commit: src/etc Makefile Sender: cvs-etc-owner@freebsd.org Precedence: bulk > Modified: etc Makefile > Log: > Simplify all the newfs commands into ${NEWFS} and add -t 0 -u 0 so > we can again newfs floppies. Someone should unbreak newfs before the broken version infects everything. The following changes are to make the -i option to newfs work (almost) as documented even for strange geometries and to fix some overflow bugs. They seem to have the side affect of making plain newfs work once again on floppies. Previously newfs wanted to make a bogus number of cylinder groups (5) although there is only room for a partial cylinder group (2880/4096) of one) and a bogus number of inodes (approx. 5*4096/2880 times as many as it should). Bruce *** mkfs.c~ Sat Oct 22 12:21:53 1994 --- mkfs.c Sun Mar 5 20:32:44 1995 *************** *** 122,125 **** --- 122,126 ---- int fsi, fso; daddr_t alloc(); + long calcipg(); mkfs(pp, fsys, fi, fo) *************** *** 131,134 **** --- 132,136 ---- long cylno, rpos, blk, j, warn = 0; long used, mincpgcnt, bpcg; + off_t usedb; long mapcramped, inodecramped; long postblsize, rotblsize, totalsbsize; *************** *** 345,350 **** */ inodecramped = 0; ! used *= sectorsize; ! inospercg = roundup((mincpg * bpcg - used) / density, INOPB(&sblock)); sblock.fs_ipg = inospercg; while (inospercg > MAXIPG(&sblock)) { --- 347,351 ---- */ inodecramped = 0; ! inospercg = calcipg(mincpg, bpcg, &usedb); sblock.fs_ipg = inospercg; while (inospercg > MAXIPG(&sblock)) { *************** *** 354,359 **** break; printf("With a block size of %d %s %d\n", sblock.fs_bsize, ! "minimum bytes per inode is", ! (mincpg * bpcg - used) / MAXIPG(&sblock) + 1); sblock.fs_bsize >>= 1; sblock.fs_frag >>= 1; --- 355,361 ---- break; printf("With a block size of %d %s %d\n", sblock.fs_bsize, ! "minimum bytes per inode is", ! (int)((mincpg * (off_t)bpcg - usedb) ! / MAXIPG(&sblock) + 1)); sblock.fs_bsize >>= 1; sblock.fs_frag >>= 1; *************** *** 366,371 **** } mincpg = sblock.fs_cpg; ! inospercg = ! roundup((mincpg * bpcg - used) / density, INOPB(&sblock)); sblock.fs_ipg = inospercg; } --- 368,372 ---- } mincpg = sblock.fs_cpg; ! inospercg = calcipg(mincpg, bpcg, &usedb); sblock.fs_ipg = inospercg; } *************** *** 373,377 **** if (inospercg > MAXIPG(&sblock)) { printf("Minimum bytes per inode is %d\n", ! (mincpg * bpcg - used) / MAXIPG(&sblock) + 1); } else if (!mapcramped) { printf("With %d bytes per inode, ", density); --- 374,379 ---- if (inospercg > MAXIPG(&sblock)) { printf("Minimum bytes per inode is %d\n", ! (int)((mincpg * (off_t)bpcg - usedb) ! / MAXIPG(&sblock) + 1)); } else if (!mapcramped) { printf("With %d bytes per inode, ", density); *************** *** 408,418 **** * Must ensure there is enough space for inodes. */ ! sblock.fs_ipg = roundup((sblock.fs_cpg * bpcg - used) / density, ! INOPB(&sblock)); while (sblock.fs_ipg > MAXIPG(&sblock)) { inodecramped = 1; sblock.fs_cpg -= mincpc; ! sblock.fs_ipg = roundup((sblock.fs_cpg * bpcg - used) / density, ! INOPB(&sblock)); } /* --- 410,418 ---- * Must ensure there is enough space for inodes. */ ! sblock.fs_ipg = calcipg(sblock.fs_cpg, bpcg, &usedb); while (sblock.fs_ipg > MAXIPG(&sblock)) { inodecramped = 1; sblock.fs_cpg -= mincpc; ! sblock.fs_ipg = calcipg(sblock.fs_cpg, bpcg, &usedb); } /* *************** *** 422,427 **** mapcramped = 1; sblock.fs_cpg -= mincpc; ! sblock.fs_ipg = roundup((sblock.fs_cpg * bpcg - used) / density, ! INOPB(&sblock)); } sblock.fs_fpg = (sblock.fs_cpg * sblock.fs_spc) / NSPF(&sblock); --- 422,426 ---- mapcramped = 1; sblock.fs_cpg -= mincpc; ! sblock.fs_ipg = calcipg(sblock.fs_cpg, bpcg, &usedb); } sblock.fs_fpg = (sblock.fs_cpg * sblock.fs_spc) / NSPF(&sblock); *************** *** 997,1000 **** --- 996,1035 ---- /* + * Calculate number of inodes per group. + */ + long + calcipg(cpg, bpcg, usedbp) + long cpg; + long bpcg; + off_t *usedbp; + { + int i; + long ipg, new_ipg, ncg, ncyl; + off_t usedb; + + /* + * Prepare to scale by fssize / (number of sectors in cylinder groups). + */ + ncyl = howmany(fssize * NSPF(&sblock), secpercyl); + ncg = howmany(ncyl, cpg); + /* + * Iterate a few times to allow for ipg depending on itself. + */ + ipg = 0; + for (i = 0; i < 10; i++) { + usedb = (sblock.fs_iblkno + ipg / INOPF(&sblock)) + * NSPF(&sblock) * (off_t)sectorsize; + new_ipg = (cpg * (quad_t)bpcg - usedb) / density * fssize + / ncg / secpercyl / cpg; + new_ipg = roundup(new_ipg, INOPB(&sblock)); + if (new_ipg == ipg) + break; + ipg = new_ipg; + } + *usedbp = usedb; + return (ipg); + } + + /* * Allocate an inode on the disk */