~ubuntu-branches/ubuntu/utopic/grub/utopic

« back to all changes in this revision

Viewing changes to stage2/jfs.h

  • Committer: Bazaar Package Importer
  • Author(s): Jason Thomas
  • Date: 2002-02-04 15:35:01 UTC
  • Revision ID: james.westby@ubuntu.com-20020204153501-neulkag77r3a2m0v
Tags: upstream-0.91
ImportĀ upstreamĀ versionĀ 0.91

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* jfs.h - an extractions from linux/include/linux/jfs/jfs* into one file */
 
2
/*   
 
3
 *  GRUB  --  GRand Unified Bootloader
 
4
 *  Copyright (C) 2000  International Business Machines  Corp.
 
5
 *  Copyright (C) 2001  Free Software Foundation, Inc.
 
6
 *
 
7
 *  This program is free software;  you can redistribute it and/or modify
 
8
 *  it under the terms of the GNU General Public License as published by
 
9
 *  the Free Software Foundation; either version 2 of the License, or 
 
10
 *  (at your option) any later version.
 
11
 * 
 
12
 *  This program is distributed in the hope that it will be useful,
 
13
 *  but WITHOUT ANY WARRANTY;  without even the implied warranty of
 
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 
15
 *  the GNU General Public License for more details.
 
16
 *
 
17
 *  You should have received a copy of the GNU General Public License
 
18
 *  along with this program;  if not, write to the Free Software 
 
19
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
20
 */
 
21
 
 
22
#ifndef _JFS_H_
 
23
#define _JFS_H_
 
24
 
 
25
/* those are from jfs_filsys.h */
 
26
 
 
27
/*
 
28
 *       file system option (superblock flag)
 
29
 */
 
30
/* platform option (conditional compilation) */
 
31
#define JFS_AIX         0x80000000      /* AIX support */
 
32
/*      POSIX name/directory  support */
 
33
 
 
34
#define JFS_OS2         0x40000000      /* OS/2 support */
 
35
/*      case-insensitive name/directory support */
 
36
 
 
37
#define JFS_LINUX       0x10000000      /* Linux support */
 
38
/*      case-sensitive name/directory support */
 
39
 
 
40
/* directory option */
 
41
#define JFS_UNICODE     0x00000001      /* unicode name */
 
42
 
 
43
/* bba */
 
44
#define JFS_SWAP_BYTES          0x00100000      /* running on big endian computer */
 
45
 
 
46
 
 
47
/*
 
48
 *      buffer cache configuration
 
49
 */
 
50
/* page size */
 
51
#ifdef PSIZE
 
52
#undef PSIZE
 
53
#endif
 
54
#define PSIZE           4096    /* page size (in byte) */
 
55
 
 
56
/*
 
57
 *      fs fundamental size
 
58
 *
 
59
 * PSIZE >= file system block size >= PBSIZE >= DISIZE
 
60
 */
 
61
#define PBSIZE          512     /* physical block size (in byte) */
 
62
#define DISIZE          512     /* on-disk inode size (in byte) */
 
63
#define L2DISIZE        9
 
64
#define INOSPERIAG      4096    /* number of disk inodes per iag */
 
65
#define L2INOSPERIAG    12
 
66
#define INOSPEREXT      32      /* number of disk inode per extent */
 
67
#define L2INOSPEREXT    5
 
68
 
 
69
/* Minimum number of bytes supported for a JFS partition */
 
70
#define MINJFS                  (0x1000000)
 
71
 
 
72
/*
 
73
 * fixed byte offset address
 
74
 */
 
75
#define SUPER1_OFF      0x8000  /* primary superblock */
 
76
 
 
77
#define AITBL_OFF       (SUPER1_OFF + PSIZE + (PSIZE << 1))
 
78
 
 
79
/*
 
80
 *      fixed reserved inode number
 
81
 */
 
82
/* aggregate inode */
 
83
#define AGGREGATE_I     1       /* aggregate inode map inode */
 
84
#define FILESYSTEM_I    16      /* 1st/only fileset inode in ait:
 
