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