Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/newfs_lfs User-level changes for filling the disk.
details: https://anonhg.NetBSD.org/src/rev/ea5f6f77a82e
branches: trunk
changeset: 493952:ea5f6f77a82e
user: perseant <perseant%NetBSD.org@localhost>
date: Tue Jun 27 21:06:24 2000 +0000
description:
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.
diffstat:
sbin/newfs_lfs/config.h | 66 +++---------------------------------------------
sbin/newfs_lfs/lfs.c | 29 ++++++++++++--------
2 files changed, 22 insertions(+), 73 deletions(-)
diffs (172 lines):
diff -r 7d6423468a4c -r ea5f6f77a82e sbin/newfs_lfs/config.h
--- a/sbin/newfs_lfs/config.h Tue Jun 27 20:59:23 2000 +0000
+++ b/sbin/newfs_lfs/config.h Tue Jun 27 21:06:24 2000 +0000
@@ -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
@@ -53,71 +53,15 @@
#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.
- */
-#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.
+ * 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 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
diff -r 7d6423468a4c -r ea5f6f77a82e sbin/newfs_lfs/lfs.c
--- a/sbin/newfs_lfs/lfs.c Tue Jun 27 20:59:23 2000 +0000
+++ b/sbin/newfs_lfs/lfs.c Tue Jun 27 21:06:24 2000 +0000
@@ -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 @@
/* dlfs_nclean */ 0,
/* dlfs_fsmnt */ { 0 },
/* dlfs_clean */ 0,
+ /* dlfs_dmeta */ 0,
/* dlfs_pad */ { 0 },
/* dlfs_cksum */ 0
@@ -309,7 +310,8 @@
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 @@
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 @@
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 @@
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 @@
* 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
Home |
Main Index |
Thread Index |
Old Index