85
                                 * fileset inode map inode
 
86
                                 */
 
87
 
 
88
/* per fileset inode */
 
89
#define ROOT_I          2       /* fileset root inode */
 
90
 
 
91
/*
 
92
 *      directory configuration
 
93
 */
 
94
#define JFS_NAME_MAX    255
 
95
#define JFS_PATH_MAX    PSIZE
 
96
 
 
97
typedef unsigned char u8;
 
98
typedef char s8;
 
99
typedef unsigned short u16;
 
100
typedef short s16;
 
101
typedef unsigned int u32;
 
102
typedef int s32;
 
103
typedef unsigned long long u64;
 
104
typedef long long s64;
 
105
 
 
106
typedef u16 UniChar;
 
107
 
 
108
/* these from jfs_btree.h */
 
109
 
 
110
/* btpaget_t flag */
 
111
#define BT_TYPE         0x07    /* B+-tree index */
 
112
#define BT_ROOT         0x01    /* root page */
 
113
#define BT_LEAF         0x02    /* leaf page */
 
114
#define BT_INTERNAL     0x04    /* internal page */
 
115
#define BT_RIGHTMOST    0x10    /* rightmost page */
 
116
#define BT_LEFTMOST     0x20    /* leftmost page */
 
117
 
 
118
/* those are from jfs_types.h */
 
119
 
 
120
struct timestruc_t {
 
121
        u32 tv_sec;
 
122
        u32 tv_nsec;
 
123
};
 
124
 
 
125
/*
 
126
 *      physical xd (pxd)
 
127
 */
 
128
typedef struct {
 
129
        unsigned len:24;
 
130
        unsigned addr1:8;
 
131
        u32 addr2;
 
132
} pxd_t;
 
133
 
 
134
/* xd_t field extraction */
 
135
#define lengthPXD(pxd)  ((pxd)->len)
 
136
#define addressPXD(pxd) (((s64)((pxd)->addr1)) << 32 | ((pxd)->addr2))
 
137
 
 
138
/*
 
139
 *      data extent descriptor (dxd)
 
140
 */
 
141
typedef struct {
 
142
        unsigned flag:8;        /* 1: flags */
 
143
        unsigned rsrvd:24;      /* 3: */
 
144
        u32 size;               /* 4: size in byte */
 
145
        unsigned len:24;        /* 3: length in unit of fsblksize */
 
146
        unsigned addr1:8;       /* 1: address in unit of fsblksize */
 
147
        u32 addr2;              /* 4: address in unit of fsblksize */
 
148
} dxd_t;                        /* - 16 - */
 
149
 
 
150
/*
 
151
 *      DASD limit information - stored in directory inode
 
152
 */
 
153
typedef struct dasd {
 
154
        u8 thresh;              /* Alert Threshold (in percent) */
 
155
        u8 delta;               /* Alert Threshold delta (in percent)   */
 
156
        u8 rsrvd1;
 
157
        u8 limit_hi;            /* DASD limit (in logical blocks)       */
 
158
        u32 limit_lo;           /* DASD limit (in logical blocks)       */
 
159
        u8 rsrvd2[3];
 
160
        u8 used_hi;             /* DASD usage (in logical blocks)       */
 
161
        u32 used_lo;            /* DASD usage (in logical blocks)       */
 
162
} dasd_t;
 
163
 
 
164
 
 
165
/* from jfs_superblock.h */
 
166
 
 
167
#define JFS_MAGIC       0x3153464A      /* "JFS1" */
 
168
 
 
169
struct jfs_superblock
 
