Optimize translation files of debconf
[rrq/maintain_lilo.git] / src / md-int.h
1 /*
2    md.h : Multiple Devices driver for Linux
3           Copyright (C) 1994-96 Marc ZYNGIER
4           <zyngier@ufr-info-p7.ibp.fr> or
5           <maz@gloups.fdn.fr>
6           
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11    
12    You should have received a copy of the GNU General Public License
13    (for example /usr/src/linux/COPYING); if not, write to the Free
14    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
15 */
16
17 #ifndef MD_INT_H
18 #define MD_INT_H
19
20 /* don't include the kernel RAID header! */
21 #define _MD_H
22
23 typedef unsigned int md_u32;
24 typedef unsigned short md_u16;
25 typedef unsigned char md_u8;
26
27 /*#include <linux/major.h>*/
28 #include <sys/ioctl.h>
29
30 #define MD_MAJOR MAJOR_MD
31
32 /*
33  * Different major versions are not compatible.
34  * Different minor versions are only downward compatible.
35  * Different patchlevel versions are downward and upward compatible.
36  */
37
38 struct md_version {
39         md_u32 major;
40         md_u32 minor;
41         md_u32 patchlevel;
42 };
43
44 /*
45  * default readahead
46  */
47 #define MD_READAHEAD    (256 * 1024)
48
49 /* These are the ioctls for md versions < 0.50 */
50 #define REGISTER_MD_DEV         _IO (MD_MAJOR, 1)
51 #define START_MD                _IO (MD_MAJOR, 2)
52 #define STOP_MD                 _IO (MD_MAJOR, 3)
53
54 /* status */
55 #define RAID_VERSION            _IOR (MD_MAJOR, 0x10, struct md_version)
56 #define GET_ARRAY_INFO          _IOR (MD_MAJOR, 0x11, md_array_info_t)
57 #define GET_DISK_INFO           _IOR (MD_MAJOR, 0x12, md_disk_info_t)
58 #define PRINT_RAID_DEBUG        _IO (MD_MAJOR, 0x13)
59
60 /* configuration */
61 #define CLEAR_ARRAY             _IO (MD_MAJOR, 0x20)
62 #define ADD_NEW_DISK            _IOW (MD_MAJOR, 0x21, md_disk_info_t)
63 #define HOT_REMOVE_DISK         _IO (MD_MAJOR, 0x22)
64 #define SET_ARRAY_INFO          _IOW (MD_MAJOR, 0x23, md_array_info_t)
65 #define SET_DISK_INFO           _IO (MD_MAJOR, 0x24)
66 #define WRITE_RAID_INFO         _IO (MD_MAJOR, 0x25)
67 #define UNPROTECT_ARRAY         _IO (MD_MAJOR, 0x26)
68 #define PROTECT_ARRAY           _IO (MD_MAJOR, 0x27)
69 #define HOT_ADD_DISK            _IO (MD_MAJOR, 0x28)
70
71 /* usage */
72 #define RUN_ARRAY               _IOW (MD_MAJOR, 0x30, struct md_param)
73 #define START_ARRAY             _IO (MD_MAJOR, 0x31)
74 #define STOP_ARRAY              _IO (MD_MAJOR, 0x32)
75 #define STOP_ARRAY_RO           _IO (MD_MAJOR, 0x33)
76 #define RESTART_ARRAY_RW        _IO (MD_MAJOR, 0x34)
77
78
79 /* for raid < 0.50 only */
80 #define MD_PERSONALITY_SHIFT    16
81
82 #define MD_RESERVED       0UL
83 #define LINEAR            1UL
84 #define STRIPED           2UL
85 #define RAID0             STRIPED
86 #define RAID1             3UL
87 #define RAID5             4UL
88 #define TRANSLUCENT       5UL
89 #define LVM               6UL
90 #define MAX_PERSONALITY   7UL
91
92 /*
93  * MD superblock.
94  *
95  * The MD superblock maintains some statistics on each MD configuration.
96  * Each real device in the MD set contains it near the end of the device.
97  * Some of the ideas are copied from the ext2fs implementation.
98  *
99  * We currently use 4096 bytes as follows:
100  *
101  *      word offset     function
102  *
103  *         0  -    31   Constant generic MD device information.
104  *        32  -    63   Generic state information.
105  *        64  -   127   Personality specific information.
106  *       128  -   511   12 32-words descriptors of the disks in the raid set.
107  *       512  -   911   Reserved.
108  *       912  -  1023   Disk specific descriptor.
109  */
110
111 /*
112  * If x is the real device size in bytes, we return an apparent size of:
113  *
114  *      y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
115  *
116  * and place the 4kB superblock at offset y.
117  */
118 #define MD_RESERVED_BYTES               (64 * 1024)
119 #define MD_RESERVED_SECTORS             (MD_RESERVED_BYTES / 512)
120 #define MD_RESERVED_BLOCKS              (MD_RESERVED_BYTES / BLOCK_SIZE)
121
122 #define MD_NEW_SIZE_SECTORS(x)          ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
123 #define MD_NEW_SIZE_BLOCKS(x)           ((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)
124
125 #define MD_SB_BYTES                     4096
126 #define MD_SB_WORDS                     (MD_SB_BYTES / 4)
127 #define MD_SB_BLOCKS                    (MD_SB_BYTES / BLOCK_SIZE)
128 #define MD_SB_SECTORS                   (MD_SB_BYTES / 512)
129
130 /*
131  * The following are counted in 32-bit words
132  */
133 #define MD_SB_GENERIC_OFFSET            0
134 #define MD_SB_PERSONALITY_OFFSET        64
135 #define MD_SB_DISKS_OFFSET              128
136 #define MD_SB_DESCRIPTOR_OFFSET         992
137
138 #define MD_SB_GENERIC_CONSTANT_WORDS    32
139 #define MD_SB_GENERIC_STATE_WORDS       32
140 #define MD_SB_GENERIC_WORDS             (MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
141 #define MD_SB_PERSONALITY_WORDS         64
142 #define MD_SB_DISKS_WORDS               384
143 #define MD_SB_DESCRIPTOR_WORDS          32
144 #define MD_SB_RESERVED_WORDS            (1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
145 #define MD_SB_EQUAL_WORDS               (MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
146 #define MD_SB_DISKS                     (MD_SB_DISKS_WORDS / MD_SB_DESCRIPTOR_WORDS)
147
148 /*
149  * Device "operational" state bits
150  */
151 #define MD_DISK_FAULTY          0 /* disk is faulty / operational */
152 #define MD_DISK_ACTIVE          1 /* disk is running or spare disk */
153 #define MD_DISK_SYNC            2 /* disk is in sync with the raid set */
154
155 typedef struct md_device_descriptor_s {
156         md_u32 number;          /* 0 Device number in the entire set          */
157         md_u32 major;           /* 1 Device major number                      */
158         md_u32 minor;           /* 2 Device minor number                      */
159         md_u32 raid_disk;       /* 3 The role of the device in the raid set   */
160         md_u32 state;           /* 4 Operational state                        */
161         md_u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
162 } md_descriptor_t;
163
164 #define MD_SB_MAGIC             0xa92b4efc
165
166 /*
167  * Superblock state bits
168  */
169 #define MD_SB_CLEAN             0
170 #define MD_SB_ERRORS            1
171
172 typedef struct md_superblock_s {
173         /*
174          * Constant generic information
175          */
176         md_u32 md_magic;                /*  0 MD identifier                           */
177         md_u32 major_version;   /*  1 major version to which the set conforms */
178         md_u32 minor_version;   /*  2 minor version ...                       */
179         md_u32 patch_version;   /*  3 patchlevel version ...                  */
180         md_u32 gvalid_words;    /*  4 Number of used words in this section    */
181         md_u32 set_magic;       /*  5 Raid set identifier                     */
182         md_u32 ctime;           /*  6 Creation time                           */
183         md_u32 level;           /*  7 Raid personality                        */
184         md_u32 size;            /*  8 Apparent size of each individual disk   */
185         md_u32 nr_disks;        /*  9 total disks in the raid set             */
186         md_u32 raid_disks;      /* 10 disks in a fully functional raid set    */
187         md_u32 md_minor;        /* 11 preferred MD minor device number        */
188         md_u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 12];
189
190         /*
191          * Generic state information
192          */
193         md_u32 utime;           /*  0 Superblock update time                  */
194         md_u32 state;           /*  1 State bits (clean, ...)                 */
195         md_u32 active_disks;    /*  2 Number of currently active disks        */
196         md_u32 working_disks;   /*  3 Number of working disks                 */
197         md_u32 failed_disks;    /*  4 Number of failed disks                  */
198         md_u32 spare_disks;     /*  5 Number of spare disks                   */
199         md_u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 6];
200
201         /*
202          * Personality information
203          */
204         md_u32 layout;          /*  0 the array's physical layout             */
205         md_u32 chunk_size;      /*  1 chunk size in bytes                     */
206         md_u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 2];
207
208         /*
209          * Disks information
210          */
211         md_descriptor_t disks[MD_SB_DISKS];
212
213         /*
214          * Reserved
215          */
216         md_u32 reserved[MD_SB_RESERVED_WORDS];
217
218         /*
219          * Active descriptor
220          */
221         md_descriptor_t descriptor;
222
223 } md_superblock_t;
224
225 /*
226  * options passed in raidstart:
227  */
228
229 #define MAX_CHUNK_SIZE (4096*1024)
230
231 struct md_param
232 {
233         int                     personality;    /* 1,2,3,4 */
234         int                     chunk_size;     /* in bytes */
235         int                     max_fault;      /* unused for now */
236 };
237
238 typedef struct md_array_info_s {
239         /*
240          * Generic constant information
241          */
242         md_u32 major_version;
243         md_u32 minor_version;
244         md_u32 patch_version;
245         md_u32 ctime;
246         md_u32 level;
247         md_u32 size;
248         md_u32 nr_disks;
249         md_u32 raid_disks;
250         md_u32 md_minor;
251         md_u32 not_persistent;
252
253         /*
254          * Generic state information
255          */
256         md_u32 utime;           /*  0 Superblock update time                  */
257         md_u32 state;           /*  1 State bits (clean, ...)                 */
258         md_u32 active_disks;    /*  2 Number of currently active disks        */
259         md_u32 working_disks;   /*  3 Number of working disks                 */
260         md_u32 failed_disks;    /*  4 Number of failed disks                  */
261         md_u32 spare_disks;     /*  5 Number of spare disks                   */
262
263         /*
264          * Personality information
265          */
266         md_u32 layout;          /*  0 the array's physical layout             */
267         md_u32 chunk_size;      /*  1 chunk size in bytes                     */
268
269 } md_array_info_t;
270
271 typedef struct md_disk_info_s {
272         /*
273          * configuration/status of one particular disk
274          */
275         md_u32 number;
276         md_u32 major;
277         md_u32 minor;
278         md_u32 raid_disk;
279         md_u32 state;
280
281 } md_disk_info_t;
282
283
284 /*
285  * Supported RAID5 algorithms
286  */
287 #define RAID5_ALGORITHM_LEFT_ASYMMETRIC         0
288 #define RAID5_ALGORITHM_RIGHT_ASYMMETRIC        1
289 #define RAID5_ALGORITHM_LEFT_SYMMETRIC          2
290 #define RAID5_ALGORITHM_RIGHT_SYMMETRIC         3
291
292 #endif