diskfilter.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /* diskfilter.h - On disk structures for RAID. */
  2. /*
  3. * GRUB -- GRand Unified Bootloader
  4. * Copyright (C) 2006,2007,2008,2010 Free Software Foundation, Inc.
  5. *
  6. * GRUB is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * GRUB is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef GRUB_DISKFILTER_H
  20. #define GRUB_DISKFILTER_H 1
  21. #include <grub/types.h>
  22. #include <grub/list.h>
  23. enum
  24. {
  25. GRUB_RAID_LAYOUT_RIGHT_MASK = 1,
  26. GRUB_RAID_LAYOUT_SYMMETRIC_MASK = 2,
  27. GRUB_RAID_LAYOUT_MUL_FROM_POS = 4,
  28. GRUB_RAID_LAYOUT_LEFT_ASYMMETRIC = 0,
  29. GRUB_RAID_LAYOUT_RIGHT_ASYMMETRIC = GRUB_RAID_LAYOUT_RIGHT_MASK,
  30. GRUB_RAID_LAYOUT_LEFT_SYMMETRIC = GRUB_RAID_LAYOUT_SYMMETRIC_MASK,
  31. GRUB_RAID_LAYOUT_RIGHT_SYMMETRIC = (GRUB_RAID_LAYOUT_RIGHT_MASK
  32. | GRUB_RAID_LAYOUT_SYMMETRIC_MASK)
  33. };
  34. struct grub_diskfilter_vg {
  35. char *uuid;
  36. grub_size_t uuid_len;
  37. /* Optional. */
  38. char *name;
  39. grub_uint64_t extent_size;
  40. struct grub_diskfilter_pv *pvs;
  41. struct grub_diskfilter_lv *lvs;
  42. struct grub_diskfilter_vg *next;
  43. #ifdef GRUB_UTIL
  44. struct grub_diskfilter *driver;
  45. #endif
  46. };
  47. struct grub_diskfilter_pv_id {
  48. union
  49. {
  50. char *uuid;
  51. int id;
  52. };
  53. grub_size_t uuidlen;
  54. };
  55. struct grub_diskfilter_pv {
  56. struct grub_diskfilter_pv_id id;
  57. /* Optional. */
  58. char *name;
  59. grub_disk_t disk;
  60. grub_disk_addr_t part_start;
  61. grub_disk_addr_t part_size;
  62. grub_disk_addr_t start_sector; /* Sector number where the data area starts. */
  63. struct grub_diskfilter_pv *next;
  64. /* Optional. */
  65. grub_uint8_t *internal_id;
  66. #ifdef GRUB_UTIL
  67. char **partmaps;
  68. #endif
  69. };
  70. struct grub_diskfilter_lv {
  71. /* Name used for disk. */
  72. char *fullname;
  73. char *idname;
  74. /* Optional. */
  75. char *name;
  76. int number;
  77. unsigned int segment_count;
  78. grub_size_t segment_alloc;
  79. grub_uint64_t size;
  80. int became_readable_at;
  81. int scanned;
  82. int visible;
  83. /* Pointer to segment_count segments. */
  84. struct grub_diskfilter_segment *segments;
  85. struct grub_diskfilter_vg *vg;
  86. struct grub_diskfilter_lv *next;
  87. /* Optional. */
  88. char *internal_id;
  89. };
  90. struct grub_diskfilter_segment {
  91. grub_uint64_t start_extent;
  92. grub_uint64_t extent_count;
  93. enum
  94. {
  95. GRUB_DISKFILTER_STRIPED = 0,
  96. GRUB_DISKFILTER_MIRROR = 1,
  97. GRUB_DISKFILTER_RAID4 = 4,
  98. GRUB_DISKFILTER_RAID5 = 5,
  99. GRUB_DISKFILTER_RAID6 = 6,
  100. GRUB_DISKFILTER_RAID10 = 10,
  101. } type;
  102. int layout;
  103. /* valid only for raid10. */
  104. grub_uint64_t raid_member_size;
  105. unsigned int node_count;
  106. unsigned int node_alloc;
  107. struct grub_diskfilter_node *nodes;
  108. unsigned int stripe_size;
  109. };
  110. struct grub_diskfilter_node {
  111. grub_disk_addr_t start;
  112. /* Optional. */
  113. char *name;
  114. struct grub_diskfilter_pv *pv;
  115. struct grub_diskfilter_lv *lv;
  116. };
  117. struct grub_diskfilter_vg *
  118. grub_diskfilter_get_vg_by_uuid (grub_size_t uuidlen, char *uuid);
  119. struct grub_diskfilter
  120. {
  121. struct grub_diskfilter *next;
  122. struct grub_diskfilter **prev;
  123. const char *name;
  124. struct grub_diskfilter_vg * (*detect) (grub_disk_t disk,
  125. struct grub_diskfilter_pv_id *id,
  126. grub_disk_addr_t *start_sector);
  127. };
  128. typedef struct grub_diskfilter *grub_diskfilter_t;
  129. extern grub_diskfilter_t grub_diskfilter_list;
  130. static inline void
  131. grub_diskfilter_register_front (grub_diskfilter_t diskfilter)
  132. {
  133. grub_list_push (GRUB_AS_LIST_P (&grub_diskfilter_list),
  134. GRUB_AS_LIST (diskfilter));
  135. }
  136. static inline void
  137. grub_diskfilter_register_back (grub_diskfilter_t diskfilter)
  138. {
  139. grub_diskfilter_t p, *q;
  140. for (q = &grub_diskfilter_list, p = *q; p; q = &p->next, p = *q);
  141. diskfilter->next = NULL;
  142. diskfilter->prev = q;
  143. *q = diskfilter;
  144. }
  145. static inline void
  146. grub_diskfilter_unregister (grub_diskfilter_t diskfilter)
  147. {
  148. grub_list_remove (GRUB_AS_LIST (diskfilter));
  149. }
  150. struct grub_diskfilter_vg *
  151. grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
  152. const char *name, grub_uint64_t disk_size,
  153. grub_uint64_t stripe_size,
  154. int layout, int level);
  155. typedef grub_err_t (*grub_raid5_recover_func_t) (struct grub_diskfilter_segment *array,
  156. int disknr, char *buf,
  157. grub_disk_addr_t sector,
  158. grub_size_t size);
  159. typedef grub_err_t (*grub_raid6_recover_func_t) (struct grub_diskfilter_segment *array,
  160. int disknr, int p, char *buf,
  161. grub_disk_addr_t sector,
  162. grub_size_t size);
  163. extern grub_raid5_recover_func_t grub_raid5_recover_func;
  164. extern grub_raid6_recover_func_t grub_raid6_recover_func;
  165. typedef grub_err_t (* raid_recover_read_t)(void *data, int disk_nr,
  166. grub_uint64_t addr, void *dest,
  167. grub_size_t size);
  168. extern grub_err_t
  169. grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
  170. char *buf, grub_uint64_t sector, grub_size_t size,
  171. int layout, raid_recover_read_t read_func);
  172. grub_err_t grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg);
  173. grub_err_t
  174. grub_diskfilter_read_node (const struct grub_diskfilter_node *node,
  175. grub_disk_addr_t sector,
  176. grub_size_t size, char *buf);
  177. #ifdef GRUB_UTIL
  178. struct grub_diskfilter_pv *
  179. grub_diskfilter_get_pv_from_disk (grub_disk_t disk,
  180. struct grub_diskfilter_vg **vg);
  181. void
  182. grub_diskfilter_get_partmap (grub_disk_t disk,
  183. void (*cb) (const char *val, void *data),
  184. void *data);
  185. #endif
  186. #endif /* ! GRUB_RAID_H */