170
{
 
171
        u32 s_magic;            /* 4: magic number */
 
172
        u32 s_version;          /* 4: version number */
 
173
 
 
174
        s64 s_size;             /* 8: aggregate size in hardware/LVM blocks;
 
175
                                 * VFS: number of blocks
 
176
                                 */
 
177
        s32 s_bsize;            /* 4: aggregate block size in bytes; 
 
178
                                 * VFS: fragment size
 
179
                                 */
 
180
        s16 s_l2bsize;          /* 2: log2 of s_bsize */
 
181
        s16 s_l2bfactor;        /* 2: log2(s_bsize/hardware block size) */
 
182
        s32 s_pbsize;           /* 4: hardware/LVM block size in bytes */
 
183
        s16 s_l2pbsize;         /* 2: log2 of s_pbsize */
 
184
        s16 pad;                /* 2: padding necessary for alignment */
 
185
 
 
186
        u32 s_agsize;           /* 4: allocation group size in aggr. blocks */
 
187
 
 
188
        u32 s_flag;             /* 4: aggregate attributes:
 
189
                                 *    see jfs_filsys.h
 
190
                                 */
 
191
        u32 s_state;            /* 4: mount/unmount/recovery state: 
 
192
                                 *    see jfs_filsys.h
 
193
                                 */
 
194
        s32 s_compress;         /* 4: > 0 if data compression */
 
195
 
 
196
        pxd_t s_ait2;           /* 8: first extent of secondary
 
197
                                 *    aggregate inode table
 
198
                                 */
 
199
 
 
200
        pxd_t s_aim2;           /* 8: first extent of secondary
 
201
                                 *    aggregate inode map
 
202
                                 */
 
203
        u32 s_logdev;           /* 4: device address of log */
 
204
        s32 s_logserial;        /* 4: log serial number at aggregate mount */
 
205
        pxd_t s_logpxd;         /* 8: inline log extent */
 
206
 
 
207
        pxd_t s_fsckpxd;        /* 8: inline fsck work space extent */
 
208
 
 
209
        struct timestruc_t s_time;      /* 8: time last updated */
 
210
 
 
211
        s32 s_fsckloglen;       /* 4: Number of filesystem blocks reserved for
 
212
                                 *    the fsck service log.  
 
213
                                 *    N.B. These blocks are divided among the
 
214
                                 *         versions kept.  This is not a per
 
215
                                 *         version size.
 
216
                                 *    N.B. These blocks are included in the 
 
217
                                 *         length field of s_fsckpxd.
 
218
                                 */
 
219
        s8 s_fscklog;           /* 1: which fsck service log is most recent
 
220
                                 *    0 => no service log data yet
 
221
                                 *    1 => the first one
 
222
                                 *    2 => the 2nd one
 
223
                                 */
 
224
        char s_fpack[11];       /* 11: file system volume name 
 
225
                                 *     N.B. This must be 11 bytes to
 
226
                                 *          conform with the OS/2 BootSector
 
227
                                 *          requirements
 
228
                                 */
 
229
 
 
230
        /* extendfs() parameter under s_state & FM_EXTENDFS */
 
231
        s64 s_xsize;            /* 8: extendfs s_size */
 
232
        pxd_t s_xfsckpxd;       /* 8: extendfs fsckpxd */
 
233
        pxd_t s_xlogpxd;        /* 8: extendfs logpxd */
 
234
        /* - 128 byte boundary - */
 
235
 
 
236
        /*
 
237
         *      DFS VFS support (preliminary) 
 
238
         */
 
239
        char s_attach;          /* 1: VFS: flag: set when aggregate is attached
 
240
                                 */
 
241
        u8 rsrvd4[7];           /* 7: reserved - set to 0 */
 
242
 
 
243
        u64 totalUsable;        /* 8: VFS: total of 1K blocks which are
 
244
                                 * available to "normal" (non-root) users.
 
245
                                 */
 
246
        u64 minFree;            /* 8: VFS: # of 1K blocks held in reserve for 
 
247
                                 * exclusive use of root.  This value can be 0,
 
248
                                 * and if it is then totalUsable will be equal 
 
249
                                 * to # of blocks in aggregate.  I believe this
 
250
                                 * means that minFree + totalUsable = # blocks.
 
251
                                 * In that case, we don't need to store both 
 
252
                                 * totalUsable and minFree since we can compute
 
253
                                 * one from the other.  I would guess minFree 
 
254
                                 * would be the one we should store, and 
 
255
                                 * totalUsable would be the one we should 
 
256
                                 * compute.  (Just a guess...)
 
257
                                 */
 
258
 
 
259
        u64 realFree;           /* 8: VFS: # of free 1K blocks can be used by 
 
260
                                 * "normal" users.  It may be this is something
 
261
                                 * we should compute when asked for instead of 
 
262
                                 * storing in the superblock.  I don't know how
 
263
                                 * often this information is needed.
 
264
                                 */
 
265
        /*
 
266
         *      graffiti area
 
267
         */
 
268
};
 
