Annotation of qemu/roms/openbios/fs/grubfs/jfs.h, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.