root / lab4 / .minix-src / include / ufs / ext2fs / ext2fs.h @ 14
History | View | Annotate | Download (14.9 KB)
1 | 13 | up20180614 | /* $NetBSD: ext2fs.h,v 1.36 2013/06/23 07:28:37 dholland Exp $ */
|
---|---|---|---|
2 | |||
3 | /*
|
||
4 | * Copyright (c) 1982, 1986, 1993
|
||
5 | * The Regents of the University of California. All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | * 3. Neither the name of the University nor the names of its contributors
|
||
16 | * may be used to endorse or promote products derived from this software
|
||
17 | * without specific prior written permission.
|
||
18 | *
|
||
19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
29 | * SUCH DAMAGE.
|
||
30 | *
|
||
31 | * @(#)fs.h 8.10 (Berkeley) 10/27/94
|
||
32 | * Modified for ext2fs by Manuel Bouyer.
|
||
33 | */
|
||
34 | |||
35 | /*
|
||
36 | * Copyright (c) 1997 Manuel Bouyer.
|
||
37 | *
|
||
38 | * Redistribution and use in source and binary forms, with or without
|
||
39 | * modification, are permitted provided that the following conditions
|
||
40 | * are met:
|
||
41 | * 1. Redistributions of source code must retain the above copyright
|
||
42 | * notice, this list of conditions and the following disclaimer.
|
||
43 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
44 | * notice, this list of conditions and the following disclaimer in the
|
||
45 | * documentation and/or other materials provided with the distribution.
|
||
46 | *
|
||
47 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||
48 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
49 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||
50 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
51 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
52 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
53 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
54 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
55 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
56 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
57 | *
|
||
58 | * @(#)fs.h 8.10 (Berkeley) 10/27/94
|
||
59 | * Modified for ext2fs by Manuel Bouyer.
|
||
60 | */
|
||
61 | |||
62 | #ifndef _UFS_EXT2FS_EXT2FS_H_
|
||
63 | #define _UFS_EXT2FS_EXT2FS_H_
|
||
64 | |||
65 | #include <sys/bswap.h> |
||
66 | |||
67 | /*
|
||
68 | * Each disk drive contains some number of file systems.
|
||
69 | * A file system consists of a number of cylinder groups.
|
||
70 | * Each cylinder group has inodes and data.
|
||
71 | *
|
||
72 | * A file system is described by its super-block, which in turn
|
||
73 | * describes the cylinder groups. The super-block is critical
|
||
74 | * data and is replicated in each cylinder group to protect against
|
||
75 | * catastrophic loss. This is done at `newfs' time and the critical
|
||
76 | * super-block data does not change, so the copies need not be
|
||
77 | * referenced further unless disaster strikes.
|
||
78 | *
|
||
79 | * The first boot and super blocks are given in absolute disk addresses.
|
||
80 | * The byte-offset forms are preferred, as they don't imply a sector size.
|
||
81 | */
|
||
82 | #define BBSIZE 1024 |
||
83 | #define SBSIZE 1024 |
||
84 | #define BBOFF ((off_t)(0)) |
||
85 | #define SBOFF ((off_t)(BBOFF + BBSIZE))
|
||
86 | #define BBLOCK ((daddr_t)(0)) |
||
87 | #define SBLOCK ((daddr_t)(BBLOCK + BBSIZE / DEV_BSIZE))
|
||
88 | |||
89 | /*
|
||
90 | * Addresses stored in inodes are capable of addressing blocks
|
||
91 | * XXX
|
||
92 | */
|
||
93 | |||
94 | /*
|
||
95 | * MINBSIZE is the smallest allowable block size.
|
||
96 | * MINBSIZE must be big enough to hold a cylinder group block,
|
||
97 | * thus changes to (struct cg) must keep its size within MINBSIZE.
|
||
98 | * Note that super blocks are always of size SBSIZE,
|
||
99 | * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE.
|
||
100 | */
|
||
101 | #define LOG_MINBSIZE 10 |
||
102 | #define MINBSIZE (1 << LOG_MINBSIZE) |
||
103 | |||
104 | /*
|
||
105 | * The path name on which the file system is mounted is maintained
|
||
106 | * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in
|
||
107 | * the super block for this name.
|
||
108 | */
|
||
109 | #define MAXMNTLEN 512 |
||
110 | |||
111 | /*
|
||
112 | * MINFREE gives the minimum acceptable percentage of file system
|
||
113 | * blocks which may be free. If the freelist drops below this level
|
||
114 | * only the superuser may continue to allocate blocks. This may
|
||
115 | * be set to 0 if no reserve of free blocks is deemed necessary,
|
||
116 | * however throughput drops by fifty percent if the file system
|
||
117 | * is run at between 95% and 100% full; thus the minimum default
|
||
118 | * value of fs_minfree is 5%. However, to get good clustering
|
||
119 | * performance, 10% is a better choice. hence we use 10% as our
|
||
120 | * default value. With 10% free space, fragmentation is not a
|
||
121 | * problem, so we choose to optimize for time.
|
||
122 | */
|
||
123 | #define MINFREE 5 |
||
124 | |||
125 | /*
|
||
126 | * Super block for an ext2fs file system.
|
||
127 | */
|
||
128 | struct ext2fs {
|
||
129 | uint32_t e2fs_icount; /* Inode count */
|
||
130 | uint32_t e2fs_bcount; /* blocks count */
|
||
131 | uint32_t e2fs_rbcount; /* reserved blocks count */
|
||
132 | uint32_t e2fs_fbcount; /* free blocks count */
|
||
133 | uint32_t e2fs_ficount; /* free inodes count */
|
||
134 | uint32_t e2fs_first_dblock; /* first data block */
|
||
135 | uint32_t e2fs_log_bsize; /* block size = 1024*(2^e2fs_log_bsize) */
|
||
136 | uint32_t e2fs_fsize; /* fragment size */
|
||
137 | uint32_t e2fs_bpg; /* blocks per group */
|
||
138 | uint32_t e2fs_fpg; /* frags per group */
|
||
139 | uint32_t e2fs_ipg; /* inodes per group */
|
||
140 | uint32_t e2fs_mtime; /* mount time */
|
||
141 | uint32_t e2fs_wtime; /* write time */
|
||
142 | uint16_t e2fs_mnt_count; /* mount count */
|
||
143 | uint16_t e2fs_max_mnt_count; /* max mount count */
|
||
144 | uint16_t e2fs_magic; /* magic number */
|
||
145 | uint16_t e2fs_state; /* file system state */
|
||
146 | uint16_t e2fs_beh; /* behavior on errors */
|
||
147 | uint16_t e2fs_minrev; /* minor revision level */
|
||
148 | uint32_t e2fs_lastfsck; /* time of last fsck */
|
||
149 | uint32_t e2fs_fsckintv; /* max time between fscks */
|
||
150 | uint32_t e2fs_creator; /* creator OS */
|
||
151 | uint32_t e2fs_rev; /* revision level */
|
||
152 | uint16_t e2fs_ruid; /* default uid for reserved blocks */
|
||
153 | uint16_t e2fs_rgid; /* default gid for reserved blocks */
|
||
154 | /* EXT2_DYNAMIC_REV superblocks */
|
||
155 | uint32_t e2fs_first_ino; /* first non-reserved inode */
|
||
156 | uint16_t e2fs_inode_size; /* size of inode structure */
|
||
157 | uint16_t e2fs_block_group_nr; /* block grp number of this sblk*/
|
||
158 | uint32_t e2fs_features_compat; /* compatible feature set */
|
||
159 | uint32_t e2fs_features_incompat; /* incompatible feature set */
|
||
160 | uint32_t e2fs_features_rocompat; /* RO-compatible feature set */
|
||
161 | uint8_t e2fs_uuid[16]; /* 128-bit uuid for volume */ |
||
162 | char e2fs_vname[16]; /* volume name */ |
||
163 | char e2fs_fsmnt[64]; /* name mounted on */ |
||
164 | uint32_t e2fs_algo; /* For compression */
|
||
165 | uint8_t e2fs_prealloc; /* # of blocks to preallocate */
|
||
166 | uint8_t e2fs_dir_prealloc; /* # of blocks to preallocate for dir */
|
||
167 | uint16_t e2fs_reserved_ngdb; /* # of reserved gd blocks for resize */
|
||
168 | uint32_t reserved2[204];
|
||
169 | }; |
||
170 | |||
171 | |||
172 | /* in-memory data for ext2fs */
|
||
173 | struct m_ext2fs {
|
||
174 | struct ext2fs e2fs;
|
||
175 | u_char e2fs_fsmnt[MAXMNTLEN]; /* name mounted on */
|
||
176 | int8_t e2fs_ronly; /* mounted read-only flag */
|
||
177 | int8_t e2fs_fmod; /* super block modified flag */
|
||
178 | int32_t e2fs_bsize; /* block size */
|
||
179 | int32_t e2fs_bshift; /* ``lblkno'' calc of logical blkno */
|
||
180 | int32_t e2fs_bmask; /* ``blkoff'' calc of blk offsets */
|
||
181 | int64_t e2fs_qbmask; /* ~fs_bmask - for use with quad size */
|
||
182 | int32_t e2fs_fsbtodb; /* fsbtodb and dbtofsb shift constant */
|
||
183 | int32_t e2fs_ncg; /* number of cylinder groups */
|
||
184 | int32_t e2fs_ngdb; /* number of group descriptor block */
|
||
185 | int32_t e2fs_ipb; /* number of inodes per block */
|
||
186 | int32_t e2fs_itpg; /* number of inode table per group */
|
||
187 | struct ext2_gd *e2fs_gd; /* group descripors */ |
||
188 | }; |
||
189 | |||
190 | |||
191 | |||
192 | /*
|
||
193 | * Filesystem identification
|
||
194 | */
|
||
195 | #define E2FS_MAGIC 0xef53 /* the ext2fs magic number */ |
||
196 | #define E2FS_REV0 0 /* GOOD_OLD revision */ |
||
197 | #define E2FS_REV1 1 /* Support compat/incompat features */ |
||
198 | |||
199 | /* compatible/incompatible features */
|
||
200 | #define EXT2F_COMPAT_PREALLOC 0x0001 |
||
201 | #define EXT2F_COMPAT_AFS 0x0002 |
||
202 | #define EXT2F_COMPAT_HASJOURNAL 0x0004 |
||
203 | #define EXT2F_COMPAT_EXTATTR 0x0008 |
||
204 | #define EXT2F_COMPAT_RESIZE 0x0010 |
||
205 | #define EXT2F_COMPAT_DIRHASHINDEX 0x0020 |
||
206 | #define EXT2F_COMPAT_BITS \
|
||
207 | "\20" \
|
||
208 | "\06COMPAT_DIRHASHINDEX" \
|
||
209 | "\05COMPAT_RESIZE" \
|
||
210 | "\04COMPAT_EXTATTR" \
|
||
211 | "\03COMPAT_HASJOURNAL" \
|
||
212 | "\02COMPAT_AFS" \
|
||
213 | "\01COMPAT_PREALLOC"
|
||
214 | |||
215 | #define EXT2F_ROCOMPAT_SPARSESUPER 0x0001 |
||
216 | #define EXT2F_ROCOMPAT_LARGEFILE 0x0002 |
||
217 | #define EXT2F_ROCOMPAT_BTREE_DIR 0x0004 |
||
218 | #define EXT2F_ROCOMPAT_HUGE_FILE 0x0008 |
||
219 | #define EXT2F_ROCOMPAT_GDT_CSUM 0x0010 |
||
220 | #define EXT2F_ROCOMPAT_DIR_NLINK 0x0020 |
||
221 | #define EXT2F_ROCOMPAT_EXTRA_ISIZE 0x0040 |
||
222 | #define EXT2F_ROCOMPAT_BITS \
|
||
223 | "\20" \
|
||
224 | "\07ROCOMPAT_EXTRA_ISIZE" \
|
||
225 | "\06ROCOMPAT_DIR_NLINK" \
|
||
226 | "\05ROCOMPAT_GDT_CSUM" \
|
||
227 | "\04ROCOMPAT_HUGE_FILE" \
|
||
228 | "\03ROCOMPAT_BTREE_DIR" \
|
||
229 | "\02ROCOMPAT_LARGEFILE" \
|
||
230 | "\01ROCOMPAT_SPARSESUPER"
|
||
231 | |||
232 | #define EXT2F_INCOMPAT_COMP 0x0001 |
||
233 | #define EXT2F_INCOMPAT_FTYPE 0x0002 |
||
234 | #define EXT2F_INCOMPAT_REPLAY_JOURNAL 0x0004 |
||
235 | #define EXT2F_INCOMPAT_USES_JOURNAL 0x0008 |
||
236 | #define EXT2F_INCOMPAT_META_BG 0x0010 |
||
237 | #define EXT2F_INCOMPAT_EXTENTS 0x0040 |
||
238 | #define EXT2F_INCOMPAT_64BIT 0x0080 |
||
239 | #define EXT2F_INCOMPAT_MMP 0x0100 |
||
240 | #define EXT2F_INCOMPAT_FLEX_BG 0x0200 |
||
241 | #define EXT2F_INCOMPAT_BITS \
|
||
242 | "\20" \
|
||
243 | "\012INCOMPAT_FLEX_BG" \
|
||
244 | "\011INCOMPAT_MMP" \
|
||
245 | "\010INCOMPAT_64BIT" \
|
||
246 | "\07INCOMPAT_EXTENTS" \
|
||
247 | "\05INCOMPAT_META_BG" \
|
||
248 | "\04INCOMPAT_USES_JOURNAL" \
|
||
249 | "\03INCOMPAT_REPLAY_JOURNAL" \
|
||
250 | "\02INCOMPAT_FTYPE" \
|
||
251 | "\01INCOMPAT_COMP"
|
||
252 | |||
253 | /*
|
||
254 | * Features supported in this implementation
|
||
255 | *
|
||
256 | * We support the following REV1 features:
|
||
257 | * - EXT2F_ROCOMPAT_SPARSESUPER
|
||
258 | * superblock backups stored only in cg_has_sb(bno) groups
|
||
259 | * - EXT2F_ROCOMPAT_LARGEFILE
|
||
260 | * use e2di_dacl in struct ext2fs_dinode to store
|
||
261 | * upper 32bit of size for >2GB files
|
||
262 | * - EXT2F_INCOMPAT_FTYPE
|
||
263 | * store file type to e2d_type in struct ext2fs_direct
|
||
264 | * (on REV0 e2d_namlen is uint16_t and no e2d_type, like ffs)
|
||
265 | */
|
||
266 | #define EXT2F_COMPAT_SUPP 0x0000 |
||
267 | #define EXT2F_ROCOMPAT_SUPP (EXT2F_ROCOMPAT_SPARSESUPER \
|
||
268 | | EXT2F_ROCOMPAT_LARGEFILE \ |
||
269 | | EXT2F_ROCOMPAT_HUGE_FILE) |
||
270 | #define EXT2F_INCOMPAT_SUPP EXT2F_INCOMPAT_FTYPE
|
||
271 | |||
272 | /*
|
||
273 | * Definitions of behavior on errors
|
||
274 | */
|
||
275 | #define E2FS_BEH_CONTINUE 1 /* continue operation */ |
||
276 | #define E2FS_BEH_READONLY 2 /* remount fs read only */ |
||
277 | #define E2FS_BEH_PANIC 3 /* cause panic */ |
||
278 | #define E2FS_BEH_DEFAULT E2FS_BEH_CONTINUE
|
||
279 | |||
280 | /*
|
||
281 | * OS identification
|
||
282 | */
|
||
283 | #define E2FS_OS_LINUX 0 |
||
284 | #define E2FS_OS_HURD 1 |
||
285 | #define E2FS_OS_MASIX 2 |
||
286 | #define E2FS_OS_FREEBSD 3 |
||
287 | #define E2FS_OS_LITES 4 |
||
288 | |||
289 | /*
|
||
290 | * Filesystem clean flags
|
||
291 | */
|
||
292 | #define E2FS_ISCLEAN 0x01 |
||
293 | #define E2FS_ERRORS 0x02 |
||
294 | |||
295 | /* ext2 file system block group descriptor */
|
||
296 | |||
297 | struct ext2_gd {
|
||
298 | uint32_t ext2bgd_b_bitmap; /* blocks bitmap block */
|
||
299 | uint32_t ext2bgd_i_bitmap; /* inodes bitmap block */
|
||
300 | uint32_t ext2bgd_i_tables; /* inodes table block */
|
||
301 | uint16_t ext2bgd_nbfree; /* number of free blocks */
|
||
302 | uint16_t ext2bgd_nifree; /* number of free inodes */
|
||
303 | uint16_t ext2bgd_ndirs; /* number of directories */
|
||
304 | uint16_t reserved; |
||
305 | uint32_t reserved2[3];
|
||
306 | }; |
||
307 | |||
308 | |||
309 | /*
|
||
310 | * If the EXT2F_ROCOMPAT_SPARSESUPER flag is set, the cylinder group has a
|
||
311 | * copy of the super and cylinder group descriptors blocks only if it's
|
||
312 | * 1, a power of 3, 5 or 7
|
||
313 | */
|
||
314 | |||
315 | static __inline int cg_has_sb(int) __unused; |
||
316 | static __inline int |
||
317 | cg_has_sb(int i)
|
||
318 | { |
||
319 | int a3, a5, a7;
|
||
320 | |||
321 | if (i == 0 || i == 1) |
||
322 | return 1; |
||
323 | for (a3 = 3, a5 = 5, a7 = 7; |
||
324 | a3 <= i || a5 <= i || a7 <= i; |
||
325 | a3 *= 3, a5 *= 5, a7 *= 7) |
||
326 | if (i == a3 || i == a5 || i == a7)
|
||
327 | return 1; |
||
328 | return 0; |
||
329 | } |
||
330 | |||
331 | /* EXT2FS metadatas are stored in little-endian byte order. These macros
|
||
332 | * helps reading theses metadatas
|
||
333 | */
|
||
334 | |||
335 | #if BYTE_ORDER == LITTLE_ENDIAN
|
||
336 | # define h2fs16(x) (x)
|
||
337 | # define h2fs32(x) (x)
|
||
338 | # define h2fs64(x) (x)
|
||
339 | # define fs2h16(x) (x)
|
||
340 | # define fs2h32(x) (x)
|
||
341 | # define fs2h64(x) (x)
|
||
342 | # define e2fs_sbload(old, new) memcpy((new), (old), SBSIZE);
|
||
343 | # define e2fs_cgload(old, new, size) memcpy((new), (old), (size));
|
||
344 | # define e2fs_sbsave(old, new) memcpy((new), (old), SBSIZE);
|
||
345 | # define e2fs_cgsave(old, new, size) memcpy((new), (old), (size));
|
||
346 | #else
|
||
347 | void e2fs_sb_bswap(struct ext2fs *, struct ext2fs *); |
||
348 | void e2fs_cg_bswap(struct ext2_gd *, struct ext2_gd *, int); |
||
349 | # define h2fs16(x) bswap16(x)
|
||
350 | # define h2fs32(x) bswap32(x)
|
||
351 | # define h2fs64(x) bswap64(x)
|
||
352 | # define fs2h16(x) bswap16(x)
|
||
353 | # define fs2h32(x) bswap32(x)
|
||
354 | # define fs2h64(x) bswap64(x)
|
||
355 | # define e2fs_sbload(old, new) e2fs_sb_bswap((old), (new))
|
||
356 | # define e2fs_cgload(old, new, size) e2fs_cg_bswap((old), (new), (size));
|
||
357 | # define e2fs_sbsave(old, new) e2fs_sb_bswap((old), (new))
|
||
358 | # define e2fs_cgsave(old, new, size) e2fs_cg_bswap((old), (new), (size));
|
||
359 | #endif
|
||
360 | |||
361 | /*
|
||
362 | * Turn file system block numbers into disk block addresses.
|
||
363 | * This maps file system blocks to device size blocks.
|
||
364 | */
|
||
365 | #define EXT2_FSBTODB(fs, b) ((b) << (fs)->e2fs_fsbtodb)
|
||
366 | #define EXT2_DBTOFSB(fs, b) ((b) >> (fs)->e2fs_fsbtodb)
|
||
367 | |||
368 | /*
|
||
369 | * Macros for handling inode numbers:
|
||
370 | * inode number to file system block offset.
|
||
371 | * inode number to cylinder group number.
|
||
372 | * inode number to file system block address.
|
||
373 | */
|
||
374 | #define ino_to_cg(fs, x) (((x) - 1) / (fs)->e2fs.e2fs_ipg) |
||
375 | #define ino_to_fsba(fs, x) \
|
||
376 | ((fs)->e2fs_gd[ino_to_cg((fs), (x))].ext2bgd_i_tables + \ |
||
377 | (((x) - 1) % (fs)->e2fs.e2fs_ipg) / (fs)->e2fs_ipb)
|
||
378 | #define ino_to_fsbo(fs, x) (((x) - 1) % (fs)->e2fs_ipb) |
||
379 | |||
380 | /*
|
||
381 | * Give cylinder group number for a file system block.
|
||
382 | * Give cylinder group block number for a file system block.
|
||
383 | */
|
||
384 | #define dtog(fs, d) (((d) - (fs)->e2fs.e2fs_first_dblock) / (fs)->e2fs.e2fs_fpg)
|
||
385 | #define dtogd(fs, d) \
|
||
386 | (((d) - (fs)->e2fs.e2fs_first_dblock) % (fs)->e2fs.e2fs_fpg) |
||
387 | |||
388 | /*
|
||
389 | * The following macros optimize certain frequently calculated
|
||
390 | * quantities by using shifts and masks in place of divisions
|
||
391 | * modulos and multiplications.
|
||
392 | */
|
||
393 | #define ext2_blkoff(fs, loc) /* calculates (loc % fs->e2fs_bsize) */ \ |
||
394 | ((loc) & (fs)->e2fs_qbmask) |
||
395 | #define ext2_lblktosize(fs, blk) /* calculates (blk * fs->e2fs_bsize) */ \ |
||
396 | ((blk) << (fs)->e2fs_bshift) |
||
397 | #define ext2_lblkno(fs, loc) /* calculates (loc / fs->e2fs_bsize) */ \ |
||
398 | ((loc) >> (fs)->e2fs_bshift) |
||
399 | #define ext2_blkroundup(fs, size) /* calculates roundup(size, fs->e2fs_bsize) */ \ |
||
400 | (((size) + (fs)->e2fs_qbmask) & (fs)->e2fs_bmask) |
||
401 | #define ext2_fragroundup(fs, size) /* calculates roundup(size, fs->e2fs_bsize) */ \ |
||
402 | (((size) + (fs)->e2fs_qbmask) & (fs)->e2fs_bmask) |
||
403 | /*
|
||
404 | * Determine the number of available frags given a
|
||
405 | * percentage to hold in reserve.
|
||
406 | */
|
||
407 | #define freespace(fs) \
|
||
408 | ((fs)->e2fs.e2fs_fbcount - (fs)->e2fs.e2fs_rbcount) |
||
409 | |||
410 | /*
|
||
411 | * Number of indirects in a file system block.
|
||
412 | */
|
||
413 | #define EXT2_NINDIR(fs) ((fs)->e2fs_bsize / sizeof(uint32_t)) |
||
414 | |||
415 | #endif /* !_UFS_EXT2FS_EXT2FS_H_ */ |