Blame view

include/linux/raid/md_p.h 11.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
     md_p.h : physical layout of Linux RAID devices
            Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
  	  
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2, or (at your option)
     any later version.
     
     You should have received a copy of the GNU General Public License
     (for example /usr/src/linux/COPYING); if not, write to the Free
     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
  */
  
  #ifndef _MD_P_H
  #define _MD_P_H
bcf74582a   Jaswinder Singh Rajput   headers_check fix...
17
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  /*
   * RAID superblock.
   *
   * The RAID superblock maintains some statistics on each RAID configuration.
   * Each real device in the RAID set contains it near the end of the device.
   * Some of the ideas are copied from the ext2fs implementation.
   *
   * We currently use 4096 bytes as follows:
   *
   *	word offset	function
   *
   *	   0  -    31	Constant generic RAID device information.
   *        32  -    63   Generic state information.
   *	  64  -   127	Personality specific information.
   *	 128  -   511	12 32-words descriptors of the disks in the raid set.
   *	 512  -   911	Reserved.
   *	 912  -  1023	Disk specific descriptor.
   */
  
  /*
   * If x is the real device size in bytes, we return an apparent size of:
   *
   *	y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
   *
   * and place the 4kB superblock at offset y.
   */
  #define MD_RESERVED_BYTES		(64 * 1024)
  #define MD_RESERVED_SECTORS		(MD_RESERVED_BYTES / 512)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
  
  #define MD_NEW_SIZE_SECTORS(x)		((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
  
  #define MD_SB_BYTES			4096
  #define MD_SB_WORDS			(MD_SB_BYTES / 4)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  #define MD_SB_SECTORS			(MD_SB_BYTES / 512)
  
  /*
   * The following are counted in 32-bit words
   */
  #define	MD_SB_GENERIC_OFFSET		0
  #define MD_SB_PERSONALITY_OFFSET	64
  #define MD_SB_DISKS_OFFSET		128
  #define MD_SB_DESCRIPTOR_OFFSET		992
  
  #define MD_SB_GENERIC_CONSTANT_WORDS	32
  #define MD_SB_GENERIC_STATE_WORDS	32
  #define MD_SB_GENERIC_WORDS		(MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
  #define MD_SB_PERSONALITY_WORDS		64
  #define MD_SB_DESCRIPTOR_WORDS		32
  #define MD_SB_DISKS			27
  #define MD_SB_DISKS_WORDS		(MD_SB_DISKS*MD_SB_DESCRIPTOR_WORDS)
  #define MD_SB_RESERVED_WORDS		(1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
  #define MD_SB_EQUAL_WORDS		(MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
  
  /*
   * Device "operational" state bits
   */
  #define MD_DISK_FAULTY		0 /* disk is faulty / operational */
  #define MD_DISK_ACTIVE		1 /* disk is running or spare disk */
  #define MD_DISK_SYNC		2 /* disk is in sync with the raid set */
  #define MD_DISK_REMOVED		3 /* disk is in sync with the raid set */
8ddf9efe6   NeilBrown   [PATCH] md: suppo...
78
79
80
81
  #define	MD_DISK_WRITEMOSTLY	9 /* disk is "write-mostly" is RAID1 config.
  				   * read requests will only be sent here in
  				   * dire need
  				   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  typedef struct mdp_device_descriptor_s {
  	__u32 number;		/* 0 Device number in the entire set	      */
  	__u32 major;		/* 1 Device major number		      */
  	__u32 minor;		/* 2 Device minor number		      */
  	__u32 raid_disk;	/* 3 The role of the device in the raid set   */
  	__u32 state;		/* 4 Operational state			      */
  	__u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
  } mdp_disk_t;
  
  #define MD_SB_MAGIC		0xa92b4efc
  
  /*
   * Superblock state bits
   */
  #define MD_SB_CLEAN		0
  #define MD_SB_ERRORS		1
a654b9d8f   NeilBrown   [PATCH] md: allow...
98
  #define	MD_SB_BITMAP_PRESENT	8 /* bitmap may be present nearby */
