1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _MD_MD_H
16#define _MD_MD_H
17
18#include <linux/blkdev.h>
19#include <linux/kobject.h>
20#include <linux/list.h>
21#include <linux/mm.h>
22#include <linux/mutex.h>
23#include <linux/timer.h>
24#include <linux/wait.h>
25#include <linux/workqueue.h>
26
27#define MaxSector (~(sector_t)0)
28
29
30
31
32
33
34#define MD_MAX_BADBLOCKS (PAGE_SIZE/8)
35
36
37
38
39struct md_rdev {
40 struct list_head same_set;
41
42 sector_t sectors;
43 struct mddev *mddev;
44 int last_events;
45
46
47
48
49
50
51 struct block_device *meta_bdev;
52 struct block_device *bdev;
53
54 struct page *sb_page, *bb_page;
55 int sb_loaded;
56 __u64 sb_events;
57 sector_t data_offset;
58 sector_t sb_start;
59 int sb_size;
60 int preferred_minor;
61
62 struct kobject kobj;
63
64
65
66
67
68
69
70
71
72
73
74
75 unsigned long flags;
76#define Faulty 1
77#define In_sync 2
78#define WriteMostly 4
79#define AutoDetected 7
80#define Blocked 8
81
82
83
84#define WriteErrorSeen 9
85
86
87#define FaultRecorded 10
88
89
90
91
92
93#define BlockedBadBlocks 11
94
95
96
97
98
99
100
101
102
103 wait_queue_head_t blocked_wait;
104
105 int desc_nr;
106 int raid_disk;
107 int new_raid_disk;
108
109
110 int saved_raid_disk;
111
112
113
114 sector_t recovery_offset;
115
116
117
118
119 atomic_t nr_pending;
120
121
122
123 atomic_t read_errors;
124
125
126 struct timespec last_read_error;
127
128
129 atomic_t corrected_errors;
130
131
132
133 struct work_struct del_work;
134
135 struct sysfs_dirent *sysfs_state;
136
137
138 struct badblocks {
139 int count;
140 int unacked_exist;
141
142
143
144 int shift;
145
146
147 u64 *page;
148 int changed;
149 seqlock_t lock;
150
151 sector_t sector;
152 sector_t size;
153 } badblocks;
154};
155
156#define BB_LEN_MASK (0x00000000000001FFULL)
157#define BB_OFFSET_MASK (0x7FFFFFFFFFFFFE00ULL)
158#define BB_ACK_MASK (0x8000000000000000ULL)
159#define BB_MAX_LEN 512
160#define BB_OFFSET(x) (((x) & BB_OFFSET_MASK) >> 9)
161#define BB_LEN(x) (((x) & BB_LEN_MASK) + 1)
162#define BB_ACK(x) (!!((x) & BB_ACK_MASK))
163#define BB_MAKE(a, l, ack) (((a)<<9) | ((l)-1) | ((u64)(!!(ack)) << 63))
164
165extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors,
166 sector_t *first_bad, int *bad_sectors);
167static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors,
168 sector_t *first_bad, int *bad_sectors)
169{
170 if (unlikely(rdev->badblocks.count)) {
171 int rv = md_is_badblock(&rdev->badblocks, rdev->data_offset + s,
172 sectors,
173 first_bad, bad_sectors);
174 if (rv)
175 *first_bad -= rdev->data_offset;
176 return rv;
177 }
178 return 0;
179}
180extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
181 int acknowledged);
182extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors);
183extern void md_ack_all_badblocks(struct badblocks *bb);
184
185struct mddev {
186 void *private;
187 struct md_personality *pers;
188 dev_t unit;
189 int md_minor;
190 struct list_head disks;
191 unsigned long flags;
192#define MD_CHANGE_DEVS 0
193#define MD_CHANGE_CLEAN 1
194#define MD_CHANGE_PENDING 2
195#define MD_ARRAY_FIRST_USE 3
196
197 int suspended;
198 atomic_t active_io;
199 int ro;
200 int sysfs_active;
201
202
203
204 int ready;
205
206 struct gendisk *gendisk;
207
208 struct kobject kobj;
209 int hold_active;
210#define UNTIL_IOCTL 1
211#define UNTIL_STOP 2
212
213
214 int major_version,
215 minor_version,
216 patch_version;
217 int persistent;
218 int external;
219
220 char metadata_type[17];
221 int chunk_sectors;
222 time_t ctime, utime;
223 int level, layout;
224 char clevel[16];
225 int raid_disks;
226 int max_disks;
227 sector_t dev_sectors;
228
229 sector_t array_sectors;
230 int external_size;
231
232 __u64 events;
233
234
235
236
237
238 int can_decrease_events;
239
240 char uuid[16];
241
242
243
244
245
246
247 sector_t reshape_position;
248 int delta_disks, new_level, new_layout;
249 int new_chunk_sectors;
250
251 atomic_t plug_cnt;
252
253
254 struct md_thread *thread;
255 struct md_thread *sync_thread;
256 sector_t curr_resync;
257
258
259
260
261
262
263 sector_t curr_resync_completed;
264 unsigned long resync_mark;
265 sector_t resync_mark_cnt;
266 sector_t curr_mark_cnt;
267
268 sector_t resync_max_sectors;
269
270 sector_t resync_mismatches;
271
272
273
274
275 sector_t suspend_lo;
276 sector_t suspend_hi;
277
278 int sync_speed_min;
279 int sync_speed_max;
280
281
282 int parallel_resync;
283
284 int ok_start_degraded;
285
286
287
288
289
290
291
292
293
294
295
296
297
298#define MD_RECOVERY_RUNNING 0
299#define MD_RECOVERY_SYNC 1
300#define MD_RECOVERY_RECOVER 2
301#define MD_RECOVERY_INTR 3
302#define MD_RECOVERY_DONE 4
303#define MD_RECOVERY_NEEDED 5
304#define MD_RECOVERY_REQUESTED 6
305#define MD_RECOVERY_CHECK 7
306#define MD_RECOVERY_RESHAPE 8
307#define MD_RECOVERY_FROZEN 9
308
309 unsigned long recovery;
310
311
312
313
314
315 int recovery_disabled;
316
317 int in_sync;
318
319
320
321
322
323
324
325
326
327 struct mutex open_mutex;
328 struct mutex reconfig_mutex;
329 atomic_t active;
330 atomic_t openers;
331
332 int changed;
333
334 int degraded;
335
336
337
338 atomic_t recovery_active;
339 wait_queue_head_t recovery_wait;
340 sector_t recovery_cp;
341 sector_t resync_min;
342
343 sector_t resync_max;
344
345
346 struct sysfs_dirent *sysfs_state;
347
348
349 struct sysfs_dirent *sysfs_action;
350
351 struct work_struct del_work;
352
353 spinlock_t write_lock;
354 wait_queue_head_t sb_wait;
355 atomic_t pending_writes;
356
357 unsigned int safemode;
358
359
360 unsigned int safemode_delay;
361 struct timer_list safemode_timer;
362 atomic_t writes_pending;
363 struct request_queue *queue;
364
365 struct bitmap *bitmap;
366 struct {
367 struct file *file;
368 loff_t offset;
369
370
371
372
373
374 loff_t default_offset;
375
376
377
378 struct mutex mutex;
379 unsigned long chunksize;
380 unsigned long daemon_sleep;
381 unsigned long max_write_behind;
382 int external;
383 } bitmap_info;
384
385 atomic_t max_corr_read_errors;
386 struct list_head all_mddevs;
387
388 struct attribute_group *to_remove;
389
390 struct bio_set *bio_set;
391
392
393
394
395
396 struct bio *flush_bio;
397 atomic_t flush_pending;
398 struct work_struct flush_work;
399 struct work_struct event_work;
400 void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
401};
402
403
404static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
405{
406 int faulty = test_bit(Faulty, &rdev->flags);
407 if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
408 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
409}
410
411static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors)
412{
413 atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
414}
415
416struct md_personality
417{
418 char *name;
419 int level;
420 struct list_head list;
421 struct module *owner;
422 void (*make_request)(struct mddev *mddev, struct bio *bio);
423 int (*run)(struct mddev *mddev);
424 int (*stop)(struct mddev *mddev);
425 void (*status)(struct seq_file *seq, struct mddev *mddev);
426
427
428
429 void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev);
430 int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev);
431 int (*hot_remove_disk) (struct mddev *mddev, int number);
432 int (*spare_active) (struct mddev *mddev);
433 sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster);
434 int (*resize) (struct mddev *mddev, sector_t sectors);
435 sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks);
436 int (*check_reshape) (struct mddev *mddev);
437 int (*start_reshape) (struct mddev *mddev);
438 void (*finish_reshape) (struct mddev *mddev);
439
440
441
442
443
444 void (*quiesce) (struct mddev *mddev, int state);
445
446
447
448
449
450
451
452
453
454 void *(*takeover) (struct mddev *mddev);
455};
456
457
458struct md_sysfs_entry {
459 struct attribute attr;
460 ssize_t (*show)(struct mddev *, char *);
461 ssize_t (*store)(struct mddev *, const char *, size_t);
462};
463extern struct attribute_group md_bitmap_group;
464
465static inline struct sysfs_dirent *sysfs_get_dirent_safe(struct sysfs_dirent *sd, char *name)
466{
467 if (sd)
468 return sysfs_get_dirent(sd, NULL, name);
469 return sd;
470}
471static inline void sysfs_notify_dirent_safe(struct sysfs_dirent *sd)
472{
473 if (sd)
474 sysfs_notify_dirent(sd);
475}
476
477static inline char * mdname (struct mddev * mddev)
478{
479 return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
480}
481
482static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev)
483{
484 char nm[20];
485 sprintf(nm, "rd%d", rdev->raid_disk);
486 return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
487}
488
489static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
490{
491 char nm[20];
492 sprintf(nm, "rd%d", rdev->raid_disk);
493 sysfs_remove_link(&mddev->kobj, nm);
494}
495
496
497
498
499
500#define rdev_for_each_list(rdev, tmp, head) \
501 list_for_each_entry_safe(rdev, tmp, head, same_set)
502
503
504
505
506#define rdev_for_each(rdev, tmp, mddev) \
507 list_for_each_entry_safe(rdev, tmp, &((mddev)->disks), same_set)
508
509#define rdev_for_each_rcu(rdev, mddev) \
510 list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
511
512struct md_thread {
513 void (*run) (struct mddev *mddev);
514 struct mddev *mddev;
515 wait_queue_head_t wqueue;
516 unsigned long flags;
517 struct task_struct *tsk;
518 unsigned long timeout;
519};
520
521#define THREAD_WAKEUP 0
522
523#define __wait_event_lock_irq(wq, condition, lock, cmd) \
524do { \
525 wait_queue_t __wait; \
526 init_waitqueue_entry(&__wait, current); \
527 \
528 add_wait_queue(&wq, &__wait); \
529 for (;;) { \
530 set_current_state(TASK_UNINTERRUPTIBLE); \
531 if (condition) \
532 break; \
533 spin_unlock_irq(&lock); \
534 cmd; \
535 schedule(); \
536 spin_lock_irq(&lock); \
537 } \
538 current->state = TASK_RUNNING; \
539 remove_wait_queue(&wq, &__wait); \
540} while (0)
541
542#define wait_event_lock_irq(wq, condition, lock, cmd) \
543do { \
544 if (condition) \
545 break; \
546 __wait_event_lock_irq(wq, condition, lock, cmd); \
547} while (0)
548
549static inline void safe_put_page(struct page *p)
550{
551 if (p) put_page(p);
552}
553
554extern int register_md_personality(struct md_personality *p);
555extern int unregister_md_personality(struct md_personality *p);
556extern struct md_thread *md_register_thread(
557 void (*run)(struct mddev *mddev),
558 struct mddev *mddev,
559 const char *name);
560extern void md_unregister_thread(struct md_thread **threadp);
561extern void md_wakeup_thread(struct md_thread *thread);
562extern void md_check_recovery(struct mddev *mddev);
563extern void md_write_start(struct mddev *mddev, struct bio *bi);
564extern void md_write_end(struct mddev *mddev);
565extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
566extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
567
568extern int mddev_congested(struct mddev *mddev, int bits);
569extern void md_flush_request(struct mddev *mddev, struct bio *bio);
570extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
571 sector_t sector, int size, struct page *page);
572extern void md_super_wait(struct mddev *mddev);
573extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
574 struct page *page, int rw, bool metadata_op);
575extern void md_do_sync(struct mddev *mddev);
576extern void md_new_event(struct mddev *mddev);
577extern int md_allow_write(struct mddev *mddev);
578extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
579extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors);
580extern int md_check_no_bitmap(struct mddev *mddev);
581extern int md_integrity_register(struct mddev *mddev);
582extern void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev);
583extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
584extern void restore_bitmap_write_access(struct file *file);
585
586extern void mddev_init(struct mddev *mddev);
587extern int md_run(struct mddev *mddev);
588extern void md_stop(struct mddev *mddev);
589extern void md_stop_writes(struct mddev *mddev);
590extern int md_rdev_init(struct md_rdev *rdev);
591
592extern void mddev_suspend(struct mddev *mddev);
593extern void mddev_resume(struct mddev *mddev);
594extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
595 struct mddev *mddev);
596extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
597 struct mddev *mddev);
598extern int mddev_check_plugged(struct mddev *mddev);
599extern void md_trim_bio(struct bio *bio, int offset, int size);
600#endif
601