2 * Copyright (c) 2011 Maurizio Lombardi
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup libminix
38 #define MFS_BLOCKSIZE 1024
39 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
40 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
41 #define S_IFDIR 0040000 /* Directory */
42 #define S_IFREG 0100000 /* Regular file */
43 #define S_IFMT 00170000
45 /* The following block sizes are valid only on V3 filesystem */
46 #define MFS_MIN_BLOCKSIZE 1024
47 #define MFS_MAX_BLOCKSIZE 4096
49 #define MFS_ROOT_INO 1
50 #define MFS_SUPERBLOCK 1
51 #define MFS_SUPERBLOCK_SIZE 1024
52 #define MFS_BOOTBLOCK_SIZE 1024
54 #define V2_NR_DIRECT_ZONES 7
55 #define V2_NR_INDIRECT_ZONES 3
57 #define V1_NR_DIRECT_ZONES 7
58 #define V1_NR_INDIRECT_ZONES 2
60 #define V1_INODES_PER_BLOCK (MFS_BLOCKSIZE / sizeof(struct mfs_inode))
61 #define V2_INODES_PER_BLOCK (MFS_BLOCKSIZE / sizeof(struct mfs2_inode))
62 #define V3_INODES_PER_BLOCK(bs) ((bs) / sizeof(struct mfs2_inode))
64 #define MFS_DIRSIZE 16
65 #define MFSL_DIRSIZE 32
66 #define MFS3_DIRSIZE 64
68 #define MFS_MAX_NAME_LEN 14
69 #define MFS_L_MAX_NAME_LEN 30
70 #define MFS3_MAX_NAME_LEN 60
72 #define MFS_MAGIC_V1 0x137F
73 #define MFS_MAGIC_V1R 0x7F13
75 #define MFS_MAGIC_V1L 0x138F
76 #define MFS_MAGIC_V1LR 0x8F13
78 #define MFS_MAGIC_V2 0x2468
79 #define MFS_MAGIC_V2R 0x6824
81 #define MFS_MAGIC_V2L 0x2478
82 #define MFS_MAGIC_V2LR 0x7824
84 #define MFS_MAGIC_V3 0x4D5A
85 #define MFS_MAGIC_V3R 0x5A4D
87 #define MFS_VALID_FS 0x0001
88 #define MFS_ERROR_FS 0x0002
90 /* MFS V1/V2 superblock data on disk */
91 struct mfs_superblock
{
92 /* Total number of inodes on the device */
94 /* Total number of zones on the device */
96 /* Number of inode bitmap blocks */
97 uint16_t s_ibmap_blocks
;
98 /* Number of zone bitmap blocks */
99 uint16_t s_zbmap_blocks
;
100 /* First data zone on device */
101 uint16_t s_first_data_zone
;
102 /* Base 2 logarithm of the zone to block ratio */
103 uint16_t s_log2_zone_size
;
104 /* Maximum file size expressed in bytes */
105 uint32_t s_max_file_size
;
107 * Magic number used to recognize MinixFS
108 * and to detect on-disk endianness
111 /* Flag used to detect FS errors */
113 /* Total number of zones on the device (V2 only) */
115 } __attribute__((packed
));
117 /* MFS V3 superblock data on disk */
118 struct mfs3_superblock
{
119 /* Total number of inodes on the device */
122 /* Number of inode bitmap blocks */
123 int16_t s_ibmap_blocks
;
124 /* Number of zone bitmap blocks */
125 int16_t s_zbmap_blocks
;
126 /* First data zone on device */
127 uint16_t s_first_data_zone
;
128 /* Base 2 logarithm of the zone to block ratio */
129 int16_t s_log2_zone_size
;
131 /* Maximum file size expressed in bytes */
132 uint32_t s_max_file_size
;
133 /* Total number of zones on the device */
136 * Magic number used to recognize MinixFS
137 * and to detect on-disk endianness
141 /* Filesystem block size expressed in bytes */
142 uint16_t s_block_size
;
143 /* Filesystem disk format version */
144 int8_t s_disk_version
;
145 } __attribute__((packed
));
147 /* MinixFS V1 inode structure as it is on disk */
155 /* Block numbers for direct zones */
156 uint16_t i_dzone
[V1_NR_DIRECT_ZONES
];
157 /* Block numbers for indirect zones */
158 uint16_t i_izone
[V1_NR_INDIRECT_ZONES
];
159 } __attribute__((packed
));
161 /* MinixFS V2 inode structure as it is on disk (also valid for V3). */
171 /* Block numbers for direct zones */
172 uint32_t i_dzone
[V2_NR_DIRECT_ZONES
];
173 /* Block numbers for indirect zones */
174 uint32_t i_izone
[V2_NR_INDIRECT_ZONES
];
175 } __attribute__((packed
));
177 /* MinixFS V1/V2 directory entry on-disk structure */
183 /* MinixFS V3 directory entry on-disk structure */