f67055780   NeilBrown   [PATCH] md: Check...
99
100
101
102
103
104
105
106
107
108
  
  /*
   * Notes:
   * - if an array is being reshaped (restriped) in order to change the
   *   the number of active devices in the array, 'raid_disks' will be
   *   the larger of the old and new numbers.  'delta_disks' will
   *   be the "new - old".  So if +ve, raid_disks is the new value, and
   *   "raid_disks-delta_disks" is the old.  If -ve, raid_disks is the
   *   old value and "raid_disks+delta_disks" is the new (smaller) value.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  typedef struct mdp_superblock_s {
  	/*
  	 * Constant generic information
  	 */
  	__u32 md_magic;		/*  0 MD identifier 			      */
  	__u32 major_version;	/*  1 major version to which the set conforms */
  	__u32 minor_version;	/*  2 minor version ...			      */
  	__u32 patch_version;	/*  3 patchlevel version ...		      */
  	__u32 gvalid_words;	/*  4 Number of used words in this section    */
  	__u32 set_uuid0;	/*  5 Raid set identifier		      */
  	__u32 ctime;		/*  6 Creation time			      */
  	__u32 level;		/*  7 Raid personality			      */
  	__u32 size;		/*  8 Apparent size of each individual disk   */
  	__u32 nr_disks;		/*  9 total disks in the raid set	      */
  	__u32 raid_disks;	/* 10 disks in a fully functional raid set    */
  	__u32 md_minor;		/* 11 preferred MD minor device number	      */
  	__u32 not_persistent;	/* 12 does it have a persistent superblock    */
  	__u32 set_uuid1;	/* 13 Raid set identifier #2		      */
  	__u32 set_uuid2;	/* 14 Raid set identifier #3		      */
  	__u32 set_uuid3;	/* 15 Raid set identifier #4		      */
  	__u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 16];
  
  	/*
  	 * Generic state information
  	 */
  	__u32 utime;		/*  0 Superblock update time		      */
  	__u32 state;		/*  1 State bits (clean, ...)		      */
  	__u32 active_disks;	/*  2 Number of currently active disks	      */
  	__u32 working_disks;	/*  3 Number of working disks		      */
  	__u32 failed_disks;	/*  4 Number of failed disks		      */
  	__u32 spare_disks;	/*  5 Number of spare disks		      */
  	__u32 sb_csum;		/*  6 checksum of the whole superblock        */
  #ifdef __BIG_ENDIAN
  	__u32 events_hi;	/*  7 high-order of superblock update count   */
  	__u32 events_lo;	/*  8 low-order of superblock update count    */
  	__u32 cp_events_hi;	/*  9 high-order of checkpoint update count   */
  	__u32 cp_events_lo;	/* 10 low-order of checkpoint update count    */
  #else
  	__u32 events_lo;	/*  7 low-order of superblock update count    */
  	__u32 events_hi;	/*  8 high-order of superblock update count   */
  	__u32 cp_events_lo;	/*  9 low-order of checkpoint update count    */
  	__u32 cp_events_hi;	/* 10 high-order of checkpoint update count   */
  #endif
  	__u32 recovery_cp;	/* 11 recovery checkpoint sector count	      */
