1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-03 09:00:21 +00:00

Second try: attempt to import Lite2's newfs.

This commit is contained in:
Bruce Evans 1996-10-15 08:40:58 +00:00
parent d4c31a75a3
commit b7999b5100
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/CSRG/dist/; revision=18938
3 changed files with 2244 additions and 0 deletions

1265
sbin/newfs/mkfs.c Normal file

File diff suppressed because it is too large Load Diff

298
sbin/newfs/newfs.8 Normal file
View File

@ -0,0 +1,298 @@
.\" Copyright (c) 1983, 1987, 1991, 1993, 1994
.\" 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.
.\"
.\" @(#)newfs.8 8.6 (Berkeley) 5/3/95
.\"
.Dd May 3, 1995
.Dt NEWFS 8
.Os BSD 4.2
.Sh NAME
.Nm newfs ,
.Nm mount_mfs
.Nd construct a new file system
.Sh SYNOPSIS
.Nm newfs
.Op Fl NO
.Op Fl S Ar sector-size
.Op Fl T Ar disktype
.Op Fl a Ar maxcontig
.Op Fl b Ar block-size
.Op Fl c Ar cylinders
.Op Fl d Ar rotdelay
.Op Fl e Ar maxbpg
.Op Fl f Ar frag-size
.Op Fl i Ar bytes
.Op Fl k Ar skew
.Op Fl l Ar interleave
.Op Fl m Ar free space
.Op Fl n Ar rotational positions
.Op Fl o Ar optimization
.Op Fl p Ar sectors
.Op Fl r Ar revolutions
.Op Fl s Ar size
.Op Fl t Ar tracks
.Op Fl u Ar sectors
.Op Fl x Ar sectors
.Ar special
.Nm mount_mfs
.Op Fl N
.Op Fl T Ar disktype
.Op Fl a Ar maxcontig
.Op Fl b Ar block-size
.Op Fl c Ar cylinders
.Op Fl d Ar rotdelay
.Op Fl e Ar maxbpg
.Op Fl f Ar frag-size
.Op Fl i Ar bytes
.Op Fl m Ar free space
.Op Fl n Ar rotational positions
.Op Fl o Ar options
.Op Fl s Ar size
.Ar special node
.Sh DESCRIPTION
.Nm Newfs
replaces the more obtuse
.Xr mkfs 8
program.
Before running
.Nm newfs
or
.Nm mount_mfs ,
the disk must be labeled using
.Xr disklabel 8 .
.Nm Newfs
builds a file system on the specified special device
basing its defaults on the information in the disk label.
Typically the defaults are reasonable, however
.Nm newfs
has numerous options to allow the defaults to be selectively overridden.
.Pp
.Nm Mount_mfs
is used to build a file system in virtual memory and then mount it
on a specified node.
.Nm Mount_mfs
exits and the contents of the file system are lost
when the file system is unmounted.
If
.Nm mount_mfs
is sent a signal while running,
for example during system shutdown,
it will attempt to unmount its
corresponding file system.
The parameters to
.Nm mount_mfs
are the same as those to
.Nm newfs .
If the
.Fl T
flag is specified (see below), the special file is unused.
Otherwise, it is only used to read the disk label which provides
a set of configuration parameters for the memory based file system.
The special file is typically that of the primary swap area,
since that is where the file system will be backed up when
free memory gets low and the memory supporting
the file system has to be paged.
.Pp
The following options define the general layout policies.
.Bl -tag -width Fl
.It Fl N
Causes the file system parameters to be printed out
without really creating the file system.
.It Fl O
Creates a 4.3BSD format filesystem.
This options is primarily used to build root filesystems
that can be understood by older boot ROMs.
.It Fl T
Uses information for the specified disk from
.Pa /etc/disktab
instead of trying to get the information from a disklabel.
.It Fl a Ar maxcontig
This specifies the maximum number of contiguous blocks that will be
laid out before forcing a rotational delay (see the
.Fl d
option).
The default value is one.
See
.Xr tunefs 8
for more details on how to set this option.
.It Fl b Ar block-size
The block size of the file system, in bytes.
.It Fl c Ar #cylinders/group
The number of cylinders per cylinder group in a file system.
The default value is 16.
.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.
The default is 4 milliseconds.
See
.Xr tunefs 8
for more details on how to set this option.
.ne 1i
.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.
The default is about one quarter of the total blocks in a cylinder group.
See
.Xr tunefs 8
for more details on how to set this option.
.It Fl f Ar frag-size
The fragment size of the file system in bytes.
.It Fl i Ar number of bytes per inode
This specifies the density of inodes in the file system.
The default is to create an inode for each 2048 bytes of data space.
If fewer inodes are desired, a larger number should be used;
to create more inodes a smaller number should be given.
.It Fl m Ar free space \&%
The percentage of space reserved from normal users; the minimum free
space threshold.
The default value used is 10%.
See
.Xr tunefs 8
for more details on how to set this option.
.It Fl n Ar rotational\ positions
Determines how many rotational time slots there are in
one revolution of the disk.
.It Fl o Ar optimization\ preference
.Pq ``space'' or ``time''
The file system can either be instructed to try to minimize the time spent
allocating blocks, or to try to minimize the space fragmentation on the disk.
If the value of minfree (see above) is less than 10%,
the default is to optimize for space;
if the value of minfree is greater than or equal to 10%,
the default is to optimize for time.
See
.Xr tunefs 8
for more details on how to set this option.
.It Fl s Ar size
The size of the file system in sectors.
.El
.Pp
The following options override the standard sizes for the disk geometry.
Their default values are taken from the disk label.
Changing these defaults is useful only when using
.Nm newfs
to build a file system whose raw image will eventually be used on a
different type of disk than the one on which it is initially created
(for example on a write-once disk).
Note that changing any of these values from their defaults will make
it impossible for
.Xr fsck
to find the alternate superblocks if the standard superblock is lost.
.Bl -tag -width Fl
.It Fl S Ar sector-size
The size of a sector in bytes (almost never anything but 512).
.It Fl k Ar sector \&0 skew , per track
Used to describe perturbations in the media format to compensate for
a slow controller.
Track skew is the offset of sector 0 on track N relative to sector 0
on track N-1 on the same cylinder.
.It Fl l Ar hardware sector interleave
Used to describe perturbations in the media format to compensate for
a slow controller.
Interleave is physical sector interleave on each track,
specified as the denominator of the ratio:
.Dl sectors read/sectors passed over
Thus an interleave of 1/1 implies contiguous layout, while 1/2 implies
logical sector 0 is separated by one sector from logical sector 1.
.It Fl p Ar spare sectors per track
Spare sectors (bad sector replacements) are physical sectors that occupy
space at the end of each track.
They are not counted as part of the sectors/track
.Pq Fl u
since they are not available to the file system for data allocation.
.It Fl r Ar revolutions/minute
The speed of the disk in revolutions per minute.
.ne 1i
.It Fl t Ar #tracks/cylinder
The number of tracks/cylinder available for data allocation by the file
system.
.It Fl u Ar sectors/track
The number of sectors per track available for data allocation by the file
system.
This does not include sectors reserved at the end of each track for bad
block replacement (see the
.Fl p
option.)
.It Fl x Ar spare sectors per cylinder
Spare sectors (bad sector replacements) are physical sectors that occupy
space at the end of the last track in the cylinder.
They are deducted from the sectors/track
.Pq Fl u
of the last track of each cylinder since they are not available to the file
system for data allocation.
.El
.Pp
The options to the
.Nm mount_mfs
command are as described for the
.Nm newfs
command, except for the
.Fl o
option.
.Pp
That option is as follows:
.Bl -tag -width indent
.It Fl o
Options are specified with a
.Fl o
flag followed by a comma separated string of options.
See the
.Xr mount 8
man page for possible options and their meanings.
.El
.Sh SEE ALSO
.Xr disktab 5 ,
.Xr fs 5 ,
.Xr dumpfs 8 ,
.Xr disklabel 8 ,
.Xr diskpart 8 ,
.Xr fsck 8 ,
.Xr format 8 ,
.Xr mount 8 ,
.Xr tunefs 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
.%V 3
.%P pp 181-197
.%D August 1984
.%O (reprinted in the BSD System Manager's Manual)
.Re
.Sh HISTORY
The
.Nm
command appeared in
.Bx 4.2 .

681
sbin/newfs/newfs.c Normal file
View File

@ -0,0 +1,681 @@
/*
* Copyright (c) 1983, 1989, 1993, 1994
* 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 sccsid[] = "@(#)newfs.c 8.13 (Berkeley) 5/1/95";
#endif /* not lint */
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1983, 1989, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
/*
* newfs: friendly front end to mkfs
*/
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/disklabel.h>
#include <sys/file.h>
#include <sys/mount.h>
#include <ufs/ufs/dir.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
#include <ufs/ufs/ufsmount.h>
#include <ctype.h>
#include <errno.h>
#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#if __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include "mntopts.h"
struct mntopt mopts[] = {
MOPT_STDOPTS,
MOPT_ASYNC,
{ NULL },
};
#if __STDC__
void fatal(const char *fmt, ...);
#else
void fatal();
#endif
#define COMPAT /* allow non-labeled disks */
/*
* The following two constants set the default block and fragment sizes.
* Both constants must be a power of 2 and meet the following constraints:
* MINBSIZE <= DESBLKSIZE <= MAXBSIZE
* sectorsize <= DESFRAGSIZE <= DESBLKSIZE
* DESBLKSIZE / DESFRAGSIZE <= 8
*/
#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 */
/*
* 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
/*
* 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 */
int mfs; /* run as the memory based filesystem */
int Nflag; /* run without writing file system */
int Oflag; /* format as an 4.3BSD file system */
int fssize; /* file system size */
int ntracks; /* # tracks/cylinder */
int nsectors; /* # sectors/track */
int nphyssectors; /* # sectors/track including spares */
int secpercyl; /* sectors per cylinder */
int trackspares = -1; /* spare sectors per track */
int cylspares = -1; /* spare sectors per cylinder */
int sectorsize; /* bytes/sector */
#ifdef tahoe
int realsectorsize; /* bytes/sector in hardware */
#endif
int rpm; /* revolutions/minute of drive */
int interleave; /* hardware sector interleave */
int trackskew = -1; /* sector 0 skew, per track */
int headswitch; /* head switch time, usec */
int trackseek; /* track-to-track seek, usec */
int fsize = 0; /* fragment size */
int bsize = 0; /* block size */
int cpg = DESCPG; /* cylinders/cylinder group */
int cpgflg; /* cylinders/cylinder group flag was given */
int minfree = MINFREE; /* free space threshold */
int opt = DEFAULTOPT; /* optimization preference (space or time) */
int density; /* number of bytes per inode */
int maxcontig = 0; /* max contiguous blocks to allocate */
int rotdelay = ROTDELAY; /* rotational delay between blocks */
int maxbpg; /* maximum blocks per file in a cyl group */
int nrpos = NRPOS; /* # of distinguished rotational positions */
int bbsize = BBSIZE; /* boot block size */
int sbsize = SBSIZE; /* superblock size */
int mntflags = MNT_ASYNC; /* flags to be passed to mount */
u_long memleft; /* virtual memory available */
caddr_t membase; /* start address of memory based filesystem */
#ifdef COMPAT
char *disktype;
int unlabeled;
#endif
char device[MAXPATHLEN];
char *progname;
int
main(argc, argv)
int argc;
char *argv[];
{
extern char *optarg;
extern int optind;
register int ch;
register struct partition *pp;
register struct disklabel *lp;
struct disklabel *getdisklabel();
struct partition oldpartition;
struct stat st;
struct statfs *mp;
int fsi, fso, len, n;
char *cp, *s1, *s2, *special, *opstring, buf[BUFSIZ];
if (progname = strrchr(*argv, '/'))
++progname;
else
progname = *argv;
if (strstr(progname, "mfs")) {
mfs = 1;
Nflag++;
}
opstring = mfs ?
"NT:a:b:c:d:e:f:i:m:o:s:" :
"NOS:T:a:b:c:d:e:f:i:k:l:m:n:o:p:r:s:t:u:x:";
while ((ch = getopt(argc, argv, opstring)) != EOF)
switch (ch) {
case 'N':
Nflag = 1;
break;
case 'O':
Oflag = 1;
break;
case 'S':
if ((sectorsize = atoi(optarg)) <= 0)
fatal("%s: bad sector size", optarg);
break;
#ifdef COMPAT
case 'T':
disktype = optarg;
break;
#endif
case 'a':
if ((maxcontig = atoi(optarg)) <= 0)
fatal("%s: bad maximum contiguous blocks\n",
optarg);
break;
case 'b':
if ((bsize = atoi(optarg)) < MINBSIZE)
fatal("%s: bad block size", optarg);
break;
case 'c':
if ((cpg = atoi(optarg)) <= 0)
fatal("%s: bad cylinders/group", optarg);
cpgflg++;
break;
case 'd':
if ((rotdelay = atoi(optarg)) < 0)
fatal("%s: bad rotational delay\n", optarg);
break;
case 'e':
if ((maxbpg = atoi(optarg)) <= 0)
fatal("%s: bad blocks per file in a cylinder group\n",
optarg);
break;
case 'f':
if ((fsize = atoi(optarg)) <= 0)
fatal("%s: bad fragment size", optarg);
break;
case 'i':
if ((density = atoi(optarg)) <= 0)
fatal("%s: bad bytes per inode\n", optarg);
break;
case 'k':
if ((trackskew = atoi(optarg)) < 0)
fatal("%s: bad track skew", optarg);
break;
case 'l':
if ((interleave = atoi(optarg)) <= 0)
fatal("%s: bad interleave", optarg);
break;
case 'm':
if ((minfree = atoi(optarg)) < 0 || minfree > 99)
fatal("%s: bad free space %%\n", optarg);
break;
case 'n':
if ((nrpos = atoi(optarg)) <= 0)
fatal("%s: bad rotational layout count\n",
optarg);
break;
case 'o':
if (mfs)
getmntopts(optarg, mopts, &mntflags, 0);
else {
if (strcmp(optarg, "space") == 0)
opt = FS_OPTSPACE;
else if (strcmp(optarg, "time") == 0)
opt = FS_OPTTIME;
else
fatal("%s: unknown optimization preference: use `space' or `time'.");
}
break;
case 'p':
if ((trackspares = atoi(optarg)) < 0)
fatal("%s: bad spare sectors per track",
optarg);
break;
case 'r':
if ((rpm = atoi(optarg)) <= 0)
fatal("%s: bad revolutions/minute\n", optarg);
break;
case 's':
if ((fssize = atoi(optarg)) <= 0)
fatal("%s: bad file system size", optarg);
break;
case 't':
if ((ntracks = atoi(optarg)) <= 0)
fatal("%s: bad total tracks", optarg);
break;
case 'u':
if ((nsectors = atoi(optarg)) <= 0)
fatal("%s: bad sectors/track", optarg);
break;
case 'x':
if ((cylspares = atoi(optarg)) < 0)
fatal("%s: bad spare sectors per cylinder",
optarg);
break;
case '?':
default:
usage();
}
argc -= optind;
argv += optind;
if (argc != 2 && (mfs || argc != 1))
usage();
special = argv[0];
cp = strrchr(special, '/');
if (cp == 0) {
/*
* No path prefix; try /dev/r%s then /dev/%s.
*/
(void)sprintf(device, "%sr%s", _PATH_DEV, special);
if (stat(device, &st) == -1)
(void)sprintf(device, "%s%s", _PATH_DEV, special);
special = device;
}
if (Nflag) {
fso = -1;
} else {
fso = open(special, O_WRONLY);
if (fso < 0)
fatal("%s: %s", special, strerror(errno));
/* Bail if target special is mounted */
n = getmntinfo(&mp, MNT_NOWAIT);
if (n == 0)
fatal("%s: getmntinfo: %s", special, strerror(errno));
len = sizeof(_PATH_DEV) - 1;
s1 = special;
if (strncmp(_PATH_DEV, s1, len) == 0)
s1 += len;
while (--n >= 0) {
s2 = mp->f_mntfromname;
if (strncmp(_PATH_DEV, s2, len) == 0) {
s2 += len - 1;
*s2 = 'r';
}
if (strcmp(s1, s2) == 0 || strcmp(s1, &s2[1]) == 0)
fatal("%s is mounted on %s",
special, mp->f_mntonname);
++mp;
}
}
if (mfs && disktype != NULL) {
lp = (struct disklabel *)getdiskbyname(disktype);
if (lp == NULL)
fatal("%s: unknown disk type", disktype);
pp = &lp->d_partitions[1];
} else {
fsi = open(special, O_RDONLY);
if (fsi < 0)
fatal("%s: %s", special, strerror(errno));
if (fstat(fsi, &st) < 0)
fatal("%s: %s", special, strerror(errno));
if ((st.st_mode & S_IFMT) != S_IFCHR && !mfs)
printf("%s: %s: not a character-special device\n",
progname, special);
cp = strchr(argv[0], '\0') - 1;
if (cp == (char *)-1 ||
(*cp < 'a' || *cp > 'h') && !isdigit(*cp))
fatal("%s: can't figure out file system partition",
argv[0]);
#ifdef COMPAT
if (!mfs && disktype == NULL)
disktype = argv[1];
#endif
lp = getdisklabel(special, fsi);
if (isdigit(*cp))
pp = &lp->d_partitions[0];
else
pp = &lp->d_partitions[*cp - 'a'];
if (pp->p_size == 0)
fatal("%s: `%c' partition is unavailable",
argv[0], *cp);
if (pp->p_fstype == FS_BOOT)
fatal("%s: `%c' partition overlaps boot program",
argv[0], *cp);
}
if (fssize == 0)
fssize = pp->p_size;
if (fssize > pp->p_size && !mfs)
fatal("%s: maximum file system size on the `%c' partition is %d",
argv[0], *cp, pp->p_size);
if (rpm == 0) {
rpm = lp->d_rpm;
if (rpm <= 0)
rpm = 3600;
}
if (ntracks == 0) {
ntracks = lp->d_ntracks;
if (ntracks <= 0)
fatal("%s: no default #tracks", argv[0]);
}
if (nsectors == 0) {
nsectors = lp->d_nsectors;
if (nsectors <= 0)
fatal("%s: no default #sectors/track", argv[0]);
}
if (sectorsize == 0) {
sectorsize = lp->d_secsize;
if (sectorsize <= 0)
fatal("%s: no default sector size", argv[0]);
}
if (trackskew == -1) {
trackskew = lp->d_trackskew;
if (trackskew < 0)
trackskew = 0;
}
if (interleave == 0) {
interleave = lp->d_interleave;
if (interleave <= 0)
interleave = 1;
}
if (fsize == 0) {
fsize = pp->p_fsize;
if (fsize <= 0)
fsize = MAX(DFL_FRAGSIZE, lp->d_secsize);
}
if (bsize == 0) {
bsize = pp->p_frag * pp->p_fsize;
if (bsize <= 0)
bsize = MIN(DFL_BLKSIZE, 8 * fsize);
}
/*
* Maxcontig sets the default for the maximum number of blocks
* that may be allocated sequentially. With filesystem clustering
* it is possible to allocate contiguous blocks up to the maximum
* transfer size permitted by the controller or buffering.
*/
if (maxcontig == 0)
maxcontig = MAX(1, MIN(MAXPHYS, MAXBSIZE) / bsize);
if (density == 0)
density = NFPI * fsize;
if (minfree < MINFREE && opt != FS_OPTSPACE) {
fprintf(stderr, "Warning: changing optimization to space ");
fprintf(stderr, "because minfree is less than %d%%\n", MINFREE);
opt = FS_OPTSPACE;
}
if (trackspares == -1) {
trackspares = lp->d_sparespertrack;
if (trackspares < 0)
trackspares = 0;
}
nphyssectors = nsectors + trackspares;
if (cylspares == -1) {
cylspares = lp->d_sparespercyl;
if (cylspares < 0)
cylspares = 0;
}
secpercyl = nsectors * ntracks - cylspares;
if (secpercyl != lp->d_secpercyl)
fprintf(stderr, "%s (%d) %s (%lu)\n",
"Warning: calculated sectors per cylinder", secpercyl,
"disagrees with disk label", lp->d_secpercyl);
if (maxbpg == 0)
maxbpg = MAXBLKPG(bsize);
headswitch = lp->d_headswitch;
trackseek = lp->d_trkseek;
#ifdef notdef /* label may be 0 if faked up by kernel */
bbsize = lp->d_bbsize;
sbsize = lp->d_sbsize;
#endif
oldpartition = *pp;
#ifdef tahoe
realsectorsize = sectorsize;
if (sectorsize != DEV_BSIZE) { /* XXX */
int secperblk = DEV_BSIZE / sectorsize;
sectorsize = DEV_BSIZE;
nsectors /= secperblk;
nphyssectors /= secperblk;
secpercyl /= secperblk;
fssize /= secperblk;
pp->p_size /= secperblk;
}
#endif
mkfs(pp, special, fsi, fso);
#ifdef tahoe
if (realsectorsize != DEV_BSIZE)
pp->p_size *= DEV_BSIZE / realsectorsize;
#endif
if (!Nflag && memcmp(pp, &oldpartition, sizeof(oldpartition)))
rewritelabel(special, fso, lp);
if (!Nflag)
close(fso);
close(fsi);
#ifdef MFS
if (mfs) {
struct mfs_args args;
sprintf(buf, "mfs:%d", getpid());
args.fspec = buf;
args.export.ex_root = -2;
if (mntflags & MNT_RDONLY)
args.export.ex_flags = MNT_EXRDONLY;
else
args.export.ex_flags = 0;
args.base = membase;
args.size = fssize * sectorsize;
if (mount("mfs", argv[1], mntflags, &args) < 0)
fatal("%s: %s", argv[1], strerror(errno));
}
#endif
exit(0);
}
#ifdef COMPAT
char lmsg[] = "%s: can't read disk label; disk type must be specified";
#else
char lmsg[] = "%s: can't read disk label";
#endif
struct disklabel *
getdisklabel(s, fd)
char *s;
int fd;
{
static struct disklabel lab;
if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) {
#ifdef COMPAT
if (disktype) {
struct disklabel *lp, *getdiskbyname();
unlabeled++;
lp = getdiskbyname(disktype);
if (lp == NULL)
fatal("%s: unknown disk type", disktype);
return (lp);
}
#endif
warn("ioctl (GDINFO)");
fatal(lmsg, s);
}
return (&lab);
}
rewritelabel(s, fd, lp)
char *s;
int fd;
register struct disklabel *lp;
{
#ifdef COMPAT
if (unlabeled)
return;
#endif
lp->d_checksum = 0;
lp->d_checksum = dkcksum(lp);
if (ioctl(fd, DIOCWDINFO, (char *)lp) < 0) {
warn("ioctl (WDINFO)");
fatal("%s: can't rewrite disk label", s);
}
#if vax
if (lp->d_type == DTYPE_SMD && lp->d_flags & D_BADSECT) {
register i;
int cfd;
daddr_t alt;
char specname[64];
char blk[1024];
char *cp;
/*
* Make name for 'c' partition.
*/
strcpy(specname, s);
cp = specname + strlen(specname) - 1;
if (!isdigit(*cp))
*cp = 'c';
cfd = open(specname, O_WRONLY);
if (cfd < 0)
fatal("%s: %s", specname, strerror(errno));
memset(blk, 0, sizeof(blk));
*(struct disklabel *)(blk + LABELOFFSET) = *lp;
alt = lp->d_ncylinders * lp->d_secpercyl - lp->d_nsectors;
for (i = 1; i < 11 && i < lp->d_nsectors; i += 2) {
if (lseek(cfd, (off_t)(alt + i) * lp->d_secsize,
L_SET) == -1)
fatal("lseek to badsector area: %s",
strerror(errno));
if (write(cfd, blk, lp->d_secsize) < lp->d_secsize)
warn("alternate label %d write", i/2);
}
close(cfd);
}
#endif
}
/*VARARGS*/
void
#if __STDC__
fatal(const char *fmt, ...)
#else
fatal(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
va_list ap;
#if __STDC__
va_start(ap, fmt);
#else
va_start(ap);
#endif
if (fcntl(STDERR_FILENO, F_GETFL) < 0) {
openlog(progname, LOG_CONS, LOG_DAEMON);
vsyslog(LOG_ERR, fmt, ap);
closelog();
} else {
vwarnx(fmt, ap);
}
va_end(ap);
exit(1);
/*NOTREACHED*/
}
usage()
{
if (mfs) {
fprintf(stderr,
"usage: %s [ -fsoptions ] special-device mount-point\n",
progname);
} else
fprintf(stderr,
"usage: %s [ -fsoptions ] special-device%s\n",
progname,
#ifdef COMPAT
" [device-type]");
#else
"");
#endif
fprintf(stderr, "where fsoptions are:\n");
fprintf(stderr,
"\t-N do not create file system, just print out parameters\n");
fprintf(stderr, "\t-O create a 4.3BSD format filesystem\n");
fprintf(stderr, "\t-S sector size\n");
#ifdef COMPAT
fprintf(stderr, "\t-T disktype\n");
#endif
fprintf(stderr, "\t-a maximum contiguous blocks\n");
fprintf(stderr, "\t-b block size\n");
fprintf(stderr, "\t-c cylinders/group\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-f frag size\n");
fprintf(stderr, "\t-i number of bytes per inode\n");
fprintf(stderr, "\t-k sector 0 skew, per track\n");
fprintf(stderr, "\t-l hardware sector interleave\n");
fprintf(stderr, "\t-m minimum free space %%\n");
fprintf(stderr, "\t-n number of distinguished rotational positions\n");
fprintf(stderr, "\t-o optimization preference (`space' or `time')\n");
fprintf(stderr, "\t-p spare sectors per track\n");
fprintf(stderr, "\t-s file system size (sectors)\n");
fprintf(stderr, "\t-r revolutions/minute\n");
fprintf(stderr, "\t-t tracks/cylinder\n");
fprintf(stderr, "\t-u sectors/track\n");
fprintf(stderr, "\t-x spare sectors per cylinder\n");
exit(1);
}