hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *   Copyright (C) International Business Machines Corp., 2000-2003
 */
#ifndef _H_JFS_FILSYS
#define _H_JFS_FILSYS
 
/*
 *    jfs_filsys.h
 *
 * file system (implementation-dependent) constants
 *
 * refer to <limits.h> for system wide implementation-dependent constants
 */
 
/*
 *     file system option (superblock flag)
 */
 
/* directory option */
#define JFS_UNICODE    0x00000001    /* unicode name */
 
/* mount time flags for error handling */
#define JFS_ERR_REMOUNT_RO 0x00000002    /* remount read-only */
#define JFS_ERR_CONTINUE   0x00000004    /* continue */
#define JFS_ERR_PANIC      0x00000008    /* panic */
 
/* Quota support */
#define    JFS_USRQUOTA    0x00000010
#define    JFS_GRPQUOTA    0x00000020
 
/* mount time flag to disable journaling to disk */
#define JFS_NOINTEGRITY 0x00000040
 
/* mount time flag to enable TRIM to ssd disks */
#define JFS_DISCARD     0x00000080
 
/* commit option */
#define    JFS_COMMIT    0x00000f00    /* commit option mask */
#define    JFS_GROUPCOMMIT    0x00000100    /* group (of 1) commit */
#define    JFS_LAZYCOMMIT    0x00000200    /* lazy commit */
#define    JFS_TMPFS    0x00000400    /* temporary file system -
                    * do not log/commit:
                    * Never implemented
                    */
 
/* log logical volume option */
#define    JFS_INLINELOG    0x00000800    /* inline log within file system */
#define JFS_INLINEMOVE    0x00001000    /* inline log being moved */
 
/* Secondary aggregate inode table */
#define JFS_BAD_SAIT    0x00010000    /* current secondary ait is bad */
 
/* sparse regular file support */
#define JFS_SPARSE    0x00020000    /* sparse regular file */
 
/* DASD Limits        F226941 */
#define JFS_DASD_ENABLED 0x00040000    /* DASD limits enabled */
#define    JFS_DASD_PRIME    0x00080000    /* Prime DASD usage on boot */
 
/* big endian flag */
#define    JFS_SWAP_BYTES    0x00100000    /* running on big endian computer */
 
/* Directory index */
#define JFS_DIR_INDEX    0x00200000    /* Persistent index for */
 
/* platform options */
#define JFS_LINUX    0x10000000    /* Linux support */
#define JFS_DFS        0x20000000    /* DCE DFS LFS support */
/*    Never implemented */
 
#define JFS_OS2        0x40000000    /* OS/2 support */
/*    case-insensitive name/directory support */
 
#define JFS_AIX        0x80000000    /* AIX support */
 
/*
 *    buffer cache configuration
 */
/* page size */
#ifdef PSIZE
#undef PSIZE
#endif
#define    PSIZE        4096    /* page size (in byte) */
#define    L2PSIZE        12    /* log2(PSIZE) */
#define    POFFSET        4095    /* offset within page */
 
/* buffer page size */
#define BPSIZE    PSIZE
 
/*
 *    fs fundamental size
 *
 * PSIZE >= file system block size >= PBSIZE >= DISIZE
 */
#define    PBSIZE        512    /* physical block size (in byte) */
#define    L2PBSIZE    9    /* log2(PBSIZE) */
 
#define DISIZE        512    /* on-disk inode size (in byte) */
#define L2DISIZE    9    /* log2(DISIZE) */
 
#define IDATASIZE    256    /* inode inline data size */
#define    IXATTRSIZE    128    /* inode inline extended attribute size */
 
#define XTPAGE_SIZE    4096
#define log2_PAGESIZE    12
 
#define IAG_SIZE    4096
#define IAG_EXTENT_SIZE 4096
#define    INOSPERIAG    4096    /* number of disk inodes per iag */
#define    L2INOSPERIAG    12    /* l2 number of disk inodes per iag */
#define INOSPEREXT    32    /* number of disk inode per extent */
#define L2INOSPEREXT    5    /* l2 number of disk inode per extent */
#define    IXSIZE        (DISIZE * INOSPEREXT)    /* inode extent size */
#define    INOSPERPAGE    8    /* number of disk inodes per 4K page */
#define    L2INOSPERPAGE    3    /* log2(INOSPERPAGE) */
 
#define    IAGFREELIST_LWM    64
 
#define INODE_EXTENT_SIZE    IXSIZE    /* inode extent size */
#define NUM_INODE_PER_EXTENT    INOSPEREXT
#define NUM_INODE_PER_IAG    INOSPERIAG
 
#define MINBLOCKSIZE        512
#define MAXBLOCKSIZE        4096
#define    MAXFILESIZE        ((s64)1 << 52)
 
#define JFS_LINK_MAX        0xffffffff
 
/* Minimum number of bytes supported for a JFS partition */
#define MINJFS            (0x1000000)
#define MINJFSTEXT        "16"
 
/*
 * file system block size -> physical block size
 */
