~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to include/linux/gfs2_ondisk.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
 
3
 * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
 
4
 *
 
5
 * This copyrighted material is made available to anyone wishing to use,
 
6
 * modify, copy, or redistribute it subject to the terms and conditions
 
7
 * of the GNU General Public License v.2.
 
8
 */
 
9
 
 
10
#ifndef __GFS2_ONDISK_DOT_H__
 
11
#define __GFS2_ONDISK_DOT_H__
 
12
 
 
13
#include <linux/types.h>
 
14
 
 
15
#define GFS2_MAGIC              0x01161970
 
16
#define GFS2_BASIC_BLOCK        512
 
17
#define GFS2_BASIC_BLOCK_SHIFT  9
 
18
 
 
19
/* Lock numbers of the LM_TYPE_NONDISK type */
 
20
 
 
21
#define GFS2_MOUNT_LOCK         0
 
22
#define GFS2_LIVE_LOCK          1
 
23
#define GFS2_TRANS_LOCK         2
 
24
#define GFS2_RENAME_LOCK        3
 
25
 
 
26
/* Format numbers for various metadata types */
 
27
 
 
28
#define GFS2_FORMAT_NONE        0
 
29
#define GFS2_FORMAT_SB          100
 
30
#define GFS2_FORMAT_RG          200
 
31
#define GFS2_FORMAT_RB          300
 
32
#define GFS2_FORMAT_DI          400
 
33
#define GFS2_FORMAT_IN          500
 
34
#define GFS2_FORMAT_LF          600
 
35
#define GFS2_FORMAT_JD          700
 
36
#define GFS2_FORMAT_LH          800
 
37
#define GFS2_FORMAT_LD          900
 
38
#define GFS2_FORMAT_LB          1000
 
39
#define GFS2_FORMAT_EA          1600
 
40
#define GFS2_FORMAT_ED          1700
 
41
#define GFS2_FORMAT_QC          1400
 
42
/* These are format numbers for entities contained in files */
 
43
#define GFS2_FORMAT_RI          1100
 
44
#define GFS2_FORMAT_DE          1200
 
45
#define GFS2_FORMAT_QU          1500
 
46
/* These are part of the superblock */
 
47
#define GFS2_FORMAT_FS          1801
 
48
#define GFS2_FORMAT_MULTI       1900
 
49
 
 
50
/*
 
51
 * An on-disk inode number
 
52
 */
 
53
 
 
54
struct gfs2_inum {
 
55
        __be64 no_formal_ino;
 
56
        __be64 no_addr;
 
57
};
 
58
 
 
59
/*
 
60
 * Generic metadata head structure
 
61
 * Every inplace buffer logged in the journal must start with this.
 
62
 */
 
63
 
 
64
#define GFS2_METATYPE_NONE      0
 
65
#define GFS2_METATYPE_SB        1
 
66
#define GFS2_METATYPE_RG        2
 
67
#define GFS2_METATYPE_RB        3
 
68
#define GFS2_METATYPE_DI        4
 
69
#define GFS2_METATYPE_IN        5
 
70
#define GFS2_METATYPE_LF        6
 
71
#define GFS2_METATYPE_JD        7
 
72
#define GFS2_METATYPE_LH        8
 
73
#define GFS2_METATYPE_LD        9
 
74
#define GFS2_METATYPE_LB        12
 
75
#define GFS2_METATYPE_EA        10
 
76
#define GFS2_METATYPE_ED        11
 
77
#define GFS2_METATYPE_QC        14
 
78
 
 
79
struct gfs2_meta_header {
 
80
        __be32 mh_magic;
 
81
        __be32 mh_type;
 
82
        __be64 __pad0;          /* Was generation number in gfs1 */
 
83
        __be32 mh_format;
 
84
        /* This union is to keep userspace happy */
 
85
        union {
 
86
                __be32 mh_jid;          /* Was incarnation number in gfs1 */
 
87
                __be32 __pad1;
 
88
        };
 
89
};
 
