~ubuntu-branches/ubuntu/utopic/xfsprogs/utopic-proposed

« back to all changes in this revision

Viewing changes to libdisk/md.h

  • Committer: Bazaar Package Importer
  • Author(s): Nathan Scott
  • Date: 2002-04-13 09:45:06 UTC
  • Revision ID: james.westby@ubuntu.com-20020413094506-t8dhemv41gkeg4kx
Tags: 2.0.3-1
New upstream bugfix release

Show diffs side-by-side

added added

removed removed

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