/* * Copyright (c) 2011 Maurizio Lombardi * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - 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. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. */ /** @addtogroup libminix * @{ */ #ifndef _MINIX_FS_H_ #define _MINIX_FS_H_ #include <stdint.h> #define MFS_BLOCKSIZE 1024 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #define S_IFDIR 0040000 /* Directory */ #define S_IFREG 0100000 /* Regular file */ #define S_IFMT 00170000 /* The following block sizes are valid only on V3 filesystem */ #define MFS_MIN_BLOCKSIZE 1024 #define MFS_MAX_BLOCKSIZE 4096 #define MFS_ROOT_INO 1 #define MFS_SUPERBLOCK 1 #define MFS_SUPERBLOCK_SIZE 1024 #define MFS_BOOTBLOCK_SIZE 1024 #define V2_NR_DIRECT_ZONES 7 #define V2_NR_INDIRECT_ZONES 3 #define V1_NR_DIRECT_ZONES 7 #define V1_NR_INDIRECT_ZONES 2 #define V1_INODES_PER_BLOCK (MFS_BLOCKSIZE / sizeof(struct mfs_inode)) #define V2_INODES_PER_BLOCK (MFS_BLOCKSIZE / sizeof(struct mfs2_inode)) #define V3_INODES_PER_BLOCK(bs) ((bs) / sizeof(struct mfs2_inode)) #define MFS_DIRSIZE 16 #define MFSL_DIRSIZE 32 #define MFS3_DIRSIZE 64 #define MFS_MAX_NAME_LEN 14 #define MFS_L_MAX_NAME_LEN 30 #define MFS3_MAX_NAME_LEN 60 #define MFS_MAGIC_V1 0x137F #define MFS_MAGIC_V1R 0x7F13 #define MFS_MAGIC_V1L 0x138F #define MFS_MAGIC_V1LR 0x8F13 #define MFS_MAGIC_V2 0x2468 #define MFS_MAGIC_V2R 0x6824 #define MFS_MAGIC_V2L 0x2478 #define MFS_MAGIC_V2LR 0x7824 #define MFS_MAGIC_V3 0x4D5A #define MFS_MAGIC_V3R 0x5A4D #define MFS_VALID_FS 0x0001 #define MFS_ERROR_FS 0x0002 /* MFS V1/V2 superblock data on disk */ struct mfs_superblock { /* Total number of inodes on the device */ uint16_t s_ninodes; /* Total number of zones on the device */ uint16_t s_nzones; /* Number of inode bitmap blocks */ uint16_t s_ibmap_blocks; /* Number of zone bitmap blocks */ uint16_t s_zbmap_blocks; /* First data zone on device */ uint16_t s_first_data_zone; /* Base 2 logarithm of the zone to block ratio */ uint16_t s_log2_zone_size; /* Maximum file size expressed in bytes */ uint32_t s_max_file_size; /* * Magic number used to recognize MinixFS * and to detect on-disk endianness */ uint16_t s_magic; /* Flag used to detect FS errors */ uint16_t s_state; /* Total number of zones on the device (V2 only) */ uint32_t s_nzones2; } __attribute__((packed)); /* MFS V3 superblock data on disk */ struct mfs3_superblock { /* Total number of inodes on the device */ uint32_t s_ninodes; uint16_t s_pad0; /* Number of inode bitmap blocks */ int16_t s_ibmap_blocks; /* Number of zone bitmap blocks */ int16_t s_zbmap_blocks; /* First data zone on device */ uint16_t s_first_data_zone; /* Base 2 logarithm of the zone to block ratio */ int16_t s_log2_zone_size; int16_t s_pad1; /* Maximum file size expressed in bytes */ uint32_t s_max_file_size; /* Total number of zones on the device */ uint32_t s_nzones; /* * Magic number used to recognize MinixFS * and to detect on-disk endianness */ int16_t s_magic; int16_t s_pad2; /* Filesystem block size expressed in bytes */ uint16_t s_block_size; /* Filesystem disk format version */ int8_t s_disk_version; } __attribute__((packed)); /* MinixFS V1 inode structure as it is on disk */ struct mfs_inode { uint16_t i_mode; int16_t i_uid; int32_t i_size; int32_t i_mtime; uint8_t i_gid; uint8_t i_nlinks; /* Block numbers for direct zones */ uint16_t i_dzone[V1_NR_DIRECT_ZONES]; /* Block numbers for indirect zones */ uint16_t i_izone[V1_NR_INDIRECT_ZONES]; } __attribute__((packed)); /* MinixFS V2 inode structure as it is on disk (also valid for V3). */ struct mfs2_inode { uint16_t i_mode; uint16_t i_nlinks; int16_t i_uid; uint16_t i_gid; int32_t i_size; int32_t i_atime; int32_t i_mtime; int32_t i_ctime; /* Block numbers for direct zones */ uint32_t i_dzone[V2_NR_DIRECT_ZONES]; /* Block numbers for indirect zones */ uint32_t i_izone[V2_NR_INDIRECT_ZONES]; } __attribute__((packed)); /* MinixFS V1/V2 directory entry on-disk structure */ struct mfs_dentry { uint16_t d_inum; char d_name[0]; }; /* MinixFS V3 directory entry on-disk structure */ struct mfs3_dentry { uint32_t d_inum; char d_name[0]; }; #endif /** * @} */