90
 
 
91
/*
 
92
 * super-block structure
 
93
 *
 
94
 * It's probably good if SIZEOF_SB <= GFS2_BASIC_BLOCK (512 bytes)
 
95
 *
 
96
 * Order is important, need to be able to read old superblocks to do on-disk
 
97
 * version upgrades.
 
98
 */
 
99
 
 
100
/* Address of superblock in GFS2 basic blocks */
 
101
#define GFS2_SB_ADDR            128
 
102
 
 
103
/* The lock number for the superblock (must be zero) */
 
104
#define GFS2_SB_LOCK            0
 
105
 
 
106
/* Requirement:  GFS2_LOCKNAME_LEN % 8 == 0
 
107
   Includes: the fencing zero at the end */
 
108
#define GFS2_LOCKNAME_LEN       64
 
109
 
 
110
struct gfs2_sb {
 
111
        struct gfs2_meta_header sb_header;
 
112
 
 
113
        __be32 sb_fs_format;
 
114
        __be32 sb_multihost_format;
 
115
        __u32  __pad0;  /* Was superblock flags in gfs1 */
 
116
 
 
117
        __be32 sb_bsize;
 
118
        __be32 sb_bsize_shift;
 
119
        __u32 __pad1;   /* Was journal segment size in gfs1 */
 
120
 
 
121
        struct gfs2_inum sb_master_dir; /* Was jindex dinode in gfs1 */
 
122
        struct gfs2_inum __pad2; /* Was rindex dinode in gfs1 */
 
123
        struct gfs2_inum sb_root_dir;
 
124
 
 
125
        char sb_lockproto[GFS2_LOCKNAME_LEN];
 
126
        char sb_locktable[GFS2_LOCKNAME_LEN];
 
127
 
 
128
        struct gfs2_inum __pad3; /* Was quota inode in gfs1 */
 
129
        struct gfs2_inum __pad4; /* Was licence inode in gfs1 */
 
130
#define GFS2_HAS_UUID 1
 
131
        __u8 sb_uuid[16]; /* The UUID, maybe 0 for backwards compat */
 
132
};
 
133
 
 
134
/*
 
135
 * resource index structure
 
136
 */
 
137
 
 
138
struct gfs2_rindex {
 
139
        __be64 ri_addr; /* grp block disk address */
 
140
        __be32 ri_length;       /* length of rgrp header in fs blocks */
 
141
        __u32 __pad;
 
142
 
 
143
        __be64 ri_data0;        /* first data location */
 
144
        __be32 ri_data; /* num of data blocks in rgrp */
 
145
 
 
146
        __be32 ri_bitbytes;     /* number of bytes in data bitmaps */
 
147
 
 
148
        __u8 ri_reserved[64];
 
149
};
 
150
 
 
151
/*
 
152
 * resource group header structure
 
153
 */
 
154
 
 
155
/* Number of blocks per byte in rgrp */
 
156
#define GFS2_NBBY               4
 
157
#define GFS2_BIT_SIZE           2
 
158
#define GFS2_BIT_MASK           0x00000003
 
159
 
 
160
#define GFS2_BLKST_FREE         0
 
161
#define GFS2_BLKST_USED         1
 
162
#define GFS2_BLKST_UNLINKED     2
 
163
#define GFS2_BLKST_DINODE       3
 
164
 
 
165
#define GFS2_RGF_JOURNAL        0x00000001
 
166
#define GFS2_RGF_METAONLY       0x00000002
 
167
#define GFS2_RGF_DATAONLY       0x00000004
 
168
#define GFS2_RGF_NOALLOC        0x00000008
 
169
 
 
170
struct gfs2_rgrp {
 
171
        struct gfs2_meta_header rg_header;
 
172
 
 
173
        __be32 rg_flags;
 
174
        __be32 rg_free;
 
175
        __be32 rg_dinodes;
 
176
        __be32 __pad;
 
177
        __be64 rg_igeneration;
 
178
 
 
179
        __u8 rg_reserved[80]; /* Several fields from gfs1 now reserved */
 
180
};
 
181
 
 
182
/*
 
183
 * quota structure
 
184
 */
 