#define LBOFFSET(x)    ((x) & (PBSIZE - 1))
#define LBNUMBER(x)    ((x) >> L2PBSIZE)
#define    LBLK2PBLK(sb,b)    ((b) << (sb->s_blocksize_bits - L2PBSIZE))
#define    PBLK2LBLK(sb,b)    ((b) >> (sb->s_blocksize_bits - L2PBSIZE))
/* size in byte -> last page number */
#define    SIZE2PN(size)    ( ((s64)((size) - 1)) >> (L2PSIZE) )
/* size in byte -> last file system block number */
#define    SIZE2BN(size, l2bsize) ( ((s64)((size) - 1)) >> (l2bsize) )
 
/*
 * fixed physical block address (physical block size = 512 byte)
 *
 * NOTE: since we can't guarantee a physical block size of 512 bytes the use of
 *     these macros should be removed and the byte offset macros used instead.
 */
#define SUPER1_B    64    /* primary superblock */
#define    AIMAP_B        (SUPER1_B + 8)    /* 1st extent of aggregate inode map */
#define    AITBL_B        (AIMAP_B + 16)    /*
                    * 1st extent of aggregate inode table
                    */
#define    SUPER2_B    (AITBL_B + 32)    /* 2ndary superblock pbn */
#define    BMAP_B        (SUPER2_B + 8)    /* block allocation map */
 
/*
 * SIZE_OF_SUPER defines the total amount of space reserved on disk for the
 * superblock.  This is not the same as the superblock structure, since all of
 * this space is not currently being used.
 */
#define SIZE_OF_SUPER    PSIZE
 
/*
 * SIZE_OF_AG_TABLE defines the amount of space reserved to hold the AG table
 */
#define SIZE_OF_AG_TABLE    PSIZE
 
/*
 * SIZE_OF_MAP_PAGE defines the amount of disk space reserved for each page of
 * the inode allocation map (to hold iag)
 */
#define SIZE_OF_MAP_PAGE    PSIZE
 
/*
 * fixed byte offset address
 */
#define SUPER1_OFF    0x8000    /* primary superblock */
#define AIMAP_OFF    (SUPER1_OFF + SIZE_OF_SUPER)
                   /*
                    * Control page of aggregate inode map
                    * followed by 1st extent of map
                    */
#define AITBL_OFF    (AIMAP_OFF + (SIZE_OF_MAP_PAGE << 1))
                   /*
                    * 1st extent of aggregate inode table
                    */
#define SUPER2_OFF    (AITBL_OFF + INODE_EXTENT_SIZE)
                   /*
                    * secondary superblock
                    */
#define BMAP_OFF    (SUPER2_OFF + SIZE_OF_SUPER)
                   /*
                    * block allocation map
                    */
 
/*
 * The following macro is used to indicate the number of reserved disk blocks at
 * the front of an aggregate, in terms of physical blocks.  This value is
 * currently defined to be 32K.  This turns out to be the same as the primary
 * superblock's address, since it directly follows the reserved blocks.
 */
#define AGGR_RSVD_BLOCKS    SUPER1_B
 
/*
 * The following macro is used to indicate the number of reserved bytes at the
 * front of an aggregate.  This value is currently defined to be 32K.  This
 * turns out to be the same as the primary superblock's byte offset, since it
 * directly follows the reserved blocks.
 */
#define AGGR_RSVD_BYTES    SUPER1_OFF
 
/*
 * The following macro defines the byte offset for the first inode extent in
 * the aggregate inode table.  This allows us to find the self inode to find the
 * rest of the table.  Currently this value is 44K.
 */
#define AGGR_INODE_TABLE_START    AITBL_OFF
 
/*
 *    fixed reserved inode number
 */
/* aggregate inode */
#define AGGR_RESERVED_I    0    /* aggregate inode (reserved) */
#define    AGGREGATE_I    1    /* aggregate inode map inode */
#define    BMAP_I        2    /* aggregate block allocation map inode */
#define    LOG_I        3    /* aggregate inline log inode */
#define BADBLOCK_I    4    /* aggregate bad block inode */
#define    FILESYSTEM_I    16    /* 1st/only fileset inode in ait:
                * fileset inode map inode
                */
 
/* per fileset inode */
#define FILESET_RSVD_I    0    /* fileset inode (reserved) */
#define FILESET_EXT_I    1    /* fileset inode extension */
#define    ROOT_I        2    /* fileset root inode */
#define ACL_I        3    /* fileset ACL inode */
 
#define FILESET_OBJECT_I 4    /* the first fileset inode available for a file
                * or directory or link...
                */
#define FIRST_FILESET_INO 16    /* the first aggregate inode which describes
                * an inode.  (To fsck this is also the first
                * inode in part 2 of the agg inode table.)
                */
 
/*
 *    directory configuration
 */
#define JFS_NAME_MAX    255
#define JFS_PATH_MAX    BPSIZE
 
 
/*
 *    file system state (superblock state)
 */
#define FM_CLEAN 0x00000000    /* file system is unmounted and clean */
#define FM_MOUNT 0x00000001    /* file system is mounted cleanly */
#define FM_DIRTY 0x00000002    /* file system was not unmounted and clean
                * when mounted or
                * commit failure occurred while being mounted:
                * fsck() must be run to repair
                */
#define    FM_LOGREDO 0x00000004    /* log based recovery (logredo()) failed:
                * fsck() must be run to repair
                */
#define    FM_EXTENDFS 0x00000008    /* file system extendfs() in progress */
#define    FM_STATE_MAX 0x0000000f    /* max value of s_state */
 
#endif                /* _H_JFS_FILSYS */