~ubuntu-branches/ubuntu/lucid/silo/lucid

« back to all changes in this revision

Viewing changes to include/md-int.h

  • Committer: Bazaar Package Importer
  • Author(s): Fabio M. Di Nitto
  • Date: 2007-10-25 09:28:08 UTC
  • mfrom: (15.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20071025092808-1yhj12t7s4zqsfu5
Tags: 1.4.13a+git20070930-1ubuntu1
* Merge from debian unstable, remaining changes:
  - Build with -fno-stack-protector.
  - Change silo.postinst to automatically update the boot block without
    invoking siloconfig and keep asking questions on upgrades.
  - Convert silo.conf to use /dev/disk/by-uuid.
  - Ubuntu maintainer foobar.
  - Fix debian/rules call to dh_installdocs.
  - Drop the requirement of gcc-4.1 and start using default gcc.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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., 59 Temple Place - Suite 330, Boston, MA
 
15
   02111-1307, USA.
 
16
*/
 
17
 
 
18
#ifndef MD_INT_H
 
19
#define MD_INT_H
 
20
 
 
21
/* don't include the kernel RAID header! */
 
22
#define _MD_H
 
23
 
 
24
typedef unsigned int md_u32;
 
25
typedef unsigned short md_u16;
 
26
typedef unsigned char md_u8;
 
27
 
 
28
#include <linux/major.h>
 
29
#include <sys/ioctl.h>
 
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
        int majorno;
 
39
        int minorno;
 
40
        int 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 majorno;         /* 1 Device major number                      */
 
157
        md_u32 minorno;         /* 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 majorno;
 
276
        md_u32 minorno;
 
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 /* _MD_H */