185
 
 
186
struct gfs2_quota {
 
187
        __be64 qu_limit;
 
188
        __be64 qu_warn;
 
189
        __be64 qu_value;
 
190
        __u8 qu_reserved[64];
 
191
};
 
192
 
 
193
/*
 
194
 * dinode structure
 
195
 */
 
196
 
 
197
#define GFS2_MAX_META_HEIGHT    10
 
198
#define GFS2_DIR_MAX_DEPTH      17
 
199
 
 
200
#define DT2IF(dt) (((dt) << 12) & S_IFMT)
 
201
#define IF2DT(sif) (((sif) & S_IFMT) >> 12)
 
202
 
 
203
enum {
 
204
        gfs2fl_Jdata            = 0,
 
205
        gfs2fl_ExHash           = 1,
 
206
        gfs2fl_Unused           = 2,
 
207
        gfs2fl_EaIndirect       = 3,
 
208
        gfs2fl_Directio         = 4,
 
209
        gfs2fl_Immutable        = 5,
 
210
        gfs2fl_AppendOnly       = 6,
 
211
        gfs2fl_NoAtime          = 7,
 
212
        gfs2fl_Sync             = 8,
 
213
        gfs2fl_System           = 9,
 
214
        gfs2fl_TruncInProg      = 29,
 
215
        gfs2fl_InheritDirectio  = 30,
 
216
        gfs2fl_InheritJdata     = 31,
 
217
};
 
218
 
 
219
/* Dinode flags */
 
220
#define GFS2_DIF_JDATA                  0x00000001
 
221
#define GFS2_DIF_EXHASH                 0x00000002
 
222
#define GFS2_DIF_UNUSED                 0x00000004  /* only in gfs1 */
 
223
#define GFS2_DIF_EA_INDIRECT            0x00000008
 
224
#define GFS2_DIF_DIRECTIO               0x00000010
 
225
#define GFS2_DIF_IMMUTABLE              0x00000020
 
226
#define GFS2_DIF_APPENDONLY             0x00000040
 
227
#define GFS2_DIF_NOATIME                0x00000080
 
228
#define GFS2_DIF_SYNC                   0x00000100
 
229
#define GFS2_DIF_SYSTEM                 0x00000200 /* New in gfs2 */
 
230
#define GFS2_DIF_TRUNC_IN_PROG          0x20000000 /* New in gfs2 */
 
231
#define GFS2_DIF_INHERIT_DIRECTIO       0x40000000
 
232
#define GFS2_DIF_INHERIT_JDATA          0x80000000
 
233
 
 
234
struct gfs2_dinode {
 
235
        struct gfs2_meta_header di_header;
 
236
 
 
237
        struct gfs2_inum di_num;
 
238
 
 
239
        __be32 di_mode; /* mode of file */
 
240
        __be32 di_uid;  /* owner's user id */
 
241
        __be32 di_gid;  /* owner's group id */
 
242
        __be32 di_nlink;        /* number of links to this file */
 
243
        __be64 di_size; /* number of bytes in file */
 
244
        __be64 di_blocks;       /* number of blocks in file */
 
245
        __be64 di_atime;        /* time last accessed */
 
246
        __be64 di_mtime;        /* time last modified */
 
247
        __be64 di_ctime;        /* time last changed */
 
248
        __be32 di_major;        /* device major number */
 
249
        __be32 di_minor;        /* device minor number */
 
250
 
 
251
        /* This section varies from gfs1. Padding added to align with
 
252
         * remainder of dinode
 
253
         */
 
254
        __be64 di_goal_meta;    /* rgrp to alloc from next */
 
255
        __be64 di_goal_data;    /* data block goal */
 
256
        __be64 di_generation;   /* generation number for NFS */
 
257
 
 
258
        __be32 di_flags;        /* GFS2_DIF_... */
 
259
        __be32 di_payload_format;  /* GFS2_FORMAT_... */
 
260
        __u16 __pad1;   /* Was ditype in gfs1 */
 
261
        __be16 di_height;       /* height of metadata */
 
262
        __u32 __pad2;   /* Unused incarnation number from gfs1 */
 
263
 
 
264
        /* These only apply to directories  */
 
265
        __u16 __pad3;   /* Padding */
 
266
        __be16 di_depth;        /* Number of bits in the table */
 
267
        __be32 di_entries;      /* The number of entries in the directory */
 
268
 
 
269
        struct gfs2_inum __pad4; /* Unused even in current gfs1 */
 
270
 
 
271
        __be64 di_eattr;        /* extended attribute block number */
 
272
        __be32 di_atime_nsec;   /* nsec portion of atime */
 
273
        __be32 di_mtime_nsec;   /* nsec portion of mtime */
 
274
        __be32 di_ctime_nsec;   /* nsec portion of ctime */
 
275
 
 
276
        __u8 di_reserved[44];
 
277
};
 