f67055780   NeilBrown   [PATCH] md: Check...
153
154
155
156
157
158
159
  	/* There are only valid for minor_version > 90 */
  	__u64 reshape_position;	/* 12,13 next address in array-space for reshape */
  	__u32 new_level;	/* 14 new level we are reshaping to	      */
  	__u32 delta_disks;	/* 15 change in number of raid_disks	      */
  	__u32 new_layout;	/* 16 new layout			      */
  	__u32 new_chunk;	/* 17 new chunk size (bytes)		      */
  	__u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 18];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  
  	/*
  	 * Personality information
  	 */
  	__u32 layout;		/*  0 the array's physical layout	      */
  	__u32 chunk_size;	/*  1 chunk size in bytes		      */
  	__u32 root_pv;		/*  2 LV root PV */
  	__u32 root_block;	/*  3 LV root block */
  	__u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 4];
  
  	/*
  	 * Disks information
  	 */
  	mdp_disk_t disks[MD_SB_DISKS];
  
  	/*
  	 * Reserved
  	 */
  	__u32 reserved[MD_SB_RESERVED_WORDS];
  
  	/*
  	 * Active descriptor
  	 */
  	mdp_disk_t this_disk;
  
  } mdp_super_t;
  
  static inline __u64 md_event(mdp_super_t *sb) {
  	__u64 ev = sb->events_hi;
  	return (ev<<32)| sb->events_lo;
  }
cd2ac9321   Cheng Renquan   md: need another ...
191
  #define MD_SUPERBLOCK_1_TIME_SEC_MASK ((1ULL<<40) - 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
193
194
195
196
197
198
199
200
  /*
   * The version-1 superblock :
   * All numeric fields are little-endian.
   *
   * total size: 256 bytes plus 2 per device.
   *  1K allows 384 devices.
   */
  struct mdp_superblock_1 {
  	/* constant array information - 128 bytes */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
201
202
203
204
  	__le32	magic;		/* MD_SB_MAGIC: 0xa92b4efc - little endian */
  	__le32	major_version;	/* 1 */
  	__le32	feature_map;	/* bit 0 set if 'bitmap_offset' is meaningful */
  	__le32	pad0;		/* always set to 0 when writing */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
206
207
  
  	__u8	set_uuid[16];	/* user-space generated. */
  	char	set_name[32];	/* set and interpreted by user-space */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
208
209
210
211
  	__le64	ctime;		/* lo 40 bits are seconds, top 24 are microseconds or 0*/
  	__le32	level;		/* -4 (multipath), -1 (linear), 0,1,4,5 */
  	__le32	layout;		/* only for raid5 and raid10 currently */
  	__le64	size;		/* used size of component devices, in 512byte sectors */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212

1c05b4bc2   NeilBrown   [PATCH] md: endia...
213
214
215
  	__le32	chunksize;	/* in 512byte sectors */
  	__le32	raid_disks;
  	__le32	bitmap_offset;	/* sectors after start of superblock that bitmap starts
a654b9d8f   NeilBrown   [PATCH] md: allow...
216
217
218
  				 * NOTE: signed, so bitmap can be before superblock
  				 * only meaningful of feature_map[0] is set.
  				 */
f67055780   NeilBrown   [PATCH] md: Check...
219
220
  
  	/* These are only valid with feature bit '4' */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
221
222
223
224
  	__le32	new_level;	/* new level we are reshaping to		*/
  	__le64	reshape_position;	/* next address in array-space for reshape */
  	__le32	delta_disks;	/* change in number of raid_disks		*/
  	__le32	new_layout;	/* new layout					*/
cdc2ae6d6   Andre Noll   md: fix some comm...
225
  	__le32	new_chunk;	/* new chunk size (512byte sectors)		*/
c6563a8c3   NeilBrown   md: add possibili...
226
227
228
229
  	__le32  new_offset;	/* signed number to add to data_offset in new
  				 * layout.  0 == no-change.  This can be
  				 * different on each device in the array.
  				 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
231
  
  	/* constant this-device information - 64 bytes */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
232
233
234
235
236
237
  	__le64	data_offset;	/* sector start of data, often 0 */
  	__le64	data_size;	/* sectors in this device that can be used for data */
  	__le64	super_offset;	/* sector start of this superblock */
  	__le64	recovery_offset;/* sectors before this offset (from data_offset) have been recovered */
  	__le32	dev_number;	/* permanent identifier of this  device - not role in raid */
  	__le32	cnt_corrected_read; /* number of read errors that were corrected by re-writing */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
  	__u8	device_uuid[16]; /* user-space setable, ignored by kernel */
8ddf9efe6   NeilBrown   [PATCH] md: suppo...
239
240
  	__u8	devflags;	/* per-device flags.  Only one defined...*/
  #define	WriteMostly1	1	/* mask for writemostly flag in above */
2699b6722   NeilBrown   md: load/store ba...
241
242
243
244
245
246
247
  	/* Bad block log.  If there are any bad blocks the feature flag is set.
  	 * If offset and size are non-zero, that space is reserved and available
  	 */
  	__u8	bblog_shift;	/* shift from sectors to block size */
  	__le16	bblog_size;	/* number of sectors reserved for list */
  	__le32	bblog_offset;	/* sector offset from superblock to bblog,
  				 * signed - not unsigned */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
249
  
  	/* array state information - 64 bytes */
2699b6722   NeilBrown   md: load/store ba...
250
  	__le64	utime;		/* 40 bits second, 24 bits microseconds */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
251
252
  	__le64	events;		/* incremented when superblock updated */
  	__le64	resync_offset;	/* data before this offset (from data_offset) known to be in sync */
25985edce   Lucas De Marchi   Fix common misspe...
253
  	__le32	sb_csum;	/* checksum up to devs[max_dev] */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
254
  	__le32	max_dev;	/* size of devs[] array to consider */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
257
258
259
260
261
262
  	__u8	pad3[64-32];	/* set to 0 when writing */
  
  	/* device state information. Indexed by dev_number.
  	 * 2 bytes per device
  	 * Note there are no per-device state flags. State information is rolled
  	 * into the 'roles' value.  If a device is spare or faulty, then it doesn't
  	 * have a meaningful role.
  	 */
1c05b4bc2   NeilBrown   [PATCH] md: endia...
263
  	__le16	dev_roles[0];	/* role in array, or 0xffff for a spare, or 0xfffe for faulty */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264
  };
