Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Mar 1995 19:38:30 +1000
From:      Bruce Evans <bde@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
Message-ID:  <199503100938.TAA28714@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>  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
   */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199503100938.TAA28714>