278
 
 
279
/*
 
280
 * directory structure - many of these per directory file
 
281
 */
 
282
 
 
283
#define GFS2_FNAMESIZE          255
 
284
#define GFS2_DIRENT_SIZE(name_len) ((sizeof(struct gfs2_dirent) + (name_len) + 7) & ~7)
 
285
 
 
286
struct gfs2_dirent {
 
287
        struct gfs2_inum de_inum;
 
288
        __be32 de_hash;
 
289
        __be16 de_rec_len;
 
290
        __be16 de_name_len;
 
291
        __be16 de_type;
 
292
        __u8 __pad[14];
 
293
};
 
294
 
 
295
/*
 
296
 * Header of leaf directory nodes
 
297
 */
 
298
 
 
299
struct gfs2_leaf {
 
300
        struct gfs2_meta_header lf_header;
 
301
 
 
302
        __be16 lf_depth;                /* Depth of leaf */
 
303
        __be16 lf_entries;              /* Number of dirents in leaf */
 
304
        __be32 lf_dirent_format;        /* Format of the dirents */
 
305
        __be64 lf_next;                 /* Next leaf, if overflow */
 
306
 
 
307
        __u8 lf_reserved[64];
 
308
};
 
309
 
 
310
/*
 
311
 * Extended attribute header format
 
312
 *
 
313
 * This works in a similar way to dirents. There is a fixed size header
 
314
 * followed by a variable length section made up of the name and the
 
315
 * associated data. In the case of a "stuffed" entry, the value is
 
316
 * inline directly after the name, the ea_num_ptrs entry will be
 
317
 * zero in that case. For non-"stuffed" entries, there will be
 
318
 * a set of pointers (aligned to 8 byte boundary) to the block(s)
 
319
 * containing the value.
 
320
 *
 
321
 * The blocks containing the values and the blocks containing the
 
322
 * extended attribute headers themselves all start with the common
 
323
 * metadata header. Each inode, if it has extended attributes, will
 
324
 * have either a single block containing the extended attribute headers
 
325
 * or a single indirect block pointing to blocks containing the
 
326
 * extended attribure headers.
 
327
 *
 
328
 * The maximim size of the data part of an extended attribute is 64k
 
329
 * so the number of blocks required depends upon block size. Since the
 
330
 * block size also determines the number of pointers in an indirect
 
331
 * block, its a fairly complicated calculation to work out the maximum
 
332
 * number of blocks that an inode may have relating to extended attributes.
 
333
 *
 
334
 */
 
335
 
 
336
#define GFS2_EA_MAX_NAME_LEN    255
 
337
#define GFS2_EA_MAX_DATA_LEN    65536
 
338
 
 
339
#define GFS2_EATYPE_UNUSED      0
 
340
#define GFS2_EATYPE_USR         1
 
341
#define GFS2_EATYPE_SYS         2
 
342
#define GFS2_EATYPE_SECURITY    3
 
343
 
 
344
#define GFS2_EATYPE_LAST        3
 
345
#define GFS2_EATYPE_VALID(x)    ((x) <= GFS2_EATYPE_LAST)
 
346
 
 
347
#define GFS2_EAFLAG_LAST        0x01    /* last ea in block */
 
