2002-03-19 21:01:38 +01:00
|
|
|
/*
|
2002-06-21 08:18:05 +02:00
|
|
|
* Copyright (c) 2002 Networks Associates Technology, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This software was developed for the FreeBSD Project by Marshall
|
|
|
|
* Kirk McKusick and Network Associates Laboratories, the Security
|
|
|
|
* Research Division of Network Associates, Inc. under DARPA/SPAWAR
|
|
|
|
* contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS
|
2003-02-14 22:08:14 +01:00
|
|
|
* research program.
|
2002-06-21 08:18:05 +02:00
|
|
|
*
|
2002-03-19 21:01:38 +01:00
|
|
|
* Copyright (c) 1980, 1989, 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.
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
2003-02-11 04:06:45 +01:00
|
|
|
#include <libufs.h>
|
2002-03-19 21:01:38 +01:00
|
|
|
|
2010-02-10 21:17:46 +01:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
*/
|
2011-05-26 20:22:49 +02:00
|
|
|
#define DFL_FRAGSIZE 4096
|
|
|
|
#define DFL_BLKSIZE 32768
|
2010-02-10 21:17:46 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Cylinder groups may have up to MAXBLKSPERCG blocks. The actual
|
|
|
|
* number used depends upon how much information can be stored
|
|
|
|
* in a cylinder group map which must fit in a single file system
|
|
|
|
* block. The default is to use as many as possible blocks per group.
|
|
|
|
*/
|
|
|
|
#define MAXBLKSPERCG 0x7fffffff /* desired fs_fpg ("infinity") */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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(ufs2_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
|
|
|
|
|
2002-03-19 21:01:38 +01:00
|
|
|
/*
|
|
|
|
* variables set up by front end.
|
|
|
|
*/
|
2007-12-16 20:41:31 +01:00
|
|
|
extern int Eflag; /* Erase previous disk contents */
|
2003-02-01 05:17:10 +01:00
|
|
|
extern int Lflag; /* add a volume label */
|
2002-08-21 20:11:48 +02:00
|
|
|
extern int Nflag; /* run mkfs without writing file system */
|
|
|
|
extern int Oflag; /* build UFS1 format file system */
|
2002-03-19 22:05:29 +01:00
|
|
|
extern int Rflag; /* regression test */
|
2002-08-21 20:11:48 +02:00
|
|
|
extern int Uflag; /* enable soft updates for file system */
|
2011-11-04 14:36:02 +01:00
|
|
|
extern int jflag; /* enable soft updates journaling for filesys */
|
2007-12-16 20:41:31 +01:00
|
|
|
extern int Xflag; /* exit in middle of newfs for testing */
|
2006-10-31 22:52:28 +01:00
|
|
|
extern int Jflag; /* enable gjournal for file system */
|
2004-02-26 02:14:27 +01:00
|
|
|
extern int lflag; /* enable multilabel MAC for file system */
|
2005-01-21 23:20:25 +01:00
|
|
|
extern int nflag; /* do not create .snap directory */
|
2010-12-29 13:31:18 +01:00
|
|
|
extern int tflag; /* enable TRIM */
|
2007-11-28 08:29:10 +01:00
|
|
|
extern intmax_t fssize; /* file system size */
|
2010-03-09 11:31:03 +01:00
|
|
|
extern int sectorsize; /* bytes/sector */
|
2002-03-19 21:01:38 +01:00
|
|
|
extern int realsectorsize; /* bytes/sector in hardware*/
|
2010-03-09 20:31:08 +01:00
|
|
|
extern int fsize; /* fragment size */
|
|
|
|
extern int bsize; /* block size */
|
|
|
|
extern int maxbsize; /* maximum clustering */
|
|
|
|
extern int maxblkspercg; /* maximum blocks per cylinder group */
|
2002-03-19 21:01:38 +01:00
|
|
|
extern int minfree; /* free space threshold */
|
|
|
|
extern int opt; /* optimization preference (space or time) */
|
2010-03-09 20:31:08 +01:00
|
|
|
extern int density; /* number of bytes per inode */
|
|
|
|
extern int maxcontig; /* max contiguous blocks to allocate */
|
|
|
|
extern int maxbpg; /* maximum blocks per file in a cyl group */
|
|
|
|
extern int avgfilesize; /* expected average file size */
|
|
|
|
extern int avgfilesperdir; /* expected number of files per directory */
|
2003-02-01 05:17:10 +01:00
|
|
|
extern u_char *volumelabel; /* volume label for filesystem */
|
2003-02-11 04:06:45 +01:00
|
|
|
extern struct uufsd disk; /* libufs disk structure */
|
2002-04-24 13:44:02 +02:00
|
|
|
|
Enable operation of newfs on plain files, which is useful when you
want to prepare disk images for emulators (though 'makefs' in port
can do something similar).
This relies on:
+ minor changes to pass the consistency checks even when working on a file;
+ an additional option, '-p partition' , to specify the disk partition to
initialize;
+ some changes on the I/O routines to deal with partition offsets.
The latter was a bit tricky to implement, see the details in newfs.h:
in newfs, I/O is done through libufs which assumes that the file
descriptor refers to the whole partition. Introducing support for
the offset in libufs would require a non-backward compatible change
in the library, to be dealt with a version bump or with symbol
versioning.
I felt both approaches to be overkill for this specific application,
especially because there might be other changes to libufs that might
become necessary in the near future.
So I used the following trick:
- read access is always done by calling bread() directly, so we just add
the offset in the (few) places that call bread();
- write access is done through bwrite() and sbwrite(), which in turn
calls bwrite(). To avoid rewriting sbwrite(), we supply our own version
of bwrite() here, which takes precedence over the version in libufs.
MFC after: 4 weeks
2008-12-03 19:36:59 +01:00
|
|
|
/*
|
|
|
|
* To override a limitation in libufs, export the offset (in sectors) of the
|
|
|
|
* partition on the underlying media (file or disk). The value is used as
|
|
|
|
* an offset for all accesses to the media through bread(), which is only
|
|
|
|
* invoked directly in this program.
|
|
|
|
* For bwrite() we need a different approach, namely override the library
|
|
|
|
* version with one defined here. This is because bwrite() is called also
|
|
|
|
* by the library function sbwrite() which we cannot intercept nor want to
|
|
|
|
* rewrite. As a consequence, the internal version of bwrite() adds the
|
|
|
|
* partition offset itself when calling the underlying function, pwrite().
|
|
|
|
*
|
|
|
|
* XXX This info really ought to go into the struct uufsd, at which point
|
|
|
|
* we can remove the above hack.
|
|
|
|
*/
|
|
|
|
extern ufs2_daddr_t part_ofs; /* partition offset in blocks */
|
|
|
|
|
2002-04-24 13:44:02 +02:00
|
|
|
void mkfs (struct partition *, char *);
|