269
 
 
270
/* from jfs_dtree.h */
 
271
 
 
272
/*
 
273
 *      entry segment/slot
 
274
 *
 
275
 * an entry consists of type dependent head/only segment/slot and
 
276
 * additional segments/slots linked vi next field;
 
277
 * N.B. last/only segment of entry is terminated by next = -1;
 
278
 */
 
279
/*
 
280
 *      directory page slot
 
281
 */
 
282
typedef struct {
 
283
        s8 next;                /* 1: */
 
284
        s8 cnt;                 /* 1: */
 
285
        UniChar name[15];       /* 30: */
 
286
} dtslot_t;                     /* (32) */
 
287
 
 
288
#define DTSLOTDATALEN   15
 
289
 
 
290
/*
 
291
 *       internal node entry head/only segment
 
292
 */
 
293
typedef struct {
 
294
        pxd_t xd;               /* 8: child extent descriptor */
 
295
 
 
296
        s8 next;                /* 1: */
 
297
        u8 namlen;              /* 1: */
 
298
        UniChar name[11];       /* 22: 2-byte aligned */
 
299
} idtentry_t;                   /* (32) */
 
300
 
 
301
/*
 
302
 *      leaf node entry head/only segment
 
303
 *
 
304
 *      For legacy filesystems, name contains 13 unichars -- no index field
 
305
 */
 
306
typedef struct {
 
307
        u32 inumber;            /* 4: 4-byte aligned */
 
308
        s8 next;                /* 1: */
 
309
        u8 namlen;              /* 1: */
 
310
        UniChar name[11];       /* 22: 2-byte aligned */
 
311
        u32 index;              /* 4: index into dir_table */
 
312
} ldtentry_t;                   /* (32) */
 
313
 
 
314
#define DTLHDRDATALEN   11
 
315
 
 
316
/*
 
317
 * dir_table used for directory traversal during readdir
 
318
*/ 
 
319
 
 
320
/*
 
321
 * Maximum entry in inline directory table
 
322
 */
 
323
 
 
324
typedef struct dir_table_slot {
 
325
        u8 rsrvd;       /* 1: */
 
326
        u8 flag;        /* 1: 0 if free */
 
327
        u8 slot;        /* 1: slot within leaf page of entry */
 
328
        u8 addr1;       /* 1: upper 8 bits of leaf page address */
 
329
        u32 addr2;      /* 4: lower 32 bits of leaf page address -OR-
 
330
                              index of next entry when this entry was deleted */
 
331
} dir_table_slot_t;     /* (8) */
 
332
 
 
333
/*
 
334
 *      directory root page (in-line in on-disk inode):
 
335
 *
 
336
 * cf. dtpage_t below.
 
337
 */
 
338
typedef union {
 
339
        struct {
 
340
                dasd_t DASD;    /* 16: DASD limit/usage info  F226941 */
 
341
 
 
342
                u8 flag;        /* 1: */
 
343
                s8 nextindex;   /* 1: next free entry in stbl */
 
344
                s8 freecnt;     /* 1: free count */
 
345
                s8 freelist;    /* 1: freelist header */
 
346
 
 
347
                u32 idotdot;    /* 4: parent inode number */
 
348
 
 
349
                s8 stbl[8];     /* 8: sorted entry index table */
 
350
        } header;               /* (32) */
 
351
 
 
352
        dtslot_t slot[9];
 
353
} dtroot_t;
 
