diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index e5340a845b7c..b931f05e2dcb 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -32,12 +32,21 @@ */ #ifndef lint +#if 0 static char sccsid[] = "@(#)mkfs.c 8.11 (Berkeley) 5/3/95"; +#endif +static const char rcsid[] = + "$Id$"; #endif /* not lint */ +#include +#include +#include +#include #include #include #include +#include #include #include #include @@ -49,9 +58,15 @@ static char sccsid[] = "@(#)mkfs.c 8.11 (Berkeley) 5/3/95"; #include #ifndef STANDALONE -#include -#include #include +#else +extern int atoi __P((char *)); +extern char * getenv __P((char *)); +#endif + +#ifdef FSIRAND +extern long random __P((void)); +extern void srandomdev __P((void)); #endif /* @@ -102,9 +117,6 @@ extern int bbsize; /* boot block size */ extern int sbsize; /* superblock size */ extern u_long memleft; /* virtual memory available */ extern caddr_t membase; /* start address of memory based filesystem */ -#ifdef STANDALONE -extern caddr_t malloc(), calloc(); -#endif extern char * filename; union { @@ -129,7 +141,27 @@ int randinit; daddr_t alloc(); long calcipg(); static int charsperline(); +void clrblock __P((struct fs *, unsigned char *, int)); +void fsinit __P((time_t)); +void initcg __P((int, time_t)); +int isblock __P((struct fs *, unsigned char *, int)); +void iput __P((struct dinode *, ino_t)); +int makedir __P((struct direct *, int)); +void rdfs __P((daddr_t, int, char *)); +void setblock __P((struct fs *, unsigned char *, int)); +void wtfs __P((daddr_t, int, char *)); +#ifndef STANDALONE +void get_memleft __P((void)); +void raise_data_limit __P((void)); +#else +void free __P((char *)); +char * calloc __P((u_long, u_long)); +caddr_t malloc __P((u_long)); +caddr_t realloc __P((char *, u_long)); +#endif + +void mkfs(pp, fsys, fi, fo) struct partition *pp; char *fsys; @@ -141,7 +173,7 @@ mkfs(pp, fsys, fi, fo) off_t usedb; long mapcramped, inodecramped; long postblsize, rotblsize, totalsbsize; - int ppid, status, fd; + int ppid = 0, status, fd; time_t utime; quad_t sizepb; void started(); @@ -160,11 +192,9 @@ mkfs(pp, fsys, fi, fo) if (mfs) { ppid = getpid(); (void) signal(SIGUSR1, started); - if (i = fork()) { - if (i == -1) { - perror("mfs"); - exit(10); - } + if ((i = fork())) { + if (i == -1) + err(10, "mfs"); if (waitpid(i, &status, 0) != -1 && WIFEXITED(status)) exit(WEXITSTATUS(status)); exit(11); @@ -179,18 +209,14 @@ mkfs(pp, fsys, fi, fo) unsigned char buf[BUFSIZ]; unsigned long l,l1; fd = open(filename,O_RDWR|O_TRUNC|O_CREAT,0644); - if(fd < 0) { - perror(filename); - exit(12); - } + if(fd < 0) + err(12, "%s", filename); for(l=0;l< fssize * sectorsize;l += l1) { l1 = fssize * sectorsize; if (BUFSIZ < l1) l1 = BUFSIZ; - if (l1 != write(fd,buf,l1)) { - perror(filename); - exit(12); - } + if (l1 != write(fd,buf,l1)) + err(12, "%s", filename); } membase = mmap( 0, @@ -199,10 +225,8 @@ mkfs(pp, fsys, fi, fo) MAP_SHARED, fd, 0); - if(membase == MAP_FAILED) { - perror("mmap"); - exit(12); - } + if(membase == MAP_FAILED) + err(12, "mmap"); close(fd); } else { #ifndef STANDALONE @@ -210,10 +234,8 @@ mkfs(pp, fsys, fi, fo) #endif if (fssize * sectorsize > (memleft - 131072)) fssize = (memleft - 131072) / sectorsize; - if ((membase = malloc(fssize * sectorsize)) == NULL) { - perror("malloc"); - exit(13); - } + if ((membase = malloc(fssize * sectorsize)) == NULL) + errx(13, "malloc failed"); } } fsi = fi; @@ -610,10 +632,8 @@ mkfs(pp, fsys, fi, fo) for (sblock.fs_csshift = 0; i > 1; i >>= 1) sblock.fs_csshift++; fscs = (struct csum *)calloc(1, sblock.fs_cssize); - if (fscs == NULL) { - perror("calloc"); - exit(31); - } + if (fscs == NULL) + errx(31, "calloc failed"); sblock.fs_magic = FS_MAGIC; sblock.fs_rotdelay = rotdelay; sblock.fs_minfree = minfree; @@ -718,13 +738,17 @@ mkfs(pp, fsys, fi, fo) /* * Initialize a cylinder group. */ +void initcg(cylno, utime) int cylno; time_t utime; { daddr_t cbase, d, dlower, dupper, dmax, blkno; - long i, j, s; + long i; register struct csum *cs; +#ifdef FSIRAND + long j; +#endif /* * Determine block bounds for cylinder group. @@ -807,7 +831,7 @@ initcg(cylno, utime) sblock.fs_dsize += dlower; } sblock.fs_dsize += acg.cg_ndblk - dupper; - if (i = dupper % sblock.fs_frag) { + if ((i = dupper % sblock.fs_frag)) { acg.cg_frsum[sblock.fs_frag - i]++; for (d = dupper + sblock.fs_frag - i; dupper < d; dupper++) { setbit(cg_blksfree(&acg), dupper); @@ -914,10 +938,13 @@ struct odirect olost_found_dir[] = { #endif char buf[MAXBSIZE]; +void fsinit(utime) time_t utime; { +#ifdef LOSTDIR int i; +#endif /* * initialize the node @@ -970,6 +997,7 @@ fsinit(utime) * construct a set of directory entries in "buf". * return size of directory. */ +int makedir(protodir, entries) register struct direct *protodir; int entries; @@ -1084,6 +1112,7 @@ calcipg(cpg, bpcg, usedbp) /* * Allocate an inode on the disk */ +void iput(ip, ino) register struct dinode *ip; register ino_t ino; @@ -1113,9 +1142,9 @@ iput(ip, ino) exit(32); } d = fsbtodb(&sblock, ino_to_fsba(&sblock, ino)); - rdfs(d, sblock.fs_bsize, buf); + rdfs(d, sblock.fs_bsize, (char *)buf); buf[ino_to_fsbo(&sblock, ino)] = *ip; - wtfs(d, sblock.fs_bsize, buf); + wtfs(d, sblock.fs_bsize, (char *)buf); } /* @@ -1146,10 +1175,10 @@ malloc(size) i = (char *)((u_long)(base + pgsz) &~ pgsz); base = sbrk(i - base); if (getrlimit(RLIMIT_DATA, &rlp) < 0) - perror("getrlimit"); + warn("getrlimit"); rlp.rlim_cur = rlp.rlim_max; if (setrlimit(RLIMIT_DATA, &rlp) < 0) - perror("setrlimit"); + warn("setrlimit"); memleft = rlp.rlim_max - (u_long)base; } size = (size + pgsz) &~ pgsz; @@ -1188,7 +1217,8 @@ calloc(size, numelm) caddr_t base; size *= numelm; - base = malloc(size); + if ((base = malloc(size)) == NULL); + return (NULL); memset(base, 0, size); return (base); } @@ -1196,6 +1226,7 @@ calloc(size, numelm) /* * Replace libc function with one suited to our needs. */ +void free(ptr) char *ptr; { @@ -1205,15 +1236,16 @@ free(ptr) #else /* !STANDALONE */ +void raise_data_limit() { struct rlimit rlp; if (getrlimit(RLIMIT_DATA, &rlp) < 0) - perror("getrlimit"); + warn("getrlimit"); rlp.rlim_cur = rlp.rlim_max; if (setrlimit(RLIMIT_DATA, &rlp) < 0) - perror("setrlimit"); + warn("setrlimit"); } #ifdef __ELF__ @@ -1223,6 +1255,7 @@ extern char *_etext; extern char *etext; #endif +void get_memleft() { static u_long pgsz; @@ -1235,7 +1268,7 @@ get_memleft() dstart = ((u_long)&etext) &~ pgsz; freestart = ((u_long)(sbrk(0) + pgsz) &~ pgsz); if (getrlimit(RLIMIT_DATA, &rlp) < 0) - perror("getrlimit"); + warn("getrlimit"); memused = freestart - dstart; memleft = rlp.rlim_cur - memused; } @@ -1244,6 +1277,7 @@ get_memleft() /* * read a block from the file system */ +void rdfs(bno, size, bf) daddr_t bno; int size; @@ -1257,20 +1291,19 @@ rdfs(bno, size, bf) } if (lseek(fsi, (off_t)bno * sectorsize, 0) < 0) { printf("seek error: %ld\n", (long)bno); - perror("rdfs"); - exit(33); + err(33, "rdfs"); } n = read(fsi, bf, size); if (n != size) { printf("read error: %ld\n", (long)bno); - perror("rdfs"); - exit(34); + err(34, "rdfs"); } } /* * write a block to the file system */ +void wtfs(bno, size, bf) daddr_t bno; int size; @@ -1286,20 +1319,19 @@ wtfs(bno, size, bf) return; if (lseek(fso, (off_t)bno * sectorsize, SEEK_SET) < 0) { printf("seek error: %ld\n", (long)bno); - perror("wtfs"); - exit(35); + err(35, "wtfs"); } n = write(fso, bf, size); if (n != size) { printf("write error: %ld\n", (long)bno); - perror("wtfs"); - exit(36); + err(36, "wtfs"); } } /* * check if a block is available */ +int isblock(fs, cp, h) struct fs *fs; unsigned char *cp; @@ -1332,6 +1364,7 @@ isblock(fs, cp, h) /* * take a block out of the map */ +void clrblock(fs, cp, h) struct fs *fs; unsigned char *cp; @@ -1363,6 +1396,7 @@ clrblock(fs, cp, h) /* * put a block into the map */ +void setblock(fs, cp, h) struct fs *fs; unsigned char *cp; @@ -1402,7 +1436,6 @@ charsperline() int columns; char *cp; struct winsize ws; - extern char *getenv(); columns = 0; if (ioctl(0, TIOCGWINSZ, &ws) != -1) diff --git a/sbin/newfs/newfs.8 b/sbin/newfs/newfs.8 index f9d12bbc52db..147db97bab9c 100644 --- a/sbin/newfs/newfs.8 +++ b/sbin/newfs/newfs.8 @@ -30,6 +30,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)newfs.8 8.6 (Berkeley) 5/3/95 +.\" $Id$ .\" .Dd May 3, 1995 .Dt NEWFS 8 @@ -84,7 +85,7 @@ replaces the more obtuse .Xr mkfs 8 program. Before running -.Nm newfs +.Nm or .Nm mount_mfs , the disk must be labeled using @@ -92,7 +93,7 @@ the disk must be labeled using .Nm Newfs builds a file system on the specified special device. Typically the defaults are reasonable, however -.Nm newfs +.Nm has numerous options to allow the defaults to be selectively overridden. .Pp .Nm Mount_mfs @@ -110,7 +111,7 @@ corresponding file system. The parameters to .Nm mount_mfs are the same as those to -.Nm newfs . +.Nm Ns . If the .Fl T flag is specified (see below), the special file is unused. @@ -121,33 +122,35 @@ 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 +The following options define the general layout policies: +.Bl -tag -width indent .It Fl T Ar disktype For backward compatibility and for .Nm mount_mfs . .It Fl F Ar file -.Nm mount_mfs +.Nm Mount_mfs will use this file for the image of the filesystem. When .Nm mount_mfs exits, this file will be left behind. .It Fl N -Causes the file system parameters to be printed out +Cause the file system parameters to be printed out without really creating the file system. .It Fl O -Creates a 4.3BSD format filesystem. +Create a +.Bx 4.3 +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 +Use 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 +Specify 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. +The default value is 1. See .Xr tunefs 8 for more details on how to set this option. @@ -157,7 +160,7 @@ The block size of the file system, in bytes. 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 +Specify the expected time (in milliseconds) to service a transfer completion interrupt and initiate a new transfer on the same disk. The default is 0 milliseconds. See @@ -165,7 +168,7 @@ See 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 +Indicate 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. @@ -176,7 +179,7 @@ for more details on how to set this option. The fragment size of the file system in bytes. The default is 1024 bytes. .It Fl i Ar number of bytes per inode -This specifies the density of inodes in the file system. +Specify the density of inodes in the file system. The default is to create an inode for every (4 * frag-size) 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. @@ -193,8 +196,9 @@ See .Xr tunefs 8 for more details on how to set this option. .It Fl n Ar number of distinguished rotational positions -Determines how many rotational time slots there are in one revolution of -the disk. Defaults to 1, which essentially disables the rotational position table. +Determine how many rotational time slots there are in one revolution of +the disk. Defaults to 1, which essentially disables the rotational position +table. .It Fl o Ar optimization\ preference .Pq ``space'' or ``time'' The file system can either be instructed to try to minimize the time spent @@ -213,15 +217,15 @@ The size of the file system in sectors. 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 +.Nm 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 +.Xr fsck 8 to find the alternate superblocks if the standard superblock is lost. -.Bl -tag -width Fl +.Bl -tag -width indent .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 @@ -259,7 +263,7 @@ If zero is specified, the value from the disklabel will be used. This does not include sectors reserved at the end of each track for bad block replacement (see the .Fl p -option.) +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. @@ -272,7 +276,7 @@ system for data allocation. The options to the .Nm mount_mfs command are as described for the -.Nm newfs +.Nm command, except for the .Fl o option. @@ -295,7 +299,9 @@ Mount a 64 MB large memory file system on /tmp, with .Xr mount 8 options nosuid and nodev. .Sh BUGS -The boot code of FreeBSD assumes that the file system that carries the +The boot code of +.Bx Free +assumes that the file system that carries the kernel has blocks of 8 kilobytes and fragments of 1 kilobyte. You will not be able to boot from a file system that uses another size. .Sh SEE ALSO diff --git a/sbin/newfs/newfs.c b/sbin/newfs/newfs.c index d0cc159290f2..c9dbb3744878 100644 --- a/sbin/newfs/newfs.c +++ b/sbin/newfs/newfs.c @@ -32,13 +32,17 @@ */ #ifndef lint -static char sccsid[] = "@(#)newfs.c 8.13 (Berkeley) 5/1/95"; +static const char copyright[] = +"@(#) Copyright (c) 1983, 1989, 1993, 1994\n\ + The Regents of the University of California. All rights reserved.\n"; #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"; +#if 0 +static char sccsid[] = "@(#)newfs.c 8.13 (Berkeley) 5/1/95"; +#endif +static const char rcsid[] = + "$Id$"; #endif /* not lint */ /* @@ -46,17 +50,15 @@ static char copyright[] = */ #include #include -#include #include #include #include -#include -#include #include #include #include +#include #include #include #include @@ -65,10 +67,13 @@ static char copyright[] = #include #include +#ifdef MFS +#include +#include +#endif + #if __STDC__ #include -#else -#include #endif #include "mntopts.h" @@ -201,13 +206,14 @@ int unlabeled; char device[MAXPATHLEN]; char *progname; +extern void mkfs __P((struct partition *, char *, int, int)); +static void usage __P((void)); + 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; @@ -217,13 +223,14 @@ main(argc, argv) struct stat st; struct statfs *mp; int fsi, fso, len, n; - char *cp, *s1, *s2, *special, *opstring, buf[BUFSIZ]; + char *cp, *s1, *s2, *special, *opstring; #ifdef MFS struct vfsconf vfc; int error; + char buf[BUFSIZ]; #endif - if (progname = strrchr(*argv, '/')) + if ((progname = strrchr(*argv, '/'))) ++progname; else progname = *argv; @@ -258,7 +265,7 @@ main(argc, argv) break; case 'a': if ((maxcontig = atoi(optarg)) <= 0) - fatal("%s: bad maximum contiguous blocks\n", + fatal("%s: bad maximum contiguous blocks", optarg); break; case 'b': @@ -272,11 +279,11 @@ main(argc, argv) break; case 'd': if ((rotdelay = atoi(optarg)) < 0) - fatal("%s: bad rotational delay\n", optarg); + fatal("%s: bad rotational delay", optarg); break; case 'e': if ((maxbpg = atoi(optarg)) <= 0) - fatal("%s: bad blocks per file in a cylinder group\n", + fatal("%s: bad blocks per file in a cylinder group", optarg); break; case 'f': @@ -285,7 +292,7 @@ main(argc, argv) break; case 'i': if ((density = atoi(optarg)) <= 0) - fatal("%s: bad bytes per inode\n", optarg); + fatal("%s: bad bytes per inode", optarg); break; case 'k': if ((trackskew = atoi(optarg)) < 0) @@ -297,11 +304,11 @@ main(argc, argv) break; case 'm': if ((minfree = atoi(optarg)) < 0 || minfree > 99) - fatal("%s: bad free space %%\n", optarg); + fatal("%s: bad free space %%", optarg); break; case 'n': if ((nrpos = atoi(optarg)) < 0) - fatal("%s: bad rotational layout count\n", + fatal("%s: bad rotational layout count", optarg); if (nrpos == 0) nrpos = 1; @@ -315,7 +322,7 @@ main(argc, argv) else if (strcmp(optarg, "time") == 0) opt = FS_OPTTIME; else - fatal("%s: unknown optimization preference: use `space' or `time'."); + fatal("%s: unknown optimization preference: use `space' or `time'"); } break; case 'p': @@ -325,7 +332,7 @@ main(argc, argv) break; case 'r': if ((rpm = atoi(optarg)) <= 0) - fatal("%s: bad revolutions/minute\n", optarg); + fatal("%s: bad revolutions/minute", optarg); break; case 's': if ((fssize = atoi(optarg)) <= 0) @@ -441,7 +448,7 @@ main(argc, argv) progname, special); cp = strchr(argv[0], '\0') - 1; if (cp == (char *)-1 || - (*cp < 'a' || *cp > 'h') && !isdigit(*cp)) + ((*cp < 'a' || *cp > 'h') && !isdigit(*cp))) fatal("%s: can't figure out file system partition", argv[0]); #ifdef COMPAT @@ -681,6 +688,7 @@ fatal(fmt, va_alist) /*NOTREACHED*/ } +static void usage() { if (mfs) {