71c0805cb   NeilBrown   [PATCH] md: allow...
265
266
  /* feature_map bits */
  #define MD_FEATURE_BITMAP_OFFSET	1
5fd6c1dce   NeilBrown   [PATCH] md: allow...
267
268
269
  #define	MD_FEATURE_RECOVERY_OFFSET	2 /* recovery_offset is present and
  					   * must be honoured
  					   */
f67055780   NeilBrown   [PATCH] md: Check...
270
  #define	MD_FEATURE_RESHAPE_ACTIVE	4
2699b6722   NeilBrown   md: load/store ba...
271
  #define	MD_FEATURE_BAD_BLOCKS		8 /* badblock list is not empty */
2d78f8c45   NeilBrown   md: create extern...
272
273
274
275
  #define	MD_FEATURE_REPLACEMENT		16 /* This device is replacing an
  					    * active device with same 'role'.
  					    * 'recovery_offset' is also set.
  					    */
2c810cddc   NeilBrown   md: allow a resha...
276
277
278
279
  #define	MD_FEATURE_RESHAPE_BACKWARDS	32 /* Reshape doesn't change number
  					    * of devices, but is going
  					    * backwards anyway.
  					    */
c6563a8c3   NeilBrown   md: add possibili...
280
  #define	MD_FEATURE_NEW_OFFSET		64 /* new_offset must be honoured */
43437ecd5   majianpeng   md: Use existed m...
281
282
283
284
  #define	MD_FEATURE_ALL			(MD_FEATURE_BITMAP_OFFSET	\
  					|MD_FEATURE_RECOVERY_OFFSET	\
  					|MD_FEATURE_RESHAPE_ACTIVE	\
  					|MD_FEATURE_BAD_BLOCKS		\
2c810cddc   NeilBrown   md: allow a resha...
285
  					|MD_FEATURE_REPLACEMENT		\
c6563a8c3   NeilBrown   md: add possibili...
286
287
288
  					|MD_FEATURE_RESHAPE_BACKWARDS	\
  					|MD_FEATURE_NEW_OFFSET		\
  					)
71c0805cb   NeilBrown   [PATCH] md: allow...
289

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
  #endif