Add better description.
[dragonfly.git] / sys / i386 / boot / dosboot / fs.h
1 /*\r
2  * Copyright (c) 1982, 1986 Regents of the University of California.\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  * 1. Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright\r
11  *    notice, this list of conditions and the following disclaimer in the\r
12  *    documentation and/or other materials provided with the distribution.\r
13  * 3. All advertising materials mentioning features or use of this software\r
14  *    must display the following acknowledgement:\r
15  *      This product includes software developed by the University of\r
16  *      California, Berkeley and its contributors.\r
17  * 4. Neither the name of the University nor the names of its contributors\r
18  *    may be used to endorse or promote products derived from this software\r
19  *    without specific prior written permission.\r
20  *\r
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\r
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\r
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
31  * SUCH DAMAGE.\r
32  *\r
33  *      from: @(#)fs.h  7.12 (Berkeley) 5/8/91\r
34  * $FreeBSD: src/sys/i386/boot/dosboot/fs.h,v 1.6 1999/12/29 04:32:50 peter Exp $\r
35  * $DragonFly: src/sys/i386/boot/dosboot/Attic/fs.h,v 1.2 2003/06/17 04:28:34 dillon Exp $\r
36  */\r
37 \r
38 #ifndef _UFS_FS_H_\r
39 #define _UFS_FS_H_ 1\r
40 \r
41 #define MAXFRAG 8\r
42 \r
43 /*\r
44  * Each disk drive contains some number of file systems.\r
45  * A file system consists of a number of cylinder groups.\r
46  * Each cylinder group has inodes and data.\r
47  *\r
48  * A file system is described by its super-block, which in turn\r
49  * describes the cylinder groups.  The super-block is critical\r
50  * data and is replicated in each cylinder group to protect against\r
51  * catastrophic loss.  This is done at `newfs' time and the critical\r
52  * super-block data does not change, so the copies need not be\r
53  * referenced further unless disaster strikes.\r
54  *\r
55  * For file system fs, the offsets of the various blocks of interest\r
56  * are given in the super block as:\r
57  *      [fs->fs_sblkno]         Super-block\r
58  *      [fs->fs_cblkno]         Cylinder group block\r
59  *      [fs->fs_iblkno]         Inode blocks\r
60  *      [fs->fs_dblkno]         Data blocks\r
61  * The beginning of cylinder group cg in fs, is given by\r
62  * the ``cgbase(fs, cg)'' macro.\r
63  *\r
64  * The first boot and super blocks are given in absolute disk addresses.\r
65  * The byte-offset forms are preferred, as they don't imply a sector size.\r
66  */\r
67 #define BBSIZE          8192\r
68 #define SBSIZE          8192\r
69 #define BBOFF           ((off_t)(0))\r
70 #define SBOFF           ((off_t)(BBOFF + BBSIZE))\r
71 #define BBLOCK          ((daddr_t)(0))\r
72 #define SBLOCK          ((daddr_t)(BBLOCK + BBSIZE / DEV_BSIZE))\r
73 \r
74 /*\r
75  * Addresses stored in inodes are capable of addressing fragments\r
76  * of `blocks'. File system blocks of at most size MAXBSIZE can \r
77  * be optionally broken into 2, 4, or 8 pieces, each of which is\r
78  * addressible; these pieces may be DEV_BSIZE, or some multiple of\r
79  * a DEV_BSIZE unit.\r
80  *\r
81  * Large files consist of exclusively large data blocks.  To avoid\r
82  * undue wasted disk space, the last data block of a small file may be\r
83  * allocated as only as many fragments of a large block as are\r
84  * necessary.  The file system format retains only a single pointer\r
85  * to such a fragment, which is a piece of a single large block that\r
86  * has been divided.  The size of such a fragment is determinable from\r
87  * information in the inode, using the ``blksize(fs, ip, lbn)'' macro.\r
88  *\r
89  * The file system records space availability at the fragment level;\r
90  * to determine block availability, aligned fragments are examined.\r
91  *\r
92  * The root inode is the root of the file system.\r
93  * Inode 0 can't be used for normal purposes and\r
94  * historically bad blocks were linked to inode 1,\r
95  * thus the root inode is 2. (inode 1 is no longer used for\r
96  * this purpose, however numerous dump tapes make this\r
97  * assumption, so we are stuck with it)\r
98  */\r
99 #define ROOTINO         ((ino_t)2)\r
100 \r
101 /*\r
102  * MINBSIZE is the smallest allowable block size.\r
103  * In order to insure that it is possible to create files of size\r
104  * 2^32 with only two levels of indirection, MINBSIZE is set to 4096.\r
105  * MINBSIZE must be big enough to hold a cylinder group block,\r
106  * thus changes to (struct cg) must keep its size within MINBSIZE.\r
107  * Note that super blocks are always of size SBSIZE,\r
108  * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE.\r
109  */\r
110 #define MINBSIZE        4096\r
111 \r
112 /*\r
113  * The path name on which the file system is mounted is maintained\r
114  * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in \r
115  * the super block for this name.\r
116  * The limit on the amount of summary information per file system\r
117  * is defined by MAXCSBUFS. It is currently parameterized for a\r
118  * maximum of two million cylinders.\r
119  */\r
120 #define MAXMNTLEN 512\r
121 #define MAXCSBUFS 32\r
122 \r
123 /*\r
124  * Per cylinder group information; summarized in blocks allocated\r
125  * from first cylinder group data blocks.  These blocks have to be\r
126  * read in from fs_csaddr (size fs_cssize) in addition to the\r
127  * super block.\r
128  *\r
129  * N.B. sizeof(struct csum) must be a power of two in order for\r
130  * the ``fs_cs'' macro to work (see below).\r
131  */\r
132 struct csum {\r
133         long    cs_ndir;        /* number of directories */\r
134         long    cs_nbfree;      /* number of free blocks */\r
135         long    cs_nifree;      /* number of free inodes */\r
136         long    cs_nffree;      /* number of free frags */\r
137 };\r
138 \r
139 /*\r
140  * Super block for a file system.\r
141  */\r
142 #define FS_MAGIC        0x011954\r
143 #define FSOKAY          0x7c269d38\r
144 struct  fs\r
145 {\r
146         struct  fs *fs_link;            /* linked list of file systems */\r
147         struct  fs *fs_rlink;           /*     used for incore super blocks */\r
148         daddr_t fs_sblkno;              /* addr of super-block in filesys */\r
149         daddr_t fs_cblkno;              /* offset of cyl-block in filesys */\r
150         daddr_t fs_iblkno;              /* offset of inode-blocks in filesys */\r
151         daddr_t fs_dblkno;              /* offset of first data after cg */\r
152         long    fs_cgoffset;            /* cylinder group offset in cylinder */\r
153         long    fs_cgmask;              /* used to calc mod fs_ntrak */\r
154         time_t  fs_time;                /* last time written */\r
155         long    fs_size;                /* number of blocks in fs */\r
156         long    fs_dsize;               /* number of data blocks in fs */\r
157         long    fs_ncg;                 /* number of cylinder groups */\r
158         long    fs_bsize;               /* size of basic blocks in fs */\r
159         long    fs_fsize;               /* size of frag blocks in fs */\r
160         long    fs_frag;                /* number of frags in a block in fs */\r
161 /* these are configuration parameters */\r
162         long    fs_minfree;             /* minimum percentage of free blocks */\r
163         long    fs_rotdelay;            /* num of ms for optimal next block */\r
164         long    fs_rps;                 /* disk revolutions per second */\r
165 /* these fields can be computed from the others */\r
166         long    fs_bmask;               /* ``blkoff'' calc of blk offsets */\r
167         long    fs_fmask;               /* ``fragoff'' calc of frag offsets */\r
168         long    fs_bshift;              /* ``lblkno'' calc of logical blkno */\r
169         long    fs_fshift;              /* ``numfrags'' calc number of frags */\r
170 /* these are configuration parameters */\r
171         long    fs_maxcontig;           /* max number of contiguous blks */\r
172         long    fs_maxbpg;              /* max number of blks per cyl group */\r
173 /* these fields can be computed from the others */\r
174         long    fs_fragshift;           /* block to frag shift */\r
175         long    fs_fsbtodb;             /* fsbtodb and dbtofsb shift constant */\r
176         long    fs_sbsize;              /* actual size of super block */\r
177         long    fs_csmask;              /* csum block offset */\r
178         long    fs_csshift;             /* csum block number */\r
179         long    fs_nindir;              /* value of NINDIR */\r
180         long    fs_inopb;               /* value of INOPB */\r
181         long    fs_nspf;                /* value of NSPF */\r
182 /* yet another configuration parameter */\r
183         long    fs_optim;               /* optimization preference, see below */\r
184 /* these fields are derived from the hardware */\r
185         long    fs_npsect;              /* # sectors/track including spares */\r
186         long    fs_interleave;          /* hardware sector interleave */\r
187         long    fs_trackskew;           /* sector 0 skew, per track */\r
188         long    fs_headswitch;          /* head switch time, usec */\r
189         long    fs_trkseek;             /* track-to-track seek, usec */\r
190 /* sizes determined by number of cylinder groups and their sizes */\r
191         daddr_t fs_csaddr;              /* blk addr of cyl grp summary area */\r
192         long    fs_cssize;              /* size of cyl grp summary area */\r
193         long    fs_cgsize;              /* cylinder group size */\r
194 /* these fields are derived from the hardware */\r
195         long    fs_ntrak;               /* tracks per cylinder */\r
196         long    fs_nsect;               /* sectors per track */\r
197         long    fs_spc;                 /* sectors per cylinder */\r
198 /* this comes from the disk driver partitioning */\r
199         long    fs_ncyl;                /* cylinders in file system */\r
200 /* these fields can be computed from the others */\r
201         long    fs_cpg;                 /* cylinders per group */\r
202         long    fs_ipg;                 /* inodes per group */\r
203         long    fs_fpg;                 /* blocks per group * fs_frag */\r
204 /* this data must be re-computed after crashes */\r
205         struct  csum fs_cstotal;        /* cylinder summary information */\r
206 /* these fields are cleared at mount time */\r
207         char    fs_fmod;                /* super block modified flag */\r
208         char    fs_clean;               /* file system is clean flag */\r
209         char    fs_ronly;               /* mounted read-only flag */\r
210         char    fs_flags;               /* currently unused flag */\r
211         char    fs_fsmnt[MAXMNTLEN];    /* name mounted on */\r
212 /* these fields retain the current block allocation info */\r
213         long    fs_cgrotor;             /* last cg searched */\r
214         struct  csum *fs_csp[MAXCSBUFS];/* list of fs_cs info buffers */\r
215         long    fs_cpc;                 /* cyl per cycle in postbl */\r
216         short   fs_opostbl[16][8];      /* old rotation block list head */\r
217         long    fs_sparecon[55];        /* reserved for future constants */\r
218         long    fs_state;               /* validate fs_clean field */\r
219         union {\r
220 /*              quad_t v;*/\r
221                 long val[2];\r
222         }       fs_qbmask;              /* ~fs_bmask - for use with quad size */\r
223         union {\r
224 /*              quad_t v;*/\r
225                 long val[2];\r
226         }       fs_qfmask;              /* ~fs_fmask - for use with quad size */\r
227         long    fs_postblformat;        /* format of positional layout tables */\r
228         long    fs_nrpos;               /* number of rotaional positions */\r
229         long    fs_postbloff;           /* (short) rotation block list head */\r
230         long    fs_rotbloff;            /* (u_char) blocks for each rotation */\r
231         long    fs_magic;               /* magic number */\r
232         u_char  fs_space[1];            /* list of blocks for each rotation */\r
233 /* actually longer */\r
234 };\r
235 /*\r
236  * Preference for optimization.\r
237  */\r
238 #define FS_OPTTIME      0       /* minimize allocation time */\r
239 #define FS_OPTSPACE     1       /* minimize disk fragmentation */\r
240 \r
241 /*\r
242  * Rotational layout table format types\r
243  */\r
244 #define FS_42POSTBLFMT          -1      /* 4.2BSD rotational table format */\r
245 #define FS_DYNAMICPOSTBLFMT     1       /* dynamic rotational table format */\r
246 /*\r
247  * Macros for access to superblock array structures\r
248  */\r
249 #define fs_postbl(fs, cylno) \\r
250     (((fs)->fs_postblformat == FS_42POSTBLFMT) \\r
251     ? ((fs)->fs_opostbl[cylno]) \\r
252     : ((short *)((char *)(fs) + (fs)->fs_postbloff) + (cylno) * (fs)->fs_nrpos))\r
253 #define fs_rotbl(fs) \\r
254     (((fs)->fs_postblformat == FS_42POSTBLFMT) \\r
255     ? ((fs)->fs_space) \\r
256     : ((u_char *)((char *)(fs) + (fs)->fs_rotbloff)))\r
257 \r
258 /*\r
259  * Convert cylinder group to base address of its global summary info.\r
260  *\r
261  * N.B. This macro assumes that sizeof(struct csum) is a power of two.\r
262  */\r
263 #define fs_cs(fs, indx) \\r
264         fs_csp[(indx) >> (fs)->fs_csshift][(indx) & ~(fs)->fs_csmask]\r
265 \r
266 /*\r
267  * Cylinder group block for a file system.\r
268  */\r
269 #define CG_MAGIC        0x090255\r
270 struct  cg {\r
271         struct  cg *cg_link;            /* linked list of cyl groups */\r
272         long    cg_magic;               /* magic number */\r
273         time_t  cg_time;                /* time last written */\r
274         long    cg_cgx;                 /* we are the cgx'th cylinder group */\r
275         short   cg_ncyl;                /* number of cyl's this cg */\r
276         short   cg_niblk;               /* number of inode blocks this cg */\r
277         long    cg_ndblk;               /* number of data blocks this cg */\r
278         struct  csum cg_cs;             /* cylinder summary information */\r
279         long    cg_rotor;               /* position of last used block */\r
280         long    cg_frotor;              /* position of last used frag */\r
281         long    cg_irotor;              /* position of last used inode */\r
282         long    cg_frsum[MAXFRAG];      /* counts of available frags */\r
283         long    cg_btotoff;             /* (long) block totals per cylinder */\r
284         long    cg_boff;                /* (short) free block positions */\r
285         long    cg_iusedoff;            /* (char) used inode map */\r
286         long    cg_freeoff;             /* (u_char) free block map */\r
287         long    cg_nextfreeoff;         /* (u_char) next available space */\r
288         long    cg_sparecon[16];        /* reserved for future use */\r
289         u_char  cg_space[1];            /* space for cylinder group maps */\r
290 /* actually longer */\r
291 };\r
292 /*\r
293  * Macros for access to cylinder group array structures\r
294  */\r
295 #define cg_blktot(cgp) \\r
296     (((cgp)->cg_magic != CG_MAGIC) \\r
297     ? (((struct ocg *)(cgp))->cg_btot) \\r
298     : ((long *)((char *)(cgp) + (cgp)->cg_btotoff)))\r
299 #define cg_blks(fs, cgp, cylno) \\r
300     (((cgp)->cg_magic != CG_MAGIC) \\r
301     ? (((struct ocg *)(cgp))->cg_b[cylno]) \\r
302     : ((short *)((char *)(cgp) + (cgp)->cg_boff) + (cylno) * (fs)->fs_nrpos))\r
303 #define cg_inosused(cgp) \\r
304     (((cgp)->cg_magic != CG_MAGIC) \\r
305     ? (((struct ocg *)(cgp))->cg_iused) \\r
306     : ((char *)((char *)(cgp) + (cgp)->cg_iusedoff)))\r
307 #define cg_blksfree(cgp) \\r
308     (((cgp)->cg_magic != CG_MAGIC) \\r
309     ? (((struct ocg *)(cgp))->cg_free) \\r
310     : ((u_char *)((char *)(cgp) + (cgp)->cg_freeoff)))\r
311 #define cg_chkmagic(cgp) \\r
312     ((cgp)->cg_magic == CG_MAGIC || ((struct ocg *)(cgp))->cg_magic == CG_MAGIC)\r
313 \r
314 /*\r
315  * The following structure is defined\r
316  * for compatibility with old file systems.\r
317  */\r
318 struct  ocg {\r
319         struct  ocg *cg_link;           /* linked list of cyl groups */\r
320         struct  ocg *cg_rlink;          /*     used for incore cyl groups */\r
321         time_t  cg_time;                /* time last written */\r
322         long    cg_cgx;                 /* we are the cgx'th cylinder group */\r
323         short   cg_ncyl;                /* number of cyl's this cg */\r
324         short   cg_niblk;               /* number of inode blocks this cg */\r
325         long    cg_ndblk;               /* number of data blocks this cg */\r
326         struct  csum cg_cs;             /* cylinder summary information */\r
327         long    cg_rotor;               /* position of last used block */\r
328         long    cg_frotor;              /* position of last used frag */\r
329         long    cg_irotor;              /* position of last used inode */\r
330         long    cg_frsum[8];            /* counts of available frags */\r
331         long    cg_btot[32];            /* block totals per cylinder */\r
332         short   cg_b[32][8];            /* positions of free blocks */\r
333         char    cg_iused[256];          /* used inode map */\r
334         long    cg_magic;               /* magic number */\r
335         u_char  cg_free[1];             /* free block map */\r
336 /* actually longer */\r
337 };\r
338 \r
339 /*\r
340  * Turn file system block numbers into disk block addresses.\r
341  * This maps file system blocks to device size blocks.\r
342  */\r
343 #define fsbtodb(fs, b)  ((b) << (fs)->fs_fsbtodb)\r
344 #define dbtofsb(fs, b)  ((b) >> (fs)->fs_fsbtodb)\r
345 \r
346 /*\r
347  * Cylinder group macros to locate things in cylinder groups.\r
348  * They calc file system addresses of cylinder group data structures.\r
349  */\r
350 #define cgbase(fs, c)   ((daddr_t)((fs)->fs_fpg * (c)))\r
351 #define cgstart(fs, c) \\r
352         (cgbase(fs, c) + (fs)->fs_cgoffset * ((c) & ~((fs)->fs_cgmask)))\r
353 #define cgsblock(fs, c) (cgstart(fs, c) + (fs)->fs_sblkno)      /* super blk */\r
354 #define cgtod(fs, c)    (cgstart(fs, c) + (fs)->fs_cblkno)      /* cg block */\r
355 #define cgimin(fs, c)   (cgstart(fs, c) + (fs)->fs_iblkno)      /* inode blk */\r
356 #define cgdmin(fs, c)   (cgstart(fs, c) + (fs)->fs_dblkno)      /* 1st data */\r
357 \r
358 /*\r
359  * Macros for handling inode numbers:\r
360  *     inode number to file system block offset.\r
361  *     inode number to cylinder group number.\r
362  *     inode number to file system block address.\r
363  */\r
364 #define itoo(fs, x)     ((x) % INOPB(fs))\r
365 #define itog(fs, x)     ((x) / (fs)->fs_ipg)\r
366 #define itod(fs, x) \\r
367         ((daddr_t)(cgimin(fs, itog(fs, x)) + \\r
368         (blkstofrags((fs), (((x) % (fs)->fs_ipg) / INOPB(fs))))))\r
369 \r
370 /*\r
371  * Give cylinder group number for a file system block.\r
372  * Give cylinder group block number for a file system block.\r
373  */\r
374 #define dtog(fs, d)     ((d) / (fs)->fs_fpg)\r
375 #define dtogd(fs, d)    ((d) % (fs)->fs_fpg)\r
376 \r
377 /*\r
378  * Extract the bits for a block from a map.\r
379  * Compute the cylinder and rotational position of a cyl block addr.\r
380  */\r
381 #define blkmap(fs, map, loc) \\r
382     (((map)[(loc) / NBBY] >> ((loc) % NBBY)) & (0xff >> (NBBY - (fs)->fs_frag)))\r
383 #define cbtocylno(fs, bno) \\r
384     ((bno) * NSPF(fs) / (fs)->fs_spc)\r
385 #define cbtorpos(fs, bno) \\r
386     (((bno) * NSPF(fs) % (fs)->fs_spc / (fs)->fs_nsect * (fs)->fs_trackskew + \\r
387      (bno) * NSPF(fs) % (fs)->fs_spc % (fs)->fs_nsect * (fs)->fs_interleave) % \\r
388      (fs)->fs_nsect * (fs)->fs_nrpos / (fs)->fs_npsect)\r
389 \r
390 /*\r
391  * The following macros optimize certain frequently calculated\r
392  * quantities by using shifts and masks in place of divisions\r
393  * modulos and multiplications.\r
394  */\r
395 #define blkoff(fs, loc)         /* calculates (loc % fs->fs_bsize) */ \\r
396         ((loc) & ~(fs)->fs_bmask)\r
397 #define fragoff(fs, loc)        /* calculates (loc % fs->fs_fsize) */ \\r
398         ((loc) & ~(fs)->fs_fmask)\r
399 #define lblktosize(fs, blk)     /* calculates (blk * fs->fs_bsize) */ \\r
400         ((blk) << (fs)->fs_bshift)\r
401 #define lblkno(fs, loc)         /* calculates (loc / fs->fs_bsize) */ \\r
402         ((loc) >> (fs)->fs_bshift)\r
403 #define numfrags(fs, loc)       /* calculates (loc / fs->fs_fsize) */ \\r
404         ((loc) >> (fs)->fs_fshift)\r
405 #define blkroundup(fs, size)    /* calculates roundup(size, fs->fs_bsize) */ \\r
406         (((size) + (fs)->fs_bsize - 1) & (fs)->fs_bmask)\r
407 #define fragroundup(fs, size)   /* calculates roundup(size, fs->fs_fsize) */ \\r
408         (((size) + (fs)->fs_fsize - 1) & (fs)->fs_fmask)\r
409 #define fragstoblks(fs, frags)  /* calculates (frags / fs->fs_frag) */ \\r
410         ((frags) >> (fs)->fs_fragshift)\r
411 #define blkstofrags(fs, blks)   /* calculates (blks * fs->fs_frag) */ \\r
412         ((blks) << (fs)->fs_fragshift)\r
413 #define fragnum(fs, fsb)        /* calculates (fsb % fs->fs_frag) */ \\r
414         ((fsb) & ((fs)->fs_frag - 1))\r
415 #define blknum(fs, fsb)         /* calculates rounddown(fsb, fs->fs_frag) */ \\r
416         ((fsb) &~ ((fs)->fs_frag - 1))\r
417 \r
418 /*\r
419  * Determine the number of available frags given a\r
420  * percentage to hold in reserve\r
421  */\r
422 #define freespace(fs, percentreserved) \\r
423         (blkstofrags((fs), (fs)->fs_cstotal.cs_nbfree) + \\r
424         (fs)->fs_cstotal.cs_nffree - ((fs)->fs_dsize * (percentreserved) / 100))\r
425 \r
426 /*\r
427  * Determining the size of a file block in the file system.\r
428  */\r
429 #define blksize(fs, ip, lbn) \\r
430         (((lbn) >= NDADDR || (ip)->i_size >= ((lbn) + 1) << (fs)->fs_bshift) \\r
431             ? (fs)->fs_bsize \\r
432             : (fragroundup(fs, blkoff(fs, (ip)->i_size))))\r
433 #define dblksize(fs, dip, lbn) \\r
434         (((lbn) >= NDADDR || (dip)->di_size >= ((lbn) + 1) << (fs)->fs_bshift) \\r
435             ? (fs)->fs_bsize \\r
436             : (fragroundup(fs, blkoff(fs, (dip)->di_size))))\r
437 \r
438 /*\r
439  * Number of disk sectors per block; assumes DEV_BSIZE byte sector size.\r
440  */\r
441 #define NSPB(fs)        ((fs)->fs_nspf << (fs)->fs_fragshift)\r
442 #define NSPF(fs)        ((fs)->fs_nspf)\r
443 \r
444 /*\r
445  * INOPB is the number of inodes in a secondary storage block.\r
446  */\r
447 #define INOPB(fs)       ((fs)->fs_inopb)\r
448 #define INOPF(fs)       ((fs)->fs_inopb >> (fs)->fs_fragshift)\r
449 \r
450 /*\r
451  * NINDIR is the number of indirects in a file system block.\r
452  */\r
453 #define NINDIR(fs)      ((fs)->fs_nindir)\r
454 \r
455 #ifdef KERNEL\r
456 \r
457 extern void fserr(struct fs *, int /*uid_t*/, const char *);\r
458 extern void fragacct(struct fs *, int, long *, int);\r
459 extern int isblock(struct fs *, u_char *, daddr_t);\r
460 extern void clrblock(struct fs *, u_char *, daddr_t);\r
461 extern void setblock(struct fs *, u_char *, daddr_t);\r
462 extern ino_t dirpref(struct fs *);\r
463 extern daddr_t mapsearch(struct fs *, struct cg *, daddr_t, int);\r
464 \r
465 #endif /* _KERNEL */\r
466 #endif /* _UFS_FS_H_ */\r