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