mkfs.mfs: various programs

Split in as many programs as needed to support various variants of MFS
This commit is contained in:
Antoine Leca 2013-04-27 17:52:14 +02:00
parent 87c0f0dfbd
commit b8f1fb33dd
33 changed files with 344 additions and 9 deletions

View File

@ -1,4 +1,4 @@
HOSTPROGNAME= ${_TOOL_PREFIX}mkfs.mfs
HOST_SRCDIR= usr.sbin/mkfs.mfs
HOST_SRCDIR= usr.sbin/mkfs.mfs/v3
.include "${.CURDIR}/../Makefile.host"

View File

@ -1,10 +1,8 @@
PROG= mkfs.mfs
SRCS= mkfs.c
BINDIR= /sbin
MAN=
.if ${HOST_OSTYPE:C/\-.*//:U} == "Minix" || !defined(HOSTPROGNAME)
LDADD+= -lminlib -lcompat_minix
SUBDIR= v3
.if !defined(HOSTPROGNAME)
#SUBDIR+= v1 v2 # Original V1 and V2 file systems
#SUBDIR+= v1l v2l # Linux-extended variants
#SUBDIR+= mfs3v2 # V2 as handled by regular MINIX 3.x; hacky
.endif
.include <bsd.prog.mk>
.include <bsd.subdir.mk>

View File

@ -0,0 +1,17 @@
SRCS= mkfs.c
BINDIR?= /usr/sbin
MAN?=
.include <bsd.own.mk>
.include "${.PARSEDIR}/../Makefile.inc"
.PATH: ${.CURDIR}/..
CPPFLAGS+= -I${.CURDIR}
.if ${HOST_OSTYPE:C/\-.*//:U} == "Minix" || !defined(HOSTPROGNAME)
#DPADD
LDADD+= -lminlib -lcompat_minix
.endif
.include <bsd.prog.mk>

View File

@ -0,0 +1,3 @@
PROG= mkfs.mfs3v2
.include <../Makefile.mkfs>

View File

@ -0,0 +1,15 @@
/* "V2" minixFS as handled by MINIX 3.x
*
* The difference with the normal V2 file systems is due to the use of
* the V3 declaration for the super block (struct super) and the directory
* entries (struct direct); this allows to use more than 65,535 inodes
* and filenames of up to 60 characters.
* A normal MINIX 2.0.x installation cannot read these file systems.
*
* The differences with a V3 file system with a block-size of 1024 are
* limited to the use of a different magic number, since the inodes
* have the same layout in both V2 and V3 file systems.
*/
/* Constants; unchanged from regular V2... */
#include "../v2/const.h"

View File

@ -0,0 +1,2 @@
/* Directory entry structure; unchanged from V3 */
#include "../v3/mfsdir.h"

View File

@ -0,0 +1,2 @@
/* Super block; unchanged from regular V3 */
#include "../v3/super.h"

View File

@ -0,0 +1,2 @@
/* Inode structure; unchanged from regular V2; V3 is identical anyway */
#include "../v2/type.h"

View File

@ -0,0 +1,3 @@
PROG= mkfs.mfsv1
.include <../Makefile.mkfs>

View File

@ -0,0 +1,49 @@
#ifndef _MKFS_MFS_CONST_H__
#define _MKFS_MFS_CONST_H__
/* Tables sizes */
#define NR_DZONES 7 /* # direct zone numbers in a V1 inode */
#define NR_TZONES 9 /* total # zone numbers in a V1 inode */
/* V1 file systems are special in that zone numbers are only 16-bit */
#define zone_t uint16_t
/* Blocks are of a fixed size */
#define MFS_STATIC_BLOCK_SIZE 1024
#define SUPER_BLOCK_BYTES MFS_STATIC_BLOCK_SIZE /* 1 block */
/* The type of sizeof may be (unsigned) long. Use the following macro for
* taking the sizes of small objects so that there are no surprises like
* (small) long constants being passed to routines expecting an int.
*/
#define usizeof(t) ((unsigned) sizeof(t))
/* File system types: magic number contained in super-block. */
#define SUPER_V1 0x137F /* magic # for V1 file systems */
#define SUPER_MAGIC SUPER_V1
/* Miscellaneous constants */
#define SU_UID ((uid_t) 0) /* super_user's uid_t */
#define SECTOR_SIZE 512
#define BOOT_BLOCK ((block_t) 0) /* block number of boot block */
#define SUPER_BLOCK ((block_t) 1) /* block number of super block */
#define START_BLOCK ((block_t) 2) /* first block of FS (not counting SB) */
#define ROOT_INODE ((ino_t) 1) /* inode number for root directory */
/* Derived sizes pertaining to the file system. */
#define FS_BITMAP_CHUNKS(b) ((b)/usizeof(bitchunk_t)) /*# map chunks/blk*/
#define FS_BITCHUNK_BITS (usizeof(bitchunk_t) * CHAR_BIT)
#define FS_BITS_PER_BLOCK(b) (FS_BITMAP_CHUNKS(b) * FS_BITCHUNK_BITS)
#define ZONE_NUM_SIZE usizeof (zone_t) /* # bytes in zone */
#define INODE_SIZE usizeof (struct inode) /* bytes in dsk ino */
#define INODES_PER_BLOCK(b) ((b)/INODE_SIZE) /* # V2 dsk inodes/blk */
#define INDIRECTS(b) ((b)/ZONE_NUM_SIZE) /* # zones/indir block */
#define DIR_ENTRY_SIZE usizeof(struct direct) /* # bytes/dir entry */
#define NR_DIR_ENTRIES(b) ((b)/DIR_ENTRY_SIZE) /* # dir entries/blk */
#endif

View File

@ -0,0 +1,12 @@
#ifndef _MKFS_MFSDIR_H
#define _MKFS_MFSDIR_H
/* Minix MFS V1/V2 on-disk directory filename. */
#define MFS_DIRSIZ 14
struct direct {
uint16_t d_ino;
char d_name[MFS_DIRSIZ];
} __packed;
#endif /* _MKFS_MFSDIR_H */

View File

@ -0,0 +1,39 @@
#ifndef _MKFS_MFS_SUPER_H__
#define _MKFS_MFS_SUPER_H__
/* Super block table. The entry holds information about the sizes of the bit
* maps and inodes. The s_ninodes field gives the number of inodes available
* for files and directories, including the root directory. Inode 0 is
* on the disk, but not used. Thus s_ninodes = 4 means that 5 bits will be
* used in the bit map, bit 0, which is always 1 and not used, and bits 1-4
* for files and directories. The disk layout is:
*
* Item # blocks
* boot block 1
* super block 1
* inode map s_imap_blocks
* zone map s_zmap_blocks
* inodes (s_ninodes + 'inodes per block' - 1)/'inodes per block'
* unused whatever is needed to fill out the current zone
* data zones (s_zones - s_firstdatazone) << s_log_zone_size
*/
struct super_block {
uint16_t s_ninodes; /* # usable inodes on the minor device */
uint16_t s_nzones; /* total device size, including bit maps etc */
int16_t s_imap_blocks; /* # of blocks used by inode bit map */
int16_t s_zmap_blocks; /* # of blocks used by zone bit map */
uint16_t s_firstdatazone; /* number of first data zone (small) */
int16_t s_log_zone_size; /* log2 of blocks/zone */
uint32_t s_max_size; /* maximum file size on this device */
int16_t s_magic; /* magic number to recognize super-blocks */
} superblock;
/* Some members have been overidden in later versions: */
#define s_firstdatazone_old s_firstdatazone
#define s_zones s_nzones
#undef MFSFLAG_CLEAN
#undef MFSFLAG_MANDATORY_MASK
#endif

View File

@ -0,0 +1,18 @@
#ifndef _MKFS_MFS_TYPE_H__
#define _MKFS_MFS_TYPE_H__
/* Declaration of the V1 inode as it is on the disk (not in core). */
struct inode { /* V1 disk inode */
uint16_t i_mode; /* file type, protection, etc. */
uint16_t i_uid; /* user id of the file's owner. */
uint32_t i_size; /* current file size in bytes */
uint32_t i_mtime; /* when was file data last changed */
uint8_t i_gid; /* group number */
uint8_t i_nlinks; /* how many links to this file. */
uint16_t i_zone[NR_TZONES]; /* zone nums for direct, ind, and dbl ind */
};
/* Note: in V1 there was only one kind of timestamp kept in inodes! */
#define MFS_INODE_ONLY_MTIME
#endif

View File

@ -0,0 +1,3 @@
PROG= mkfs.mfsv1l
.include <../Makefile.mkfs>

View File

@ -0,0 +1,13 @@
/* Extended V1 minixFS as defined by Linux
* The difference with the normal V1 file systems as used on MINIX are the
* size of the file names in the directoru entries, which are extended
* to 30 characters (instead of 14.)
*/
/* Constants; unchanged from regular V1... */
#include "../v1/const.h"
/* ... except for magic number contained in super-block: */
#define SUPER_V1L 0x138F /* magic # for "Linux" extended V1 minixFS */
#undef SUPER_MAGIC
#define SUPER_MAGIC SUPER_V1L

View File

@ -0,0 +1,12 @@
#ifndef _MKFS_MFSDIR_H
#define _MKFS_MFSDIR_H
/* Linux-extended Minix MFS V1/V2 on-disk directory entry. */
#define MFS_DIRSIZ 30
struct direct {
uint16_t d_ino;
char d_name[MFS_DIRSIZ];
} __packed;
#endif /* _MKFS_MFSDIR_H */

View File

@ -0,0 +1,2 @@
/* Super block; unchanged from regular V1 */
#include "../v1/super.h"

View File

@ -0,0 +1,2 @@
/* Inode structure; unchanged from regular V1 */
#include "../v1/type.h"

View File

@ -0,0 +1,3 @@
PROG= mkfs.mfsv2
.include <../Makefile.mkfs>

View File

@ -0,0 +1,45 @@
#ifndef _MKFS_MFS_CONST_H__
#define _MKFS_MFS_CONST_H__
/* Tables sizes */
#define NR_DZONES 7 /* # direct zone numbers in a V2 inode */
#define NR_TZONES 10 /* total # zone numbers in a V2 inode */
/* Blocks are of a fixed size */
#define MFS_STATIC_BLOCK_SIZE 1024
#define SUPER_BLOCK_BYTES MFS_STATIC_BLOCK_SIZE /* 1 block */
/* The type of sizeof may be (unsigned) long. Use the following macro for
* taking the sizes of small objects so that there are no surprises like
* (small) long constants being passed to routines expecting an int.
*/
#define usizeof(t) ((unsigned) sizeof(t))
/* File system types: magic number contained in super-block. */
#define SUPER_V2 0x2468 /* magic # for V2 file systems */
#define SUPER_MAGIC SUPER_V2
/* Miscellaneous constants */
#define SU_UID ((uid_t) 0) /* super_user's uid_t */
#define SECTOR_SIZE 512
#define BOOT_BLOCK ((block_t) 0) /* block number of boot block */
#define SUPER_BLOCK ((block_t) 1) /* block number of super block */
#define START_BLOCK ((block_t) 2) /* first block of FS (not counting SB) */
#define ROOT_INODE ((ino_t) 1) /* inode number for root directory */
/* Derived sizes pertaining to the file system. */
#define FS_BITMAP_CHUNKS(b) ((b)/usizeof (uint32_t))/* # map chunks/blk */
#define FS_BITCHUNK_BITS (usizeof(uint32_t) * CHAR_BIT)
#define FS_BITS_PER_BLOCK(b) (FS_BITMAP_CHUNKS(b) * FS_BITCHUNK_BITS)
#define ZONE_NUM_SIZE usizeof (zone_t) /* # bytes in zone */
#define INODE_SIZE usizeof (struct inode) /* bytes in dsk ino */
#define INODES_PER_BLOCK(b) ((b)/INODE_SIZE) /* # V2 dsk inodes/blk */
#define INDIRECTS(b) ((b)/ZONE_NUM_SIZE) /* # zones/indir block */
#define DIR_ENTRY_SIZE usizeof(struct direct) /* # bytes/dir entry */
#define NR_DIR_ENTRIES(b) ((b)/DIR_ENTRY_SIZE) /* # dir entries/blk */
#endif

View File

@ -0,0 +1,12 @@
#ifndef _MKFS_MFSDIR_H
#define _MKFS_MFSDIR_H
/* Minix MFS V1/V2 on-disk directory filename. */
#define MFS_DIRSIZ 14
struct direct {
uint16_t d_ino;
char d_name[MFS_DIRSIZ];
} __packed;
#endif /* _MKFS_MFSDIR_H */

View File

@ -0,0 +1,39 @@
#ifndef _MKFS_MFS_SUPER_H__
#define _MKFS_MFS_SUPER_H__
/* Super block table. The entry holds information about the sizes of the bit
* maps and inodes. The s_ninodes field gives the number of inodes available
* for files and directories, including the root directory. Inode 0 is
* on the disk, but not used. Thus s_ninodes = 4 means that 5 bits will be
* used in the bit map, bit 0, which is always 1 and not used, and bits 1-4
* for files and directories. The disk layout is:
*
* Item # blocks
* boot block 1
* super block 1
* inode map s_imap_blocks
* zone map s_zmap_blocks
* inodes (s_ninodes + 'inodes per block' - 1)/'inodes per block'
* unused whatever is needed to fill out the current zone
* data zones (s_zones - s_firstdatazone) << s_log_zone_size
*/
struct super_block {
uint16_t s_ninodes; /* # usable inodes on the minor device */
uint16_t s_nzones; /* total device size, including bit maps etc */
int16_t s_imap_blocks; /* # of blocks used by inode bit map */
int16_t s_zmap_blocks; /* # of blocks used by zone bit map */
uint16_t s_firstdatazone; /* number of first data zone (small) */
int16_t s_log_zone_size; /* log2 of blocks/zone */
uint32_t s_max_size; /* maximum file size on this device */
int16_t s_magic; /* magic number to recognize super-blocks */
int16_t s_pad; /* try to avoid compiler-dependent padding */
uint32_t s_zones; /* number of zones (replaces s_nzones in V2) */
} superblock;
#define s_firstdatazone_old s_firstdatazone
#undef MFSFLAG_CLEAN
#undef MFSFLAG_MANDATORY_MASK
#endif

View File

@ -0,0 +1,16 @@
#ifndef _MKFS_MFS_TYPE_H__
#define _MKFS_MFS_TYPE_H__
/* Declaration of the V2/V3 inode as it is on the disk (not in core). */
struct inode { /* V2/V3 disk inode */
uint16_t i_mode; /* file type, protection, etc. */
uint16_t i_nlinks; /* how many links to this file. */
uint16_t i_uid; /* user id of the file's owner. */
uint16_t i_gid; /* group number */
uint32_t i_size; /* current file size in bytes */
uint32_t i_atime; /* when was file data last accessed */
uint32_t i_mtime; /* when was file data last changed */
uint32_t i_ctime; /* when was inode data last changed */
uint32_t i_zone[NR_TZONES]; /* zone nums for direct, ind, and dbl ind */
};
#endif

View File

@ -0,0 +1,3 @@
PROG= mkfs.mfsv2l
.include <../Makefile.mkfs>

View File

@ -0,0 +1,13 @@
/* Extended V2 minixFS as defined by Linux
* The difference with the normal V2 file systems as used on MINIX are the
* size of the file names in the directoru entries, which are extended
* to 30 characters (instead of 14.)
*/
/* Constants; unchanged from regular V2... */
#include "../v2/const.h"
/* ... except for magic number contained in super-block: */
#define SUPER_V2L 0x2478 /* magic # for "Linux" extended V2 minixFS */
#undef SUPER_MAGIC
#define SUPER_MAGIC SUPER_V2L

View File

@ -0,0 +1,2 @@
/* Directory entry structure; unchanged from V1L */
#include "../v1l/mfsdir.h"

View File

@ -0,0 +1,2 @@
/* Super block; unchanged from regular V2 */
#include "../v2/super.h"

View File

@ -0,0 +1,2 @@
/* Inode structure; unchanged from regular V2 */
#include "../v2/type.h"

View File

@ -0,0 +1,6 @@
PROG= mkfs.mfs
BINDIR= /sbin
SYMLINKS+= $(BINDIR)/$(PROG) /usr/sbin/mkfs.mfs3
.include <../Makefile.mkfs>