home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / gfs2_ondisk.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  11.1 KB  |  444 lines

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