From d038e02fd667ab6c02875840105798aaa7029504 Mon Sep 17 00:00:00 2001 From: rgrimes Date: Thu, 26 May 1994 06:35:07 +0000 Subject: BSD 4.4 Lite sbin Sources Note: XNSrouted and routed NOT imported here, they shall be imported with usr.sbin. --- sbin/tunefs/Makefile | 6 ++ sbin/tunefs/tunefs.8 | 138 +++++++++++++++++++++++++ sbin/tunefs/tunefs.c | 284 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 428 insertions(+) create mode 100644 sbin/tunefs/Makefile create mode 100644 sbin/tunefs/tunefs.8 create mode 100644 sbin/tunefs/tunefs.c (limited to 'sbin/tunefs') diff --git a/sbin/tunefs/Makefile b/sbin/tunefs/Makefile new file mode 100644 index 0000000..92f94d7 --- /dev/null +++ b/sbin/tunefs/Makefile @@ -0,0 +1,6 @@ +# @(#)Makefile 8.1 (Berkeley) 6/5/93 + +PROG= tunefs +MAN8= tunefs.0 + +.include diff --git a/sbin/tunefs/tunefs.8 b/sbin/tunefs/tunefs.8 new file mode 100644 index 0000000..bfe4cb1 --- /dev/null +++ b/sbin/tunefs/tunefs.8 @@ -0,0 +1,138 @@ +.\" Copyright (c) 1983, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)tunefs.8 8.2 (Berkeley) 12/11/93 +.\" +.Dd December 11, 1993 +.Dt TUNEFS 8 +.Os BSD 4.2 +.Sh NAME +.Nm tunefs +.Nd tune up an existing file system +.Sh SYNOPSIS +.Nm tunefs +.Op Fl a Ar maxcontig +.Op Fl d Ar rotdelay +.Op Fl e Ar maxbpg +.Op Fl m Ar minfree +.Bk -words +.Op Fl o Ar optimize_preference +.Ek +.Op Ar special | Ar filesys +.Sh DESCRIPTION +.Nm Tunefs +is designed to change the dynamic parameters of a file system +which affect the layout policies. +The parameters which are to be changed are indicated by the flags +given below: +.Bl -tag -width Ds +.It Fl a Ar maxcontig +This specifies the maximum number of contiguous blocks that will +be laid out before forcing a rotational delay (see +.Fl d +below). +The default value is one, since most device drivers require +an interrupt per disk transfer. +Device drivers that can chain several buffers together in a single +transfer should set this to the maximum chain length. +.It Fl d Ar rotdelay +This specifies the expected time (in milliseconds) +to service a transfer completion +interrupt and initiate a new transfer on the same disk. +It is used to decide how much rotational spacing to place between +successive blocks in a file. +.It Fl e Ar maxbpg +This indicates the maximum number of blocks any single file can +allocate out of a cylinder group before it is forced to begin +allocating blocks from another cylinder group. +Typically this value is set to about one quarter of the total blocks +in a cylinder group. +The intent is to prevent any single file from using up all the +blocks in a single cylinder group, +thus degrading access times for all files subsequently allocated +in that cylinder group. +The effect of this limit is to cause big files to do long seeks +more frequently than if they were allowed to allocate all the blocks +in a cylinder group before seeking elsewhere. +For file systems with exclusively large files, +this parameter should be set higher. +.It Fl m Ar minfree +This value specifies the percentage of space held back +from normal users; the minimum free space threshold. +The default value used is 10%. +This value can be set to zero, however up to a factor of three +in throughput will be lost over the performance obtained at a 10% +threshold. +Note that if the value is raised above the current usage level, +users will be unable to allocate files until enough files have +been deleted to get under the higher threshold. +.It Fl o Ar optimize_preference +The file system can either try to minimize the time spent +allocating blocks, or it can attempt to minimize the space +fragmentation on the disk. +If the value of minfree (see above) is less than 10%, +then the file system should optimize for space to avoid +running out of full sized blocks. +For values of minfree greater than or equal to 10%, +fragmentation is unlikely to be problematical, and +the file system can be optimized for time. +.El +.Sh SEE ALSO +.Xr fs 5 , +.Xr dumpfs 8 , +.Xr newfs 8 , +.Xr mkfs 8 +.Rs +.%A M. McKusick +.%A W. Joy +.%A S. Leffler +.%A R. Fabry +.%T "A Fast File System for UNIX" +.%J "ACM Transactions on Computer Systems 2" +.%N 3 +.%P pp 181-197 +.%D August 1984 +.%O "(reprinted in the BSD System Manager's Manual, SMM:5)" +.Re +.Sh BUGS +This program should work on mounted and active file systems. +Because the super-block is not kept in the buffer cache, +the changes will only take effect if the program +is run on dismounted file systems. +To change the root file system, the system must be rebooted +after the file system is tuned. +.Pp +You can tune a file system, but you can't tune a fish. +.Sh HISTORY +The +.Nm +command appeared in +.Bx 4.2 . diff --git a/sbin/tunefs/tunefs.c b/sbin/tunefs/tunefs.c new file mode 100644 index 0000000..583dbff --- /dev/null +++ b/sbin/tunefs/tunefs.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1983, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)tunefs.c 8.2 (Berkeley) 4/19/94"; +#endif /* not lint */ + +/* + * tunefs: change layout parameters to an existing file system. + */ +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/* the optimization warning string template */ +#define OPTWARN "should optimize for %s with minfree %s %d%%" + +union { + struct fs sb; + char pad[MAXBSIZE]; +} sbun; +#define sblock sbun.sb + +int fi; +long dev_bsize = 1; + +void bwrite(daddr_t, char *, int); +int bread(daddr_t, char *, int); +void getsb(struct fs *, char *); +void usage __P((void)); + +int +main(argc, argv) + int argc; + char *argv[]; +{ + char *cp, *special, *name; + struct stat st; + int i; + int Aflag = 0; + struct fstab *fs; + char *chg[2], device[MAXPATHLEN]; + + argc--, argv++; + if (argc < 2) + usage(); + special = argv[argc - 1]; + fs = getfsfile(special); + if (fs) + special = fs->fs_spec; +again: + if (stat(special, &st) < 0) { + if (*special != '/') { + if (*special == 'r') + special++; + (void)sprintf(device, "%s/%s", _PATH_DEV, special); + special = device; + goto again; + } + err(1, "%s", special); + } + if ((st.st_mode & S_IFMT) != S_IFBLK && + (st.st_mode & S_IFMT) != S_IFCHR) + errx(10, "%s: not a block or character device", special); + getsb(&sblock, special); + for (; argc > 0 && argv[0][0] == '-'; argc--, argv++) { + for (cp = &argv[0][1]; *cp; cp++) + switch (*cp) { + + case 'A': + Aflag++; + continue; + + case 'a': + name = "maximum contiguous block count"; + if (argc < 1) + errx(10, "-a: missing %s", name); + argc--, argv++; + i = atoi(*argv); + if (i < 1) + errx(10, "%s must be >= 1 (was %s)", + name, *argv); + warnx("%s changes from %d to %d", + name, sblock.fs_maxcontig, i); + sblock.fs_maxcontig = i; + continue; + + case 'd': + name = + "rotational delay between contiguous blocks"; + if (argc < 1) + errx(10, "-d: missing %s", name); + argc--, argv++; + i = atoi(*argv); + warnx("%s changes from %dms to %dms", + name, sblock.fs_rotdelay, i); + sblock.fs_rotdelay = i; + continue; + + case 'e': + name = + "maximum blocks per file in a cylinder group"; + if (argc < 1) + errx(10, "-e: missing %s", name); + argc--, argv++; + i = atoi(*argv); + if (i < 1) + errx(10, "%s must be >= 1 (was %s)", + name, *argv); + warnx("%s changes from %d to %d", + name, sblock.fs_maxbpg, i); + sblock.fs_maxbpg = i; + continue; + + case 'm': + name = "minimum percentage of free space"; + if (argc < 1) + errx(10, "-m: missing %s", name); + argc--, argv++; + i = atoi(*argv); + if (i < 0 || i > 99) + errx(10, "bad %s (%s)", name, *argv); + warnx("%s changes from %d%% to %d%%", + name, sblock.fs_minfree, i); + sblock.fs_minfree = i; + if (i >= MINFREE && + sblock.fs_optim == FS_OPTSPACE) + warnx(OPTWARN, "time", ">=", MINFREE); + if (i < MINFREE && + sblock.fs_optim == FS_OPTTIME) + warnx(OPTWARN, "space", "<", MINFREE); + continue; + + case 'o': + name = "optimization preference"; + if (argc < 1) + errx(10, "-o: missing %s", name); + argc--, argv++; + chg[FS_OPTSPACE] = "space"; + chg[FS_OPTTIME] = "time"; + if (strcmp(*argv, chg[FS_OPTSPACE]) == 0) + i = FS_OPTSPACE; + else if (strcmp(*argv, chg[FS_OPTTIME]) == 0) + i = FS_OPTTIME; + else + errx(10, "bad %s (options are `space' or `time')", + name); + if (sblock.fs_optim == i) { + warnx("%s remains unchanged as %s", + name, chg[i]); + continue; + } + warnx("%s changes from %s to %s", + name, chg[sblock.fs_optim], chg[i]); + sblock.fs_optim = i; + if (sblock.fs_minfree >= MINFREE && + i == FS_OPTSPACE) + warnx(OPTWARN, "time", ">=", MINFREE); + if (sblock.fs_minfree < MINFREE && + i == FS_OPTTIME) + warnx(OPTWARN, "space", "<", MINFREE); + continue; + + default: + usage(); + } + } + if (argc != 1) + usage(); + bwrite((daddr_t)SBOFF / dev_bsize, (char *)&sblock, SBSIZE); + if (Aflag) + for (i = 0; i < sblock.fs_ncg; i++) + bwrite(fsbtodb(&sblock, cgsblock(&sblock, i)), + (char *)&sblock, SBSIZE); + close(fi); + exit(0); +} + +void +usage() +{ + + fprintf(stderr, "Usage: tunefs tuneup-options special-device\n"); + fprintf(stderr, "where tuneup-options are:\n"); + fprintf(stderr, "\t-a maximum contiguous blocks\n"); + fprintf(stderr, "\t-d rotational delay between contiguous blocks\n"); + fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n"); + fprintf(stderr, "\t-m minimum percentage of free space\n"); + fprintf(stderr, "\t-o optimization preference (`space' or `time')\n"); + exit(2); +} + +void +getsb(fs, file) + register struct fs *fs; + char *file; +{ + + fi = open(file, 2); + if (fi < 0) + err(3, "cannot open %s", file); + if (bread((daddr_t)SBOFF, (char *)fs, SBSIZE)) + err(4, "%s: bad super block", file); + if (fs->fs_magic != FS_MAGIC) + err(5, "%s: bad magic number", file); + dev_bsize = fs->fs_fsize / fsbtodb(fs, 1); +} + +void +bwrite(blk, buf, size) + daddr_t blk; + char *buf; + int size; +{ + + if (lseek(fi, (off_t)blk * dev_bsize, SEEK_SET) < 0) + err(6, "FS SEEK"); + if (write(fi, buf, size) != size) + err(7, "FS WRITE"); +} + +int +bread(bno, buf, cnt) + daddr_t bno; + char *buf; + int cnt; +{ + int i; + + if (lseek(fi, (off_t)bno * dev_bsize, SEEK_SET) < 0) + return(1); + if ((i = read(fi, buf, cnt)) != cnt) { + for(i=0; i