348
 
 
349
struct gfs2_ea_header {
 
350
        __be32 ea_rec_len;
 
351
        __be32 ea_data_len;
 
352
        __u8 ea_name_len;       /* no NULL pointer after the string */
 
353
        __u8 ea_type;           /* GFS2_EATYPE_... */
 
354
        __u8 ea_flags;          /* GFS2_EAFLAG_... */
 
355
        __u8 ea_num_ptrs;
 
356
        __u32 __pad;
 
357
};
 
358
 
 
359
/*
 
360
 * Log header structure
 
361
 */
 
362
 
 
363
#define GFS2_LOG_HEAD_UNMOUNT   0x00000001      /* log is clean */
 
364
 
 
365
struct gfs2_log_header {
 
366
        struct gfs2_meta_header lh_header;
 
367
 
 
368
        __be64 lh_sequence;     /* Sequence number of this transaction */
 
369
        __be32 lh_flags;        /* GFS2_LOG_HEAD_... */
 
370
        __be32 lh_tail;         /* Block number of log tail */
 
371
        __be32 lh_blkno;
 
372
        __be32 lh_hash;
 
373
};
 
374
 
 
375
/*
 
376
 * Log type descriptor
 
377
 */
 
378
 
 
379
#define GFS2_LOG_DESC_METADATA  300
 
380
/* ld_data1 is the number of metadata blocks in the descriptor.
 
381
   ld_data2 is unused. */
 
382
 
 
383
#define GFS2_LOG_DESC_REVOKE    301
 
384
/* ld_data1 is the number of revoke blocks in the descriptor.
 
385
   ld_data2 is unused. */
 
386
 
 
387
#define GFS2_LOG_DESC_JDATA     302
 
388
/* ld_data1 is the number of data blocks in the descriptor.
 
389
   ld_data2 is unused. */
 
390
 
 
391
struct gfs2_log_descriptor {
 
392
        struct gfs2_meta_header ld_header;
 
393
 
 
394
        __be32 ld_type;         /* GFS2_LOG_DESC_... */
 
395
        __be32 ld_length;       /* Number of buffers in this chunk */
 
396
        __be32 ld_data1;        /* descriptor-specific field */
 
397
        __be32 ld_data2;        /* descriptor-specific field */
 
398
 
 
399
        __u8 ld_reserved[32];
 
400
};
 
401
 
 
402
/*
 
403
 * Inum Range
 
404
 * Describe a range of formal inode numbers allocated to
 
405
 * one machine to assign to inodes.
 
406
 */
 
407
 
 
408
#define GFS2_INUM_QUANTUM       1048576
 
409
 
 
410
struct gfs2_inum_range {
 
411
        __be64 ir_start;
 
412
        __be64 ir_length;
 
413
};
 
414
 
 
415
/*
 
416
 * Statfs change
 
417
 * Describes an change to the pool of free and allocated
 
418
 * blocks.
 
419
 */
 
420
 
 
421
struct gfs2_statfs_change {
 
422
        __be64 sc_total;
 
423
        __be64 sc_free;
 
424
        __be64 sc_dinodes;
 
425
};
 
426
 
 
427
/*
 
428
 * Quota change
 
429
 * Describes an allocation change for a particular
 
430
 * user or group.
 
431
 */
 
432
 
 
433
#define GFS2_QCF_USER           0x00000001
 
434
 
 
435
struct gfs2_quota_change {
 
436
        __be64 qc_change;
 
437
        __be32 qc_flags;        /* GFS2_QCF_... */
 
438
        __be32 qc_id;
 
439
};
 
440
 
 
441
struct gfs2_quota_lvb {
 
442
        __be32 qb_magic;
 
443
        __u32 __pad;
 
444
        __be64 qb_limit;      /* Hard limit of # blocks to alloc */
 
445
        __be64 qb_warn;       /* Warn user when alloc is above this # */
 
446
        __be64 qb_value;       /* Current # blocks allocated */
 
447
};
 
448
 
 
449
#endif /* __GFS2_ONDISK_DOT_H__ */