354
 
 
355
/*
 
356
 *      directory regular page:
 
357
 *
 
358
 *      entry slot array of 32 byte slot
 
359
 *
 
360
 * sorted entry slot index table (stbl):
 
361
 * contiguous slots at slot specified by stblindex,
 
362
 * 1-byte per entry
 
363
 *   512 byte block:  16 entry tbl (1 slot)
 
364
 *  1024 byte block:  32 entry tbl (1 slot)
 
365
 *  2048 byte block:  64 entry tbl (2 slot)
 
366
 *  4096 byte block: 128 entry tbl (4 slot)
 
367
 *
 
368
 * data area:
 
369
 *   512 byte block:  16 - 2 =  14 slot
 
370
 *  1024 byte block:  32 - 2 =  30 slot
 
371
 *  2048 byte block:  64 - 3 =  61 slot
 
372
 *  4096 byte block: 128 - 5 = 123 slot
 
373
 *
 
374
 * N.B. index is 0-based; index fields refer to slot index
 
375
 * except nextindex which refers to entry index in stbl;
 
376
 * end of entry stot list or freelist is marked with -1.
 
377
 */
 
378
typedef union {
 
379
        struct {
 
380
                s64 next;       /* 8: next sibling */
 
381
                s64 prev;       /* 8: previous sibling */
 
382
 
 
383
                u8 flag;        /* 1: */
 
384
                s8 nextindex;   /* 1: next entry index in stbl */
 
385
                s8 freecnt;     /* 1: */
 
386
                s8 freelist;    /* 1: slot index of head of freelist */
 
387
 
 
388
                u8 maxslot;     /* 1: number of slots in page slot[] */
 
389
                s8 stblindex;   /* 1: slot index of start of stbl */
 
390
                u8 rsrvd[2];    /* 2: */
 
391
 
 
392
                pxd_t self;     /* 8: self pxd */
 
393
        } header;               /* (32) */
 
394
 
 
395
        dtslot_t slot[128];
 
396
} dtpage_t;
 
397
 
 
398
/* from jfs_xtree.h */
 
399
 
 
400
/*
 
401
 *      extent allocation descriptor (xad)
 
402
 */
 
403
typedef struct xad {
 
404
        unsigned flag:8;        /* 1: flag */
 
405
        unsigned rsvrd:16;      /* 2: reserved */
 
406
        unsigned off1:8;        /* 1: offset in unit of fsblksize */
 
407
        u32 off2;               /* 4: offset in unit of fsblksize */
 
408
        unsigned len:24;        /* 3: length in unit of fsblksize */
 
409
        unsigned addr1:8;       /* 1: address in unit of fsblksize */
 
410
        u32 addr2;              /* 4: address in unit of fsblksize */
 
411
} xad_t;                        /* (16) */
 
412
 
 
413
/* xad_t field extraction */
 
414
#define offsetXAD(xad)  (((s64)((xad)->off1)) << 32 | ((xad)->off2))
 
415
#define addressXAD(xad) (((s64)((xad)->addr1)) << 32 | ((xad)->addr2))
 
416
#define lengthXAD(xad)  ((xad)->len)
 
417
 
 
418
/* possible values for maxentry */
 
419
#define XTPAGEMAXSLOT   256
 
420
#define XTENTRYSTART    2
 
421
 
 
422
/*
 
423
 *      xtree page:
 
424
 */
 
425
typedef union {
 
426
        struct xtheader {
 
427
                s64 next;       /* 8: */
 
428
                s64 prev;       /* 8: */
 
429
 
 
430
                u8 flag;        /* 1: */
 
431
                u8 rsrvd1;      /* 1: */
 
432
                s16 nextindex;  /* 2: next index = number of entries */
 
433
                s16 maxentry;   /* 2: max number of entries */
 
434
                s16 rsrvd2;     /* 2: */
 
435
 
 
436
                pxd_t self;     /* 8: self */
 
437
        } header;               /* (32) */
 
438
 
 
439
        xad_t xad[XTPAGEMAXSLOT];       /* 16 * maxentry: xad array */
 
440
} xtpage_t;
 
