1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _MD_K_H
16#define _MD_K_H
17
18
19#include "../../../drivers/md/dm-bio-list.h"
20
21#ifdef CONFIG_BLOCK
22
23#define LEVEL_MULTIPATH (-4)
24#define LEVEL_LINEAR (-1)
25#define LEVEL_FAULTY (-5)
26
27
28
29
30
31#define LEVEL_NONE (-1000000)
32
33#define MaxSector (~(sector_t)0)
34
35typedef struct mddev_s mddev_t;
36typedef struct mdk_rdev_s mdk_rdev_t;
37
38
39
40
41
42
43#define MAX_CHUNK_SIZE (1<<30)
44
45
46
47
48struct mdk_rdev_s
49{
50 struct list_head same_set;
51
52 sector_t size;
53 mddev_t *mddev;
54 long last_events;
55
56 struct block_device *bdev;
57
58 struct page *sb_page;
59 int sb_loaded;
60 __u64 sb_events;
61 sector_t data_offset;
62 sector_t sb_offset;
63 int sb_size;
64 int preferred_minor;
65
66 struct kobject kobj;
67
68
69
70
71
72
73
74
75
76
77
78
79 unsigned long flags;
80#define Faulty 1
81#define In_sync 2
82#define WriteMostly 4
83#define BarriersNotsupp 5
84#define AllReserved 6
85
86#define AutoDetected 7
87#define Blocked 8
88
89
90 wait_queue_head_t blocked_wait;
91
92 int desc_nr;
93 int raid_disk;
94 int saved_raid_disk;
95
96
97
98 sector_t recovery_offset;
99
100
101
102
103 atomic_t nr_pending;
104
105
106
107 atomic_t read_errors;
108
109
110 atomic_t corrected_errors;
111
112
113
114 struct work_struct del_work;
115};
116
117struct mddev_s
118{
119 void *private;
120 struct mdk_personality *pers;
121 dev_t unit;
122 int md_minor;
123 struct list_head disks;
124 unsigned long flags;
125#define MD_CHANGE_DEVS 0
126#define MD_CHANGE_CLEAN 1
127#define MD_CHANGE_PENDING 2
128
129 int ro;
130
131 struct gendisk *gendisk;
132
133 struct kobject kobj;
134
135
136 int major_version,
137 minor_version,
138 patch_version;
139 int persistent;
140 int external;
141
142 char metadata_type[17];
143 int chunk_size;
144 time_t ctime, utime;
145 int level, layout;
146 char clevel[16];
147 int raid_disks;
148 int max_disks;
149 sector_t size;
150 sector_t array_size;
151 __u64 events;
152
153 char uuid[16];
154
155
156
157
158
159
160 sector_t reshape_position;
161 int delta_disks, new_level, new_layout, new_chunk;
162
163 struct mdk_thread_s *thread;
164 struct mdk_thread_s *sync_thread;
165 sector_t curr_resync;
166 unsigned long resync_mark;
167 sector_t resync_mark_cnt;
168 sector_t curr_mark_cnt;
169
170 sector_t resync_max_sectors;
171
172 sector_t resync_mismatches;
173
174
175
176
177 sector_t suspend_lo;
178 sector_t suspend_hi;
179
180 int sync_speed_min;
181 int sync_speed_max;
182
183
184 int parallel_resync;
185
186 int ok_start_degraded;
187
188
189
190
191
192
193
194
195
196
197
198
199#define MD_RECOVERY_RUNNING 0
200#define MD_RECOVERY_SYNC 1
201#define MD_RECOVERY_INTR 3
202#define MD_RECOVERY_DONE 4
203#define MD_RECOVERY_NEEDED 5
204#define MD_RECOVERY_REQUESTED 6
205#define MD_RECOVERY_CHECK 7
206#define MD_RECOVERY_RESHAPE 8
207#define MD_RECOVERY_FROZEN 9
208
209 unsigned long recovery;
210
211 int in_sync;
212 struct mutex reconfig_mutex;
213 atomic_t active;
214
215 int changed;
216 int degraded;
217
218
219 int barriers_work;
220
221
222
223 struct bio *biolist;
224
225
226
227 atomic_t recovery_active;
228 wait_queue_head_t recovery_wait;
229 sector_t recovery_cp;
230 sector_t resync_max;
231
232
233 spinlock_t write_lock;
234 wait_queue_head_t sb_wait;
235 atomic_t pending_writes;
236
237 unsigned int safemode;
238
239
240 unsigned int safemode_delay;
241 struct timer_list safemode_timer;
242 atomic_t writes_pending;
243 struct request_queue *queue;
244
245 atomic_t write_behind;
246 unsigned int max_write_behind;
247
248 struct bitmap *bitmap;
249 struct file *bitmap_file;
250 long bitmap_offset;
251
252
253
254 long default_bitmap_offset;
255
256
257
258
259 struct list_head all_mddevs;
260};
261
262
263static inline void rdev_dec_pending(mdk_rdev_t *rdev, mddev_t *mddev)
264{
265 int faulty = test_bit(Faulty, &rdev->flags);
266 if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
267 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
268}
269
270static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors)
271{
272 atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
273}
274
275struct mdk_personality
276{
277 char *name;
278 int level;
279 struct list_head list;
280 struct module *owner;
281 int (*make_request)(struct request_queue *q, struct bio *bio);
282 int (*run)(mddev_t *mddev);
283 int (*stop)(mddev_t *mddev);
284 void (*status)(struct seq_file *seq, mddev_t *mddev);
285
286
287
288 void (*error_handler)(mddev_t *mddev, mdk_rdev_t *rdev);
289 int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev);
290 int (*hot_remove_disk) (mddev_t *mddev, int number);
291 int (*spare_active) (mddev_t *mddev);
292 sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster);
293 int (*resize) (mddev_t *mddev, sector_t sectors);
294 int (*check_reshape) (mddev_t *mddev);
295 int (*start_reshape) (mddev_t *mddev);
296 int (*reconfig) (mddev_t *mddev, int layout, int chunk_size);
297
298
299
300
301
302 void (*quiesce) (mddev_t *mddev, int state);
303};
304
305
306struct md_sysfs_entry {
307 struct attribute attr;
308 ssize_t (*show)(mddev_t *, char *);
309 ssize_t (*store)(mddev_t *, const char *, size_t);
310};
311
312
313static inline char * mdname (mddev_t * mddev)
314{
315 return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
316}
317
318
319
320
321
322#define rdev_for_each_list(rdev, tmp, list) \
323 \
324 for ((tmp) = (list).next; \
325 (rdev) = (list_entry((tmp), mdk_rdev_t, same_set)), \
326 (tmp) = (tmp)->next, (tmp)->prev != &(list) \
327 ; )
328
329
330
331#define rdev_for_each(rdev, tmp, mddev) \
332 rdev_for_each_list(rdev, tmp, (mddev)->disks)
333
334typedef struct mdk_thread_s {
335 void (*run) (mddev_t *mddev);
336 mddev_t *mddev;
337 wait_queue_head_t wqueue;
338 unsigned long flags;
339 struct task_struct *tsk;
340 unsigned long timeout;
341} mdk_thread_t;
342
343#define THREAD_WAKEUP 0
344
345#define __wait_event_lock_irq(wq, condition, lock, cmd) \
346do { \
347 wait_queue_t __wait; \
348 init_waitqueue_entry(&__wait, current); \
349 \
350 add_wait_queue(&wq, &__wait); \
351 for (;;) { \
352 set_current_state(TASK_UNINTERRUPTIBLE); \
353 if (condition) \
354 break; \
355 spin_unlock_irq(&lock); \
356 cmd; \
357 schedule(); \
358 spin_lock_irq(&lock); \
359 } \
360 current->state = TASK_RUNNING; \
361 remove_wait_queue(&wq, &__wait); \
362} while (0)
363
364#define wait_event_lock_irq(wq, condition, lock, cmd) \
365do { \
366 if (condition) \
367 break; \
368 __wait_event_lock_irq(wq, condition, lock, cmd); \
369} while (0)
370
371static inline void safe_put_page(struct page *p)
372{
373 if (p) put_page(p);
374}
375
376#endif
377#endif
378
379