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:
parent
040884b5e6
commit
61d1fe8df3
|
@ -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
|
* Copyright (c) 1991, 1993
|
||||||
|
@ -52,72 +52,16 @@
|
||||||
#define DFL_FRAGSIZE 1024
|
#define DFL_FRAGSIZE 1024
|
||||||
#define DFL_BLKSIZE 8192
|
#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
|
* MINFREE gives the minimum acceptable percentage of file system
|
||||||
* blocks which may be free. If the freelist drops below this level
|
* blocks which may be free. If the freelist drops below this level
|
||||||
* only the superuser may continue to allocate blocks. This may
|
* only the superuser may continue to allocate blocks. This may
|
||||||
* be set to 0 if no reserve of free blocks is deemed necessary,
|
* be set to 0 if no reserve of free blocks is deemed necessary,
|
||||||
* however throughput drops by fifty percent if the file system
|
* however throughput drops by (how many?) percent if the file system
|
||||||
* is run at between 90% and 100% full; thus the default value of
|
* is run at between 80% and 100% full; thus the default value of
|
||||||
* fs_minfree is 10%. With 10% free space, fragmentation is not a
|
* fs_minfree is 20%.
|
||||||
* problem, so we choose to optimize for time.
|
|
||||||
*/
|
*/
|
||||||
#define MINFREE 10
|
#define MINFREE 20
|
||||||
#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 */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following constants set the default block and segment size for a log
|
* The following constants set the default block and segment size for a log
|
||||||
|
|
|
@ -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
|
* Copyright (c) 1991, 1993
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
#if 0
|
#if 0
|
||||||
static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95";
|
static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95";
|
||||||
#else
|
#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
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
|
@ -148,6 +148,7 @@ static struct lfs lfs_default = {
|
||||||
/* dlfs_nclean */ 0,
|
/* dlfs_nclean */ 0,
|
||||||
/* dlfs_fsmnt */ { 0 },
|
/* dlfs_fsmnt */ { 0 },
|
||||||
/* dlfs_clean */ 0,
|
/* dlfs_clean */ 0,
|
||||||
|
/* dlfs_dmeta */ 0,
|
||||||
|
|
||||||
/* dlfs_pad */ { 0 },
|
/* dlfs_pad */ { 0 },
|
||||||
/* dlfs_cksum */ 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_sushift = log2(lfsp->lfs_sepb);
|
||||||
lfsp->lfs_size = partp->p_size >> lfsp->lfs_fsbtodb;
|
lfsp->lfs_size = partp->p_size >> lfsp->lfs_fsbtodb;
|
||||||
lfsp->lfs_dsize = lfsp->lfs_size - (LFS_LABELPAD >> lfsp->lfs_bshift);
|
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;
|
lfsp->lfs_maxfilesize = maxtable[lfsp->lfs_bshift] << lfsp->lfs_bshift;
|
||||||
|
|
||||||
if(lfsp->lfs_nseg < MIN_FREE_SEGS + 1
|
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);
|
fprintf(stderr,"Using segment size %d\n", ssize);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The number of free blocks is set from the number of segments times
|
* The number of free blocks is set from the number of segments
|
||||||
* the segment size - MIN_FREE_SEGS (that we never write because we need to make
|
* times the segment size - MIN_FREE_SEGS (that we never write
|
||||||
* sure the cleaner can run). Then we'll subtract off the room for the
|
* because we need to make sure the cleaner can run). Then
|
||||||
* superblocks ifile entries and segment usage table.
|
* 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_dsize = fsbtodb(lfsp, (lfsp->lfs_nseg - MIN_FREE_SEGS) * lfsp->lfs_ssize);
|
||||||
lfsp->lfs_bfree = lfsp->lfs_dsize;
|
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)
|
if ((sb_interval = lfsp->lfs_nseg / LFS_MAXNUMSB) < LFS_MIN_SBINTERVAL)
|
||||||
sb_interval = 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
|
* Now, lay out the file system. We need to figure out where
|
||||||
* the superblocks go, initialize the checkpoint information
|
* 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;
|
segp->su_flags = SEGUSE_SUPERBLOCK | SEGUSE_DIRTY;
|
||||||
lfsp->lfs_bfree -= LFS_SUMMARY_SIZE / lp->d_secsize;
|
lfsp->lfs_bfree -= LFS_SUMMARY_SIZE / lp->d_secsize;
|
||||||
lfsp->lfs_bfree -=
|
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
|
* 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
|
* Initialize dynamic accounting. The blocks available for
|
||||||
* writing are the bfree blocks minus 1 segment summary for
|
* writing are the bfree blocks minus 1 segment summary for
|
||||||
* each segment since you can't write any new data without
|
* each segment since you can't write any new data without
|
||||||
* creating a segment summary - 2 segments that the cleaner
|
* creating a segment summary.
|
||||||
* needs.
|
|
||||||
*/
|
*/
|
||||||
lfsp->lfs_avail = lfsp->lfs_bfree - lfsp->lfs_nseg -
|
lfsp->lfs_avail = lfsp->lfs_bfree - lfsp->lfs_nseg;
|
||||||
fsbtodb(lfsp, 2 * lfsp->lfs_ssize);
|
|
||||||
lfsp->lfs_uinodes = 0;
|
lfsp->lfs_uinodes = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ready to start writing segments. The first segment is different
|
* Ready to start writing segments. The first segment is different
|
||||||
* because it contains the segment usage table and the ifile inode
|
* because it contains the segment usage table and the ifile inode
|
||||||
|
|
Loading…
Reference in New Issue