441
 
 
442
/* from jfs_dinode.h */
 
443
 
 
444
struct dinode {
 
445
        /*
 
446
         *      I. base area (128 bytes)
 
447
         *      ------------------------
 
448
         *
 
449
         * define generic/POSIX attributes
 
450
         */
 
451
        u32 di_inostamp;        /* 4: stamp to show inode belongs to fileset */
 
452
        s32 di_fileset;         /* 4: fileset number */
 
453
        u32 di_number;          /* 4: inode number, aka file serial number */
 
454
        u32 di_gen;             /* 4: inode generation number */
 
455
 
 
456
        pxd_t di_ixpxd;         /* 8: inode extent descriptor */
 
457
 
 
458
        s64 di_size;            /* 8: size */
 
459
        s64 di_nblocks;         /* 8: number of blocks allocated */
 
460
 
 
461
        u32 di_nlink;           /* 4: number of links to the object */
 
462
 
 
463
        u32 di_uid;             /* 4: user id of owner */
 
464
        u32 di_gid;             /* 4: group id of owner */
 
465
 
 
466
        u32 di_mode;            /* 4: attribute, format and permission */
 
467
 
 
468
        struct timestruc_t di_atime;    /* 8: time last data accessed */
 
469
        struct timestruc_t di_ctime;    /* 8: time last status changed */
 
470
        struct timestruc_t di_mtime;    /* 8: time last data modified */
 
471
        struct timestruc_t di_otime;    /* 8: time created */
 
472
 
 
473
        dxd_t di_acl;           /* 16: acl descriptor */
 
474
 
 
475
        dxd_t di_ea;            /* 16: ea descriptor */
 
476
 
 
477
        s32 di_next_index;  /* 4: Next available dir_table index */
 
478
 
 
479
        s32 di_acltype;         /* 4: Type of ACL */
 
480
 
 
481
        /*
 
482
         *      Extension Areas.
 
483
         *
 
484
         *      Historically, the inode was partitioned into 4 128-byte areas,
 
485
         *      the last 3 being defined as unions which could have multiple
 
486
         *      uses.  The first 96 bytes had been completely unused until
 
487
         *      an index table was added to the directory.  It is now more
 
488
         *      useful to describe the last 3/4 of the inode as a single
 
489
         *      union.  We would probably be better off redesigning the
 
490
         *      entire structure from scratch, but we don't want to break
 
491
         *      commonality with OS/2's JFS at this time.
 
492
         */
 
493
        union {
 
494
                struct {
 
495
                        /*
 
496
                         * This table contains the information needed to
 
497
                         * find a directory entry from a 32-bit index.
 
498
                         * If the index is small enough, the table is inline,
 
499
                         * otherwise, an x-tree root overlays this table
 
500
                         */
 
501
                        dir_table_slot_t _table[12];    /* 96: inline */
 
502
 
 
503
                        dtroot_t _dtroot;               /* 288: dtree root */
 
504
                } _dir;                                 /* (384) */
 
505
#define di_dirtable     u._dir._table
 
506
#define di_dtroot       u._dir._dtroot
 
507
#define di_parent       di_dtroot.header.idotdot
 
508
#define di_DASD         di_dtroot.header.DASD
 
509
 
 
510
                struct {
 
511
                        union {
 
512
                                u8 _data[96];           /* 96: unused */
 
513
                                struct {
 
514
                                        void *_imap;    /* 4: unused */
 
515
                                        u32 _gengen;    /* 4: generator */
 
516
                                } _imap;
 
517
                        } _u1;                          /* 96: */
 
518
#define di_gengen       u._file._u1._imap._gengen
 
519
 
 
520
                        union {
 
521
                                xtpage_t _xtroot;
 
522
                                struct {
 
523
                                        u8 unused[16];  /* 16: */
 
524
                                        dxd_t _dxd;     /* 16: */
 
525
                                        union {
 
526
                                                u32 _rdev;      /* 4: */
 
527
                                                u8 _fastsymlink[128];
 
528
                                        } _u;
 
529
                                        u8 _inlineea[128];
 
530
                                } _special;
 
531
                        } _u2;
 
532
                } _file;
 
533
#define di_xtroot       u._file._u2._xtroot
 
534
#define di_dxd          u._file._u2._special._dxd
 
535
#define di_btroot       di_xtroot
 
536
#define di_inlinedata   u._file._u2._special._u
 
537
#define di_rdev         u._file._u2._special._u._rdev
 
538
#define di_fastsymlink  u._file._u2._special._u._fastsymlink
 
539
#define di_inlineea     u._file._u2._special._inlineea
 
540
        } u;
 
541
};
 
