User-level changes for filling the disk.

Set MINFREE to 80, since that's a more reasonable value according to the
literature than FFS' 90.  Remove a bunch of other unused FFS cruft from
config.h.

Initialize lfs_bfree correctly vis-a-vis MIN_FREE_SEGS, so the
filesystem doesn't over-represent the amount of free space it has.
Initialize lfs_dmeta so the kernel can estimate starting from a
reasonable value.
This commit is contained in:
perseant 2000-06-27 21:06:24 +00:00
parent 040884b5e6
commit 61d1fe8df3
2 changed files with 22 additions and 73 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: config.h,v 1.1 1999/03/18 17:18:05 perseant Exp $ */
/* $NetBSD: config.h,v 1.2 2000/06/27 21:06:24 perseant Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -52,72 +52,16 @@
#define DFL_FRAGSIZE 1024
#define DFL_BLKSIZE 8192
/*
* Cylinder groups may have up to many cylinders. The actual
* number used depends upon how much information can be stored
* on a single cylinder. The default is to use 16 cylinders
* per group.
*/
#define DESCPG 16 /* desired fs_cpg */
/*
* MINFREE gives the minimum acceptable percentage of file system
* blocks which may be free. If the freelist drops below this level
* only the superuser may continue to allocate blocks. This may
* be set to 0 if no reserve of free blocks is deemed necessary,
* however throughput drops by fifty percent if the file system
* is run at between 90% and 100% full; thus the default value of
* fs_minfree is 10%. With 10% free space, fragmentation is not a
* problem, so we choose to optimize for time.
* however throughput drops by (how many?) percent if the file system
* is run at between 80% and 100% full; thus the default value of
* fs_minfree is 20%.
*/
#define MINFREE 10
#define DEFAULTOPT FS_OPTTIME
/*
* Preference for optimization.
*/
#define FS_OPTTIME 0 /* minimize allocation time */
#define FS_OPTSPACE 1 /* minimize disk fragmentation */
/*
* ROTDELAY gives the minimum number of milliseconds to initiate
* another disk transfer on the same cylinder. It is used in
* determining the rotationally optimal layout for disk blocks
* within a file; the default of fs_rotdelay is 4ms.
*/
#define ROTDELAY 4
/*
* MAXCONTIG sets the default for the maximum number of blocks
* that may be allocated sequentially. Since UNIX drivers are
* not capable of scheduling multi-block transfers, this defaults
* to 1 (ie no contiguous blocks are allocated).
*/
#define MAXCONTIG 1
/*
* MAXBLKPG determines the maximum number of data blocks which are
* placed in a single cylinder group. The default is one indirect
* block worth of data blocks.
*/
#define MAXBLKPG(bsize) ((bsize) / sizeof(daddr_t))
/*
* Each file system has a number of inodes statically allocated.
* We allocate one inode slot per NFPI fragments, expecting this
* to be far more than we will ever need.
*/
#define NFPI 4
/*
* For each cylinder we keep track of the availability of blocks at different
* rotational positions, so that we can lay out the data to be picked
* up with minimum rotational latency. NRPOS is the default number of
* rotational positions that we distinguish. With NRPOS of 8 the resolution
* of our summary information is 2ms for a typical 3600 rpm drive.
*/
#define NRPOS 8 /* number distinct rotational positions */
#define MINFREE 20
/*
* The following constants set the default block and segment size for a log

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs.c,v 1.12 2000/05/23 18:17:20 perseant Exp $ */
/* $NetBSD: lfs.c,v 1.13 2000/06/27 21:06:25 perseant Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95";
#else
__RCSID("$NetBSD: lfs.c,v 1.12 2000/05/23 18:17:20 perseant Exp $");
__RCSID("$NetBSD: lfs.c,v 1.13 2000/06/27 21:06:25 perseant Exp $");
#endif
#endif /* not lint */
@ -148,6 +148,7 @@ static struct lfs lfs_default = {
/* dlfs_nclean */ 0,
/* dlfs_fsmnt */ { 0 },
/* dlfs_clean */ 0,
/* dlfs_dmeta */ 0,
/* dlfs_pad */ { 0 },
/* dlfs_cksum */ 0
@ -309,7 +310,8 @@ make_lfs(fd, lp, partp, minfree, block_size, frag_size, seg_size)
lfsp->lfs_sushift = log2(lfsp->lfs_sepb);
lfsp->lfs_size = partp->p_size >> lfsp->lfs_fsbtodb;
lfsp->lfs_dsize = lfsp->lfs_size - (LFS_LABELPAD >> lfsp->lfs_bshift);
lfsp->lfs_nclean = lfsp->lfs_nseg = lfsp->lfs_dsize / lfsp->lfs_ssize;
lfsp->lfs_nseg = lfsp->lfs_dsize / lfsp->lfs_ssize;
lfsp->lfs_nclean = lfsp->lfs_nseg - 1;
lfsp->lfs_maxfilesize = maxtable[lfsp->lfs_bshift] << lfsp->lfs_bshift;
if(lfsp->lfs_nseg < MIN_FREE_SEGS + 1
@ -330,10 +332,11 @@ make_lfs(fd, lp, partp, minfree, block_size, frag_size, seg_size)
fprintf(stderr,"Using segment size %d\n", ssize);
/*
* The number of free blocks is set from the number of segments times
* the segment size - MIN_FREE_SEGS (that we never write because we need to make
* sure the cleaner can run). Then we'll subtract off the room for the
* superblocks ifile entries and segment usage table.
* The number of free blocks is set from the number of segments
* times the segment size - MIN_FREE_SEGS (that we never write
* because we need to make sure the cleaner can run). Then
* we'll subtract off the room for the superblocks ifile entries
* and segment usage table.
*/
lfsp->lfs_dsize = fsbtodb(lfsp, (lfsp->lfs_nseg - MIN_FREE_SEGS) * lfsp->lfs_ssize);
lfsp->lfs_bfree = lfsp->lfs_dsize;
@ -344,6 +347,8 @@ make_lfs(fd, lp, partp, minfree, block_size, frag_size, seg_size)
if ((sb_interval = lfsp->lfs_nseg / LFS_MAXNUMSB) < LFS_MIN_SBINTERVAL)
sb_interval = LFS_MIN_SBINTERVAL;
/* To start, one inode block and one segsum are dirty metadata */
lfsp->lfs_dmeta = 1 + fsbtodb(lfsp, 1);
/*
* Now, lay out the file system. We need to figure out where
* the superblocks go, initialize the checkpoint information
@ -401,7 +406,8 @@ make_lfs(fd, lp, partp, minfree, block_size, frag_size, seg_size)
segp->su_flags = SEGUSE_SUPERBLOCK | SEGUSE_DIRTY;
lfsp->lfs_bfree -= LFS_SUMMARY_SIZE / lp->d_secsize;
lfsp->lfs_bfree -=
fsbtodb(lfsp, lfsp->lfs_cleansz + lfsp->lfs_segtabsz + 4);
fsbtodb(lfsp, lfsp->lfs_cleansz + lfsp->lfs_segtabsz + 4 +
MIN_FREE_SEGS * lfsp->lfs_ssize);
/*
* Now figure out the address of the ifile inode. The inode block
@ -426,12 +432,11 @@ make_lfs(fd, lp, partp, minfree, block_size, frag_size, seg_size)
* Initialize dynamic accounting. The blocks available for
* writing are the bfree blocks minus 1 segment summary for
* each segment since you can't write any new data without
* creating a segment summary - 2 segments that the cleaner
* needs.
* creating a segment summary.
*/
lfsp->lfs_avail = lfsp->lfs_bfree - lfsp->lfs_nseg -
fsbtodb(lfsp, 2 * lfsp->lfs_ssize);
lfsp->lfs_avail = lfsp->lfs_bfree - lfsp->lfs_nseg;
lfsp->lfs_uinodes = 0;
/*
* Ready to start writing segments. The first segment is different
* because it contains the segment usage table and the ifile inode