Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/include/ufs/ffs/fs.h

Source at commit 296 created 12 years 10 months ago.
By ifabio, add i386 folder
1/*
2 * Copyright (c) 2000-2008 Apple, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
29/*
30 * Copyright (c) 1982, 1986, 1993
31 *The Regents of the University of California. All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 * notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 * notice, this list of conditions and the following disclaimer in the
40 * documentation and/or other materials provided with the distribution.
41 * 3. All advertising materials mentioning features or use of this software
42 * must display the following acknowledgement:
43 *This product includes software developed by the University of
44 *California, Berkeley and its contributors.
45 * 4. Neither the name of the University nor the names of its contributors
46 * may be used to endorse or promote products derived from this software
47 * without specific prior written permission.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 * SUCH DAMAGE.
60 *
61 *@(#)fs.h8.13 (Berkeley) 3/21/95
62 */
63#ifndef _FFS_FS_H_
64#define _FFS_FS_H_
65
66#ifdef __APPLE_API_UNSTABLE
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 * For file system fs, the offsets of the various blocks of interest
80 * are given in the super block as:
81 *[fs->fs_sblkno]Super-block
82 *[fs->fs_cblkno]Cylinder group block
83 *[fs->fs_iblkno]Inode blocks
84 *[fs->fs_dblkno]Data blocks
85 * The beginning of cylinder group cg in fs, is given by
86 * the ``cgbase(fs, cg)'' macro.
87 *
88 * The first boot and super blocks are given in absolute disk addresses.
89 * The byte-offset forms are preferred, as they don't imply a sector size.
90 */
91#define BBSIZE8192
92#define SBSIZE8192
93#defineBBOFF((off_t)(0))
94#defineSBOFF((off_t)(BBOFF + BBSIZE))
95#defineBBLOCK((ufs_daddr_t)(0))
96#defineSBLOCK((ufs_daddr_t)(BBLOCK + BBSIZE / DEV_BSIZE))
97
98/*
99 * Addresses stored in inodes are capable of addressing fragments
100 * of `blocks'. File system blocks of at most size MAXBSIZE can
101 * be optionally broken into 2, 4, or 8 pieces, each of which is
102 * addressible; these pieces may be DEV_BSIZE, or some multiple of
103 * a DEV_BSIZE unit.
104 *
105 * Large files consist of exclusively large data blocks. To avoid
106 * undue wasted disk space, the last data block of a small file may be
107 * allocated as only as many fragments of a large block as are
108 * necessary. The file system format retains only a single pointer
109 * to such a fragment, which is a piece of a single large block that
110 * has been divided. The size of such a fragment is determinable from
111 * information in the inode, using the ``blksize(fs, ip, lbn)'' macro.
112 *
113 * The file system records space availability at the fragment level;
114 * to determine block availability, aligned fragments are examined.
115 */
116
117/*
118 * MINBSIZE is the smallest allowable block size.
119 * In order to insure that it is possible to create files of size
120 * 2^32 with only two levels of indirection, MINBSIZE is set to 4096.
121 * MINBSIZE must be big enough to hold a cylinder group block,
122 * thus changes to (struct cg) must keep its size within MINBSIZE.
123 * Note that super blocks are always of size SBSIZE,
124 * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE.
125 */
126#define MINBSIZE4096
127
128/*
129 * The path name on which the file system is mounted is maintained
130 * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in
131 * the super block for this name.
132 */
133#define MAXMNTLEN512
134
135/*
136 * The limit on the amount of summary information per file system
137 * is defined by MAXCSBUFS. It is currently parameterized for a
138 * size of 128 bytes (2 million cylinder groups on machines with
139 * 32-bit pointers, and 1 million on 64-bit machines). One pointer
140 * is taken away to point to an array of cluster sizes that is
141 * computed as cylinder groups are inspected.
142 * There is a 128-byte region in the superblock reserved for in-core
143 * pointers to summary information. Originally this included an array
144 * of pointers to blocks of struct csum; now there are just three
145 * pointers and the remaining space is padded with fs_ocsp[].
146 *
147 * NOCSPTRS determines the size of this padding. One pointer (fs_csp)
148 * is taken away to point to a contiguous array of struct csum for
149 * all cylinder groups; a second (fs_maxcluster) points to an array
150 * of cluster sizes that is computed as cylinder groups are inspected,
151 * and the third points to an array that tracks the creation of new
152 * directories.
153 */
154#define NOCSPTRS ((128 / sizeof(void *)) - 3)
155
156/*
157 * A summary of contiguous blocks of various sizes is maintained
158 * in each cylinder group. Normally this is set by the initial
159 * value of fs_maxcontig. To conserve space, a maximum summary size
160 * is set by FS_MAXCONTIG.
161 */
162#define FS_MAXCONTIG16
163
164/*
165 * MINFREE gives the minimum acceptable percentage of file system
166 * blocks which may be free. If the freelist drops below this level
167 * only the superuser may continue to allocate blocks. This may
168 * be set to 0 if no reserve of free blocks is deemed necessary,
169 * however throughput drops by fifty percent if the file system
170 * is run at between 95% and 100% full; thus the minimum default
171 * value of fs_minfree is 5%. However, to get good clustering
172 * performance, 10% is a better choice. hence we use 10% as our
173 * default value. With 10% free space, fragmentation is not a
174 * problem, so we choose to optimize for time.
175 */
176#define MINFREE5
177#define DEFAULTOPTFS_OPTTIME
178
179/* Grigoriy Orlov <gluk@ptci.ru> has done some extensive work to fine
180 * tune the layout preferences for directories within a filesystem.
181 * His algorithm can be tuned by adjusting the following parameters
182 * which tell the system the average file size and the average number
183 * of files per directory. These defaults are well selected for typical
184 * filesystems, but may need to be tuned for odd cases like filesystems
185 * being used for squid caches or news spools.
186 */
187#define AVFILESIZ16384
188#define AFPDIR64
189
190/*
191 * Per cylinder group information; summarized in blocks allocated
192 * from first cylinder group data blocks. These blocks have to be
193 * read in from fs_csaddr (size fs_cssize) in addition to the
194 * super block.
195 */
196struct csum {
197int32_tcs_ndir;/* number of directories */
198int32_tcs_nbfree;/* number of free blocks */
199int32_tcs_nifree;/* number of free inodes */
200int32_tcs_nffree;/* number of free frags */
201};
202
203/*
204 * Super block for an FFS file system.
205 */
206struct fs {
207int32_t fs_firstfield;/* historic file system linked list, */
208int32_t fs_unused_1;/* used for incore super blocks */
209ufs_daddr_t fs_sblkno;/* addr of super-block in filesys */
210ufs_daddr_t fs_cblkno;/* offset of cyl-block in filesys */
211ufs_daddr_t fs_iblkno;/* offset of inode-blocks in filesys */
212ufs_daddr_t fs_dblkno;/* offset of first data after cg */
213int32_t fs_cgoffset;/* cylinder group offset in cylinder */
214int32_t fs_cgmask;/* used to calc mod fs_ntrak */
215u_int32_t fs_time;/* last time written */
216int32_t fs_size;/* number of blocks in fs */
217int32_t fs_dsize;/* number of data blocks in fs */
218int32_t fs_ncg;/* number of cylinder groups */
219int32_t fs_bsize;/* size of basic blocks in fs */
220int32_t fs_fsize;/* size of frag blocks in fs */
221int32_t fs_frag;/* number of frags in a block in fs */
222/* these are configuration parameters */
223int32_t fs_minfree;/* minimum percentage of free blocks */
224int32_t fs_rotdelay;/* num of ms for optimal next block */
225int32_t fs_rps;/* disk revolutions per second */
226/* these fields can be computed from the others */
227int32_t fs_bmask;/* ``blkoff'' calc of blk offsets */
228int32_t fs_fmask;/* ``fragoff'' calc of frag offsets */
229int32_t fs_bshift;/* ``lblkno'' calc of logical blkno */
230int32_t fs_fshift;/* ``numfrags'' calc number of frags */
231/* these are configuration parameters */
232int32_t fs_maxcontig;/* max number of contiguous blks */
233int32_t fs_maxbpg;/* max number of blks per cyl group */
234/* these fields can be computed from the others */
235int32_t fs_fragshift;/* block to frag shift */
236int32_t fs_fsbtodb;/* fsbtodb and dbtofsb shift constant */
237int32_t fs_sbsize;/* actual size of super block */
238int32_t fs_csmask;/* csum block offset (now unused) */
239int32_t fs_csshift;/* csum block number (now unused) */
240int32_t fs_nindir;/* value of NINDIR */
241int32_t fs_inopb;/* value of INOPB */
242int32_t fs_nspf;/* value of NSPF */
243/* yet another configuration parameter */
244int32_t fs_optim;/* optimization preference, see below */
245/* these fields are derived from the hardware */
246int32_t fs_npsect;/* # sectors/track including spares */
247int32_t fs_interleave;/* hardware sector interleave */
248int32_t fs_trackskew;/* sector 0 skew, per track */
249int32_t fs_headswitch;/* head switch time, usec */
250int32_t fs_trkseek;/* track-to-track seek, usec */
251/* sizes determined by number of cylinder groups and their sizes */
252ufs_daddr_t fs_csaddr;/* blk addr of cyl grp summary area */
253int32_t fs_cssize;/* size of cyl grp summary area */
254int32_t fs_cgsize;/* cylinder group size */
255/* these fields are derived from the hardware */
256int32_t fs_ntrak;/* tracks per cylinder */
257int32_t fs_nsect;/* sectors per track */
258int32_t fs_spc;/* sectors per cylinder */
259/* this comes from the disk driver partitioning */
260int32_t fs_ncyl;/* cylinders in file system */
261/* these fields can be computed from the others */
262int32_t fs_cpg;/* cylinders per group */
263int32_t fs_ipg;/* inodes per group */
264int32_t fs_fpg;/* blocks per group * fs_frag */
265/* this data must be re-computed after crashes */
266structcsum fs_cstotal;/* cylinder summary information */
267/* these fields are cleared at mount time */
268int8_t fs_fmod;/* super block modified flag */
269int8_t fs_clean;/* file system is clean flag */
270int8_t fs_ronly;/* mounted read-only flag */
271int8_t fs_flags;/* currently unused flag */
272u_char fs_fsmnt[MAXMNTLEN];/* name mounted on */
273/* these fields retain the current block allocation info */
274int32_t fs_cgrotor;/* last cg searched */
275void *fs_ocsp[NOCSPTRS];/* list of fs_cs info buffers */
276u_int8_t *fs_contigdirs;/* # of contiguously allocated dirs */
277structcsum *fs_csp;/* list of fs_cs info buffers */
278int32_t *fs_maxcluster;/* max cluster in each cyl group */
279int32_t fs_cpc;/* cyl per cycle in postbl */
280int16_t fs_opostbl[16][8];/* old rotation block list head */
281int32_t fs_avgfilesize;/* expected average file size */
282int32_t fs_avgfpdir;/* expected # of files per directory */
283int32_t fs_sparecon[48];/* reserved for future constants */
284int32_t fs_contigsumsize;/* size of cluster summary array */
285int32_t fs_maxsymlinklen;/* max length of an internal symlink */
286int32_t fs_inodefmt;/* format of on-disk inodes */
287u_int64_t fs_maxfilesize;/* maximum representable file size */
288int64_t fs_qbmask;/* ~fs_bmask for use with 64-bit size */
289int64_t fs_qfmask;/* ~fs_fmask for use with 64-bit size */
290int32_t fs_state;/* validate fs_clean field */
291int32_t fs_postblformat;/* format of positional layout tables */
292int32_t fs_nrpos;/* number of rotational positions */
293int32_t fs_postbloff;/* (u_int16) rotation block list head */
294int32_t fs_rotbloff;/* (u_int8) blocks for each rotation */
295int32_t fs_magic;/* magic number */
296u_int8_t fs_space[1];/* list of blocks for each rotation */
297/* actually longer */
298} __attribute__((packed,aligned(4)));
299
300/*
301 * Filesystem identification
302 */
303#defineFS_MAGIC0x011954/* the fast filesystem magic number */
304#defineFS_OKAY0x7c269d38/* superblock checksum */
305#define FS_42INODEFMT-1/* 4.2BSD inode format */
306#define FS_44INODEFMT2/* 4.4BSD inode format */
307/*
308 * Preference for optimization.
309 */
310#define FS_OPTTIME0/* minimize allocation time */
311#define FS_OPTSPACE1/* minimize disk fragmentation */
312
313/*
314 * Rotational layout table format types
315 */
316#define FS_42POSTBLFMT-1/* 4.2BSD rotational table format */
317#define FS_DYNAMICPOSTBLFMT1/* dynamic rotational table format */
318/*
319 * Macros for access to superblock array structures
320 */
321#define fs_postbl(fs, cylno) \
322 (((fs)->fs_postblformat == FS_42POSTBLFMT) \
323 ? ((fs)->fs_opostbl[cylno]) \
324 : ((int16_t *)((u_int8_t *)(fs) + \
325(fs)->fs_postbloff) + (cylno) * (fs)->fs_nrpos))
326#define fs_rotbl(fs) \
327 (((fs)->fs_postblformat == FS_42POSTBLFMT) \
328 ? ((fs)->fs_space) \
329 : ((u_int8_t *)((u_int8_t *)(fs) + (fs)->fs_rotbloff)))
330
331/*
332 * The size of a cylinder group is calculated by CGSIZE. The maximum size
333 * is limited by the fact that cylinder groups are at most one block.
334 * Its size is derived from the size of the maps maintained in the
335 * cylinder group and the (struct cg) size.
336 */
337#define CGSIZE(fs) \
338 /* base cg */(sizeof(struct cg) + sizeof(int32_t) + \
339 /* blktot size */(fs)->fs_cpg * sizeof(int32_t) + \
340 /* blks size */(fs)->fs_cpg * (fs)->fs_nrpos * sizeof(int16_t) + \
341 /* inode map */howmany((fs)->fs_ipg, NBBY) + \
342 /* block map */howmany((fs)->fs_cpg * (fs)->fs_spc / NSPF(fs), NBBY) +\
343 /* if present */((fs)->fs_contigsumsize <= 0 ? 0 : \
344 /* cluster sum */(fs)->fs_contigsumsize * sizeof(int32_t) + \
345 /* cluster map */howmany((fs)->fs_cpg * (fs)->fs_spc / NSPB(fs), NBBY)))
346
347/*
348 * Convert cylinder group to base address of its global summary info.
349 *
350 * N.B. This macro assumes that sizeof(struct csum) is a power of two.
351 */
352#define fs_cs(fs, indx) fs_csp[indx]
353
354/*
355 * Cylinder group block for a file system.
356 */
357#defineCG_MAGIC0x090255
358struct cg {
359int32_t cg_firstfield;/* historic cyl groups linked list */
360int32_t cg_magic;/* magic number */
361u_int32_t cg_time;/* time last written */
362int32_t cg_cgx;/* we are the cgx'th cylinder group */
363int16_t cg_ncyl;/* number of cyl's this cg */
364int16_t cg_niblk;/* number of inode blocks this cg */
365int32_t cg_ndblk;/* number of data blocks this cg */
366structcsum cg_cs;/* cylinder summary information */
367int32_t cg_rotor;/* position of last used block */
368int32_t cg_frotor;/* position of last used frag */
369int32_t cg_irotor;/* position of last used inode */
370int32_t cg_frsum[MAXFRAG];/* counts of available frags */
371int32_t cg_btotoff;/* (int32) block totals per cylinder */
372int32_t cg_boff;/* (u_int16) free block positions */
373int32_t cg_iusedoff;/* (u_int8) used inode map */
374int32_t cg_freeoff;/* (u_int8) free block map */
375int32_t cg_nextfreeoff;/* (u_int8) next available space */
376int32_t cg_clustersumoff;/* (u_int32) counts of avail clusters */
377int32_t cg_clusteroff;/* (u_int8) free cluster map */
378int32_t cg_nclusterblks;/* number of clusters this cg */
379int32_t cg_sparecon[13];/* reserved for future use */
380u_int8_t cg_space[1];/* space for cylinder group maps */
381/* actually longer */
382} __attribute__((packed,aligned(4)));
383
384/*
385 * Macros for access to cylinder group array structures
386 */
387#define cg_blktot(cgp) \
388 (((cgp)->cg_magic != CG_MAGIC) \
389 ? (((struct ocg *)(cgp))->cg_btot) \
390 : ((int32_t *)((u_int8_t *)(cgp) + (cgp)->cg_btotoff)))
391#define cg_blks(fs, cgp, cylno) \
392 (((cgp)->cg_magic != CG_MAGIC) \
393 ? (((struct ocg *)(cgp))->cg_b[cylno]) \
394 : ((int16_t *)((u_int8_t *)(cgp) + \
395(cgp)->cg_boff) + (cylno) * (fs)->fs_nrpos))
396#define cg_inosused(cgp) \
397 (((cgp)->cg_magic != CG_MAGIC) \
398 ? (((struct ocg *)(cgp))->cg_iused) \
399 : ((u_int8_t *)((u_int8_t *)(cgp) + (cgp)->cg_iusedoff)))
400#define cg_blksfree(cgp) \
401 (((cgp)->cg_magic != CG_MAGIC) \
402 ? (((struct ocg *)(cgp))->cg_free) \
403 : ((u_int8_t *)((u_int8_t *)(cgp) + (cgp)->cg_freeoff)))
404#define cg_chkmagic(cgp) \
405 ((cgp)->cg_magic == CG_MAGIC || ((struct ocg *)(cgp))->cg_magic == CG_MAGIC)
406#define cg_clustersfree(cgp) \
407 ((u_int8_t *)((u_int8_t *)(cgp) + (cgp)->cg_clusteroff))
408#define cg_clustersum(cgp) \
409 ((int32_t *)((u_int8_t *)(cgp) + (cgp)->cg_clustersumoff))
410
411/*
412 * The following structure is defined
413 * for compatibility with old file systems.
414 */
415struct ocg {
416int32_t cg_firstfield;/* historic linked list of cyl groups */
417int32_t cg_unused_1;/* used for incore cyl groups */
418u_int32_t cg_time;/* time last written */
419int32_t cg_cgx;/* we are the cgx'th cylinder group */
420int16_t cg_ncyl;/* number of cyl's this cg */
421int16_t cg_niblk;/* number of inode blocks this cg */
422int32_t cg_ndblk;/* number of data blocks this cg */
423structcsum cg_cs;/* cylinder summary information */
424int32_t cg_rotor;/* position of last used block */
425int32_t cg_frotor;/* position of last used frag */
426int32_t cg_irotor;/* position of last used inode */
427int32_t cg_frsum[8];/* counts of available frags */
428int32_t cg_btot[32];/* block totals per cylinder */
429int16_t cg_b[32][8];/* positions of free blocks */
430u_int8_t cg_iused[256];/* used inode map */
431int32_t cg_magic;/* magic number */
432u_int8_t cg_free[1];/* free block map */
433/* actually longer */
434} __attribute__((packed,aligned(4)));
435
436/*
437 * Turn file system block numbers into disk block addresses.
438 * This maps file system blocks to device size blocks.
439 */
440#define fsbtodb(fs, b)((b) << (fs)->fs_fsbtodb)
441#definedbtofsb(fs, b)((b) >> (fs)->fs_fsbtodb)
442
443/*
444 * Cylinder group macros to locate things in cylinder groups.
445 * They calc file system addresses of cylinder group data structures.
446 */
447#definecgbase(fs, c)((ufs_daddr_t)((fs)->fs_fpg * (c)))
448#definecgdmin(fs, c)(cgstart(fs, c) + (fs)->fs_dblkno)/* 1st data */
449#definecgimin(fs, c)(cgstart(fs, c) + (fs)->fs_iblkno)/* inode blk */
450#definecgsblock(fs, c)(cgstart(fs, c) + (fs)->fs_sblkno)/* super blk */
451#definecgtod(fs, c)(cgstart(fs, c) + (fs)->fs_cblkno)/* cg block */
452#define cgstart(fs, c)\
453(cgbase(fs, c) + (fs)->fs_cgoffset * ((c) & ~((fs)->fs_cgmask)))
454
455/*
456 * Macros for handling inode numbers:
457 * inode number to file system block offset.
458 * inode number to cylinder group number.
459 * inode number to file system block address.
460 */
461#defineino_to_cg(fs, x)((x) / (fs)->fs_ipg)
462#defineino_to_fsba(fs, x)\
463((ufs_daddr_t)(cgimin(fs, ino_to_cg(fs, x)) +\
464 (blkstofrags((fs), (((x) % (fs)->fs_ipg) / INOPB(fs))))))
465#defineino_to_fsbo(fs, x)((x) % INOPB(fs))
466
467/*
468 * Give cylinder group number for a file system block.
469 * Give cylinder group block number for a file system block.
470 */
471#definedtog(fs, d)((d) / (fs)->fs_fpg)
472#definedtogd(fs, d)((d) % (fs)->fs_fpg)
473
474/*
475 * Extract the bits for a block from a map.
476 * Compute the cylinder and rotational position of a cyl block addr.
477 */
478#define blkmap(fs, map, loc) \
479 (((map)[(loc) / NBBY] >> ((loc) % NBBY)) & (0xff >> (NBBY - (fs)->fs_frag)))
480#define cbtocylno(fs, bno) \
481 ((bno) * NSPF(fs) / (fs)->fs_spc)
482#define cbtorpos(fs, bno) \
483 (((bno) * NSPF(fs) % (fs)->fs_spc / (fs)->fs_nsect * (fs)->fs_trackskew + \
484 (bno) * NSPF(fs) % (fs)->fs_spc % (fs)->fs_nsect * (fs)->fs_interleave) % \
485 (fs)->fs_nsect * (fs)->fs_nrpos / (fs)->fs_npsect)
486
487/*
488 * The following macros optimize certain frequently calculated
489 * quantities by using shifts and masks in place of divisions
490 * modulos and multiplications.
491 */
492#define blkoff(fs, loc)/* calculates (loc % fs->fs_bsize) */ \
493((loc) & (fs)->fs_qbmask)
494#define fragoff(fs, loc)/* calculates (loc % fs->fs_fsize) */ \
495((loc) & (fs)->fs_qfmask)
496#define lblktosize(fs, blk)/* calculates (blk * fs->fs_bsize) */ \
497((blk) << (fs)->fs_bshift)
498#define lblkno(fs, loc)/* calculates (loc / fs->fs_bsize) */ \
499((loc) >> (fs)->fs_bshift)
500#define numfrags(fs, loc)/* calculates (loc / fs->fs_fsize) */ \
501((loc) >> (fs)->fs_fshift)
502#define blkroundup(fs, size)/* calculates roundup(size, fs->fs_bsize) */ \
503(((size) + (fs)->fs_qbmask) & (fs)->fs_bmask)
504#define fragroundup(fs, size)/* calculates roundup(size, fs->fs_fsize) */ \
505(((size) + (fs)->fs_qfmask) & (fs)->fs_fmask)
506#define fragstoblks(fs, frags)/* calculates (frags / fs->fs_frag) */ \
507((frags) >> (fs)->fs_fragshift)
508#define blkstofrags(fs, blks)/* calculates (blks * fs->fs_frag) */ \
509((blks) << (fs)->fs_fragshift)
510#define fragnum(fs, fsb)/* calculates (fsb % fs->fs_frag) */ \
511((fsb) & ((fs)->fs_frag - 1))
512#define blknum(fs, fsb)/* calculates rounddown(fsb, fs->fs_frag) */ \
513((fsb) &~ ((fs)->fs_frag - 1))
514
515/*
516 * Determine the number of available frags given a
517 * percentage to hold in reserve.
518 */
519#define freespace(fs, percentreserved) \
520(blkstofrags((fs), (fs)->fs_cstotal.cs_nbfree) + \
521(fs)->fs_cstotal.cs_nffree - ((fs)->fs_dsize * (percentreserved) / 100))
522
523/*
524 * Determining the size of a file block in the file system.
525 */
526#define blksize(fs, ip, lbn) \
527(((lbn) >= NDADDR || (ip)->i_size >= ((lbn) + 1) << (fs)->fs_bshift) \
528 ? (fs)->fs_bsize \
529 : (fragroundup(fs, blkoff(fs, (ip)->i_size))))
530#define dblksize(fs, dip, lbn) \
531(((lbn) >= NDADDR || (dip)->di_size >= ((lbn) + 1) << (fs)->fs_bshift) \
532 ? (fs)->fs_bsize \
533 : (fragroundup(fs, blkoff(fs, (dip)->di_size))))
534
535/*
536 * Number of disk sectors per block/fragment; assumes DEV_BSIZE byte
537 * sector size.
538 */
539#defineNSPB(fs)((fs)->fs_nspf << (fs)->fs_fragshift)
540#defineNSPF(fs)((fs)->fs_nspf)
541
542/*
543 * Number of inodes in a secondary storage block/fragment.
544 */
545#defineINOPB(fs)((fs)->fs_inopb)
546#defineINOPF(fs)((fs)->fs_inopb >> (fs)->fs_fragshift)
547
548/*
549 * Number of indirects in a file system block.
550 */
551#defineNINDIR(fs)((fs)->fs_nindir)
552
553/*
554 * This macro controls whether the file system format is byte swapped or not.
555 * At NeXT, all little endian machines read and write big endian file systems.
556 */
557#defineBIG_ENDIAN_FS(__LITTLE_ENDIAN__)
558
559#ifdef __APPLE_API_PRIVATE
560extern int inside[], around[];
561extern u_char *fragtbl[];
562#endif /* __APPLE_API_PRIVATE */
563
564
565/*
566 * UFS Label:
567 * The purpose of this label is to name a UFS/FFS filesystem. The label
568 * is located at offset 7K (BBSIZE=8K - UFS_LABEL_SIZE=1K = 7K) of the
569 * partition. The first 7K is still available for boot blocks.
570 */
571
572#define UFS_LABEL_MAGIC{ 'L', 'A', 'B', 'L' }
573#define UFS_LABEL_SIZE1024
574#define UFS_LABEL_OFFSET(BBSIZE - UFS_LABEL_SIZE) /* top 1K */
575#define UFS_LABEL_VERSION1
576#define UFS_MAX_LABEL_NAME512
577
578struct ufslabel {
579 u_int32_tul_magic;
580 u_int16_tul_checksum;/* checksum over entire label*/
581 u_int32_tul_version __attribute__((aligned(4))); /* label version */
582 u_int32_tul_time;/* creation time */
583 u_int16_tul_namelen;/* filesystem name length */
584 u_charul_name[UFS_MAX_LABEL_NAME]; /* filesystem name */
585 u_int64_tul_uuid __attribute__((aligned(4)));/* filesystem uuid */
586 u_charul_reserved[24];/* reserved for future use */
587 u_charul_unused[460];/* pad out to 1K */
588} __attribute__((packed,aligned(4)));
589
590#endif /* __APPLE_API_UNSTABLE */
591#endif /* ! _FFS_FS_H_ */
592

Archive Download this file

Revision: 296