md_p.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.    md_p.h : physical layout of Linux RAID devices
  3.           Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
  4.   
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.    
  10.    You should have received a copy of the GNU General Public License
  11.    (for example /usr/src/linux/COPYING); if not, write to the Free
  12.    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
  13. */
  14. #ifndef _MD_P_H
  15. #define _MD_P_H
  16. /*
  17.  * RAID superblock.
  18.  *
  19.  * The RAID superblock maintains some statistics on each RAID configuration.
  20.  * Each real device in the RAID set contains it near the end of the device.
  21.  * Some of the ideas are copied from the ext2fs implementation.
  22.  *
  23.  * We currently use 4096 bytes as follows:
  24.  *
  25.  * word offset function
  26.  *
  27.  *    0  -    31 Constant generic RAID device information.
  28.  *        32  -    63   Generic state information.
  29.  *   64  -   127 Personality specific information.
  30.  *  128  -   511 12 32-words descriptors of the disks in the raid set.
  31.  *  512  -   911 Reserved.
  32.  *  912  -  1023 Disk specific descriptor.
  33.  */
  34. /*
  35.  * If x is the real device size in bytes, we return an apparent size of:
  36.  *
  37.  * y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
  38.  *
  39.  * and place the 4kB superblock at offset y.
  40.  */
  41. #define MD_RESERVED_BYTES (64 * 1024)
  42. #define MD_RESERVED_SECTORS (MD_RESERVED_BYTES / 512)
  43. #define MD_RESERVED_BLOCKS (MD_RESERVED_BYTES / BLOCK_SIZE)
  44. #define MD_NEW_SIZE_SECTORS(x) ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
  45. #define MD_NEW_SIZE_BLOCKS(x) ((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)
  46. #define MD_SB_BYTES 4096
  47. #define MD_SB_WORDS (MD_SB_BYTES / 4)
  48. #define MD_SB_BLOCKS (MD_SB_BYTES / BLOCK_SIZE)
  49. #define MD_SB_SECTORS (MD_SB_BYTES / 512)
  50. /*
  51.  * The following are counted in 32-bit words
  52.  */
  53. #define MD_SB_GENERIC_OFFSET 0
  54. #define MD_SB_PERSONALITY_OFFSET 64
  55. #define MD_SB_DISKS_OFFSET 128
  56. #define MD_SB_DESCRIPTOR_OFFSET 992
  57. #define MD_SB_GENERIC_CONSTANT_WORDS 32
  58. #define MD_SB_GENERIC_STATE_WORDS 32
  59. #define MD_SB_GENERIC_WORDS (MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
  60. #define MD_SB_PERSONALITY_WORDS 64
  61. #define MD_SB_DESCRIPTOR_WORDS 32
  62. #define MD_SB_DISKS 27
  63. #define MD_SB_DISKS_WORDS (MD_SB_DISKS*MD_SB_DESCRIPTOR_WORDS)
  64. #define MD_SB_RESERVED_WORDS (1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
  65. #define MD_SB_EQUAL_WORDS (MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
  66. /*
  67.  * Device "operational" state bits
  68.  */
  69. #define MD_DISK_FAULTY 0 /* disk is faulty / operational */
  70. #define MD_DISK_ACTIVE 1 /* disk is running or spare disk */
  71. #define MD_DISK_SYNC 2 /* disk is in sync with the raid set */
  72. #define MD_DISK_REMOVED 3 /* disk is in sync with the raid set */
  73. typedef struct mdp_device_descriptor_s {
  74. __u32 number; /* 0 Device number in the entire set       */
  75. __u32 major; /* 1 Device major number       */
  76. __u32 minor; /* 2 Device minor number       */
  77. __u32 raid_disk; /* 3 The role of the device in the raid set   */
  78. __u32 state; /* 4 Operational state       */
  79. __u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
  80. } mdp_disk_t;
  81. #define MD_SB_MAGIC 0xa92b4efc
  82. /*
  83.  * Superblock state bits
  84.  */
  85. #define MD_SB_CLEAN 0
  86. #define MD_SB_ERRORS 1
  87. typedef struct mdp_superblock_s {
  88. /*
  89.  * Constant generic information
  90.  */
  91. __u32 md_magic; /*  0 MD identifier        */
  92. __u32 major_version; /*  1 major version to which the set conforms */
  93. __u32 minor_version; /*  2 minor version ...       */
  94. __u32 patch_version; /*  3 patchlevel version ...       */
  95. __u32 gvalid_words; /*  4 Number of used words in this section    */
  96. __u32 set_uuid0; /*  5 Raid set identifier       */
  97. __u32 ctime; /*  6 Creation time       */
  98. __u32 level; /*  7 Raid personality       */
  99. __u32 size; /*  8 Apparent size of each individual disk   */
  100. __u32 nr_disks; /*  9 total disks in the raid set       */
  101. __u32 raid_disks; /* 10 disks in a fully functional raid set    */
  102. __u32 md_minor; /* 11 preferred MD minor device number       */
  103. __u32 not_persistent; /* 12 does it have a persistent superblock    */
  104. __u32 set_uuid1; /* 13 Raid set identifier #2       */
  105. __u32 set_uuid2; /* 14 Raid set identifier #3       */
  106. __u32 set_uuid3; /* 15 Raid set identifier #4       */
  107. __u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 16];
  108. /*
  109.  * Generic state information
  110.  */
  111. __u32 utime; /*  0 Superblock update time       */
  112. __u32 state; /*  1 State bits (clean, ...)       */
  113. __u32 active_disks; /*  2 Number of currently active disks       */
  114. __u32 working_disks; /*  3 Number of working disks       */
  115. __u32 failed_disks; /*  4 Number of failed disks       */
  116. __u32 spare_disks; /*  5 Number of spare disks       */
  117. __u32 sb_csum; /*  6 checksum of the whole superblock        */
  118. #ifdef __BIG_ENDIAN
  119. __u32 events_hi; /*  7 high-order of superblock update count   */
  120. __u32 events_lo; /*  8 low-order of superblock update count    */
  121. #else
  122. __u32 events_lo; /*  7 low-order of superblock update count    */
  123. __u32 events_hi; /*  8 high-order of superblock update count   */
  124. #endif
  125. __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 9];
  126. /*
  127.  * Personality information
  128.  */
  129. __u32 layout; /*  0 the array's physical layout       */
  130. __u32 chunk_size; /*  1 chunk size in bytes       */
  131. __u32 root_pv; /*  2 LV root PV */
  132. __u32 root_block; /*  3 LV root block */
  133. __u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 4];
  134. /*
  135.  * Disks information
  136.  */
  137. mdp_disk_t disks[MD_SB_DISKS];
  138. /*
  139.  * Reserved
  140.  */
  141. __u32 reserved[MD_SB_RESERVED_WORDS];
  142. /*
  143.  * Active descriptor
  144.  */
  145. mdp_disk_t this_disk;
  146. } mdp_super_t;
  147. static inline __u64 md_event(mdp_super_t *sb) {
  148. __u64 ev = sb->events_hi;
  149. return (ev<<32)| sb->events_lo;
  150. }
  151. #endif