542
 
 
543
typedef struct dinode dinode_t;
 
544
 
 
545
/* di_mode */
 
546
#define IFMT    0xF000          /* S_IFMT - mask of file type */
 
547
#define IFDIR   0x4000          /* S_IFDIR - directory */
 
548
#define IFREG   0x8000          /* S_IFREG - regular file */
 
549
#define IFLNK   0xA000          /* S_IFLNK - symbolic link */
 
550
 
 
551
/* extended mode bits (on-disk inode di_mode) */
 
552
#define INLINEEA        0x00040000      /* inline EA area free */
 
553
 
 
554
/* from jfs_imap.h */
 
555
 
 
556
#define EXTSPERIAG      128     /* number of disk inode extent per iag  */
 
557
#define SMAPSZ          4       /* number of words per summary map      */
 
558
#define MAXAG           128     /* maximum number of allocation groups  */
 
559
 
 
560
/*
 
561
 *      inode allocation map:
 
562
 * 
 
563
 * inode allocation map consists of 
 
564
 * . the inode map control page and
 
565
 * . inode allocation group pages (per 4096 inodes)
 
566
 * which are addressed by standard JFS xtree.
 
567
 */
 
568
/*
 
569
 *      inode allocation group page (per 4096 inodes of an AG)
 
570
 */
 
571
typedef struct {
 
572
        s64 agstart;            /* 8: starting block of ag              */
 
573
        s32 iagnum;             /* 4: inode allocation group number     */
 
574
        s32 inofreefwd;         /* 4: ag inode free list forward        */
 
575
        s32 inofreeback;        /* 4: ag inode free list back           */
 
576
        s32 extfreefwd;         /* 4: ag inode extent free list forward */
 
577
        s32 extfreeback;        /* 4: ag inode extent free list back    */
 
578
        s32 iagfree;            /* 4: iag free list                     */
 
579
 
 
580
        /* summary map: 1 bit per inode extent */
 
581
        s32 inosmap[SMAPSZ];    /* 16: sum map of mapwords w/ free inodes;
 
582
                                 *      note: this indicates free and backed
 
583
                                 *      inodes, if the extent is not backed the
 
584
                                 *      value will be 1.  if the extent is
 
585
                                 *      backed but all inodes are being used the
 
586
                                 *      value will be 1.  if the extent is
 
587
                                 *      backed but at least one of the inodes is
 
588
                                 *      free the value will be 0.
 
589
                                 */
 
590
        s32 extsmap[SMAPSZ];    /* 16: sum map of mapwords w/ free extents */
 
591
        s32 nfreeinos;          /* 4: number of free inodes             */
 
592
        s32 nfreeexts;          /* 4: number of free extents            */
 
593
        /* (72) */
 
594
        u8 pad[1976];           /* 1976: pad to 2048 bytes */
 
595
        /* allocation bit map: 1 bit per inode (0 - free, 1 - allocated) */
 
596
        u32 wmap[EXTSPERIAG];   /* 512: working allocation map  */
 
597
        u32 pmap[EXTSPERIAG];   /* 512: persistent allocation map */
 
598
        pxd_t inoext[EXTSPERIAG];       /* 1024: inode extent addresses */
 
599
} iag_t;                        /* (4096) */
 
600
 
 
601
#endif /* _JFS_H_ */