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/badblocks.h>
20#include <linux/kobject.h>
21#include <linux/list.h>
22#include <linux/mm.h>
23#include <linux/mutex.h>
24#include <linux/timer.h>
25#include <linux/wait.h>
26#include <linux/workqueue.h>
27
28#define MaxSector (~(sector_t)0)
29
30
31
32
33
34
35
36
37
38
39#define MD_FAILFAST (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT)
40
41
42
43struct md_rdev {
44 struct list_head same_set;
45
46 sector_t sectors;
47 struct mddev *mddev;
48 int last_events;
49
50
51
52
53
54
55 struct block_device *meta_bdev;
56 struct block_device *bdev;
57
58 struct page *sb_page, *bb_page;
59 int sb_loaded;
60 __u64 sb_events;
61 sector_t data_offset;
62 sector_t new_data_offset;
63 sector_t sb_start;
64 int sb_size;
65 int preferred_minor;
66
67 struct kobject kobj;
68
69
70
71
72
73
74
75
76
77
78
79
80 unsigned long flags;
81 wait_queue_head_t blocked_wait;
82
83 int desc_nr;
84 int raid_disk;
85 int new_raid_disk;
86
87
88 int saved_raid_disk;
89
90
91
92 union {
93 sector_t recovery_offset;
94
95
96
97 sector_t journal_tail;
98
99
100
101 };
102
103 atomic_t nr_pending;
104
105
106
107 atomic_t read_errors;
108
109
110 struct timespec last_read_error;
111
112
113 atomic_t corrected_errors;
114
115
116
117 struct work_struct del_work;
118
119 struct kernfs_node *sysfs_state;
120
121
122 struct badblocks badblocks;
123
124 struct {
125 short offset;
126
127 unsigned int size;
128 sector_t sector;
129 } ppl;
130};
131enum flag_bits {
132 Faulty,
133 In_sync,
134 Bitmap_sync,
135
136
137 Unmerged,
138
139
140
141 WriteMostly,
142 AutoDetected,
143 Blocked,
144
145
146
147 WriteErrorSeen,
148
149
150 FaultRecorded,
151
152
153
154
155
156 BlockedBadBlocks,
157
158
159
160
161
162
163
164
165
166 WantReplacement,
167
168
169
170
171 Replacement,
172
173
174
175 __Reserved__,
176
177
178 Journal,
179
180
181
182
183 __ReservedClusterRemove,
184 RemoveSynchronized,
185
186
187
188
189 ExternalBbl,
190
191
192 FailFast,
193
194
195
196
197
198 LastDev,
199
200
201
202};
203
204static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors,
205 sector_t *first_bad, int *bad_sectors)
206{
207 if (unlikely(rdev->badblocks.count)) {
208 int rv = badblocks_check(&rdev->badblocks, rdev->data_offset + s,
209 sectors,
210 first_bad, bad_sectors);
211 if (rv)
212 *first_bad -= rdev->data_offset;
213 return rv;
214 }
215 return 0;
216}
217extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
218 int is_new);
219extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
220 int is_new);
221struct md_cluster_info;
222
223
224enum mddev_sb_flags {
225 MD_SB_CHANGE_DEVS,
226 MD_SB_CHANGE_CLEAN,
227 MD_SB_CHANGE_PENDING,
228 MD_SB_NEED_REWRITE,
229};
230
231struct mddev {
232 void *private;
233 struct md_personality *pers;
234 dev_t unit;
235 int md_minor;
236 struct list_head disks;
237 unsigned long flags;
238#define MD_ARRAY_FIRST_USE 3
239#define MD_CLOSING 4
240
241#define MD_JOURNAL_CLEAN 5
242#define MD_HAS_JOURNAL 6
243#define MD_FAILFAST_SUPPORTED 7
244
245
246
247#define MD_NEED_REWRITE 8
248 unsigned long sb_flags;
249
250 int suspended;
251 atomic_t active_io;
252 int ro;
253 int sysfs_active;
254
255
256
257 struct gendisk *gendisk;
258
259 struct kobject kobj;
260 int hold_active;
261#define MD_HAS_PPL 9
262#define MD_HAS_MULTIPLE_PPLS 10
263#define MD_ALLOW_SB_UPDATE 11
264
265
266#define MD_UPDATING_SB 12
267
268
269#define UNTIL_IOCTL 1
270#define UNTIL_STOP 2
271
272
273 int major_version,
274 minor_version,
275 patch_version;
276 int persistent;
277 int external;
278
279 char metadata_type[17];
280 int chunk_sectors;
281 time_t ctime, utime;
282 int level, layout;
283 char clevel[16];
284 int raid_disks;
285 int max_disks;
286 sector_t dev_sectors;
287
288 sector_t array_sectors;
289 int external_size;
290
291 __u64 events;
292
293
294
295
296
297 int can_decrease_events;
298
299 char uuid[16];
300
301
302
303
304
305
306 sector_t reshape_position;
307 int delta_disks, new_level, new_layout;
308 int new_chunk_sectors;
309 int reshape_backwards;
310
311 struct md_thread *thread;
312 struct md_thread *sync_thread;
313
314
315
316
317
318
319
320 char *last_sync_action;
321 sector_t curr_resync;
322
323
324
325
326
327
328 sector_t curr_resync_completed;
329 unsigned long resync_mark;
330 sector_t resync_mark_cnt;
331 sector_t curr_mark_cnt;
332
333 sector_t resync_max_sectors;
334
335 atomic64_t resync_mismatches;
336
337
338
339
340 sector_t suspend_lo;
341 sector_t suspend_hi;
342
343 int sync_speed_min;
344 int sync_speed_max;
345
346
347 int parallel_resync;
348
349 int ok_start_degraded;
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364#define MD_RECOVERY_RUNNING 0
365#define MD_RECOVERY_SYNC 1
366#define MD_RECOVERY_RECOVER 2
367#define MD_RECOVERY_INTR 3
368#define MD_RECOVERY_DONE 4
369#define MD_RECOVERY_NEEDED 5
370#define MD_RECOVERY_REQUESTED 6
371#define MD_RECOVERY_CHECK 7
372#define MD_RECOVERY_RESHAPE 8
373#define MD_RECOVERY_FROZEN 9
374#define MD_RECOVERY_ERROR 10
375
376 unsigned long recovery;
377
378
379
380
381
382 int recovery_disabled;
383
384 int in_sync;
385
386
387
388
389
390
391
392
393
394 struct mutex open_mutex;
395 struct mutex reconfig_mutex;
396 atomic_t active;
397 atomic_t openers;
398
399 int changed;
400
401 int degraded;
402
403
404 int merge_check_needed;
405
406
407
408
409 atomic_t recovery_active;
410 wait_queue_head_t recovery_wait;
411 sector_t recovery_cp;
412 sector_t resync_min;
413
414 sector_t resync_max;
415
416
417 struct kernfs_node *sysfs_state;
418
419
420 struct kernfs_node *sysfs_action;
421
422 struct work_struct del_work;
423
424
425
426
427
428
429
430
431
432
433
434
435 spinlock_t lock;
436 wait_queue_head_t sb_wait;
437 atomic_t pending_writes;
438
439 unsigned int safemode;
440
441
442 unsigned int safemode_delay;
443 struct timer_list safemode_timer;
444 struct percpu_ref writes_pending;
445 int sync_checkers;
446 struct request_queue *queue;
447
448 struct bitmap *bitmap;
449 struct {
450 struct file *file;
451 loff_t offset;
452
453
454
455
456
457 unsigned long space;
458 loff_t default_offset;
459
460
461
462 unsigned long default_space;
463
464 struct mutex mutex;
465 unsigned long chunksize;
466 unsigned long daemon_sleep;
467 unsigned long max_write_behind;
468 int external;
469 } bitmap_info;
470
471 atomic_t max_corr_read_errors;
472 struct list_head all_mddevs;
473
474 struct attribute_group *to_remove;
475
476 struct bio_set *bio_set;
477
478
479
480
481
482 struct bio *flush_bio;
483 atomic_t flush_pending;
484 struct work_struct flush_work;
485 struct work_struct event_work;
486 void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
487};
488
489static inline int __must_check mddev_lock(struct mddev *mddev)
490{
491 return mutex_lock_interruptible(&mddev->reconfig_mutex);
492}
493
494
495
496
497static inline void mddev_lock_nointr(struct mddev *mddev)
498{
499 mutex_lock(&mddev->reconfig_mutex);
500}
501
502static inline int mddev_is_locked(struct mddev *mddev)
503{
504 return mutex_is_locked(&mddev->reconfig_mutex);
505}
506
507static inline int mddev_trylock(struct mddev *mddev)
508{
509 return mutex_trylock(&mddev->reconfig_mutex);
510}
511extern void mddev_unlock(struct mddev *mddev);
512
513static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors)
514{
515 atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
516}
517
518struct md_personality
519{
520 char *name;
521 int level;
522 struct list_head list;
523 struct module *owner;
524 bool (*make_request)(struct mddev *mddev, struct bio *bio);
525 int (*run)(struct mddev *mddev);
526 void (*free)(struct mddev *mddev, void *priv);
527 void (*status)(struct seq_file *seq, struct mddev *mddev);
528
529
530
531 void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev);
532 int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev);
533 int (*hot_remove_disk) (struct mddev *mddev, struct md_rdev *rdev);
534 int (*spare_active) (struct mddev *mddev);
535 sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped);
536 int (*resize) (struct mddev *mddev, sector_t sectors);
537 sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks);
538 int (*check_reshape) (struct mddev *mddev);
539 int (*start_reshape) (struct mddev *mddev);
540 void (*finish_reshape) (struct mddev *mddev);
541
542
543
544
545
546 void (*quiesce) (struct mddev *mddev, int state);
547
548
549
550
551
552
553
554
555
556 void *(*takeover) (struct mddev *mddev);
557
558
559 int (*congested)(struct mddev *mddev, int bits);
560
561 int (*mergeable_bvec)(struct mddev *mddev,
562 struct bvec_merge_data *bvm,
563 struct bio_vec *biovec);
564
565 int (*change_consistency_policy)(struct mddev *mddev, const char *buf);
566};
567
568struct md_sysfs_entry {
569 struct attribute attr;
570 ssize_t (*show)(struct mddev *, char *);
571 ssize_t (*store)(struct mddev *, const char *, size_t);
572};
573extern struct attribute_group md_bitmap_group;
574
575static inline struct kernfs_node *sysfs_get_dirent_safe(struct kernfs_node *sd, char *name)
576{
577 if (sd)
578 return sysfs_get_dirent(sd, name);
579 return sd;
580}
581static inline void sysfs_notify_dirent_safe(struct kernfs_node *sd)
582{
583 if (sd)
584 sysfs_notify_dirent(sd);
585}
586
587static inline char * mdname (struct mddev * mddev)
588{
589 return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
590}
591
592static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev)
593{
594 char nm[20];
595 if (!test_bit(Replacement, &rdev->flags) &&
596 !test_bit(Journal, &rdev->flags) &&
597 mddev->kobj.sd) {
598 sprintf(nm, "rd%d", rdev->raid_disk);
599 return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
600 } else
601 return 0;
602}
603
604static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
605{
606 char nm[20];
607 if (!test_bit(Replacement, &rdev->flags) &&
608 !test_bit(Journal, &rdev->flags) &&
609 mddev->kobj.sd) {
610 sprintf(nm, "rd%d", rdev->raid_disk);
611 sysfs_remove_link(&mddev->kobj, nm);
612 }
613}
614
615
616
617
618
619#define rdev_for_each_list(rdev, tmp, head) \
620 list_for_each_entry_safe(rdev, tmp, head, same_set)
621
622
623
624
625#define rdev_for_each(rdev, mddev) \
626 list_for_each_entry(rdev, &((mddev)->disks), same_set)
627
628#define rdev_for_each_safe(rdev, tmp, mddev) \
629 list_for_each_entry_safe(rdev, tmp, &((mddev)->disks), same_set)
630
631#define rdev_for_each_rcu(rdev, mddev) \
632 list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
633
634struct md_thread {
635 void (*run) (struct md_thread *thread);
636 struct mddev *mddev;
637 wait_queue_head_t wqueue;
638 unsigned long flags;
639 struct task_struct *tsk;
640 unsigned long timeout;
641 void *private;
642};
643
644#define THREAD_WAKEUP 0
645
646static inline void safe_put_page(struct page *p)
647{
648 if (p) put_page(p);
649}
650
651extern int register_md_personality(struct md_personality *p);
652extern int unregister_md_personality(struct md_personality *p);
653extern struct md_thread *md_register_thread(
654 void (*run)(struct md_thread *thread),
655 struct mddev *mddev,
656 const char *name);
657extern void md_unregister_thread(struct md_thread **threadp);
658extern void md_wakeup_thread(struct md_thread *thread);
659extern void md_check_recovery(struct mddev *mddev);
660extern void md_reap_sync_thread(struct mddev *mddev);
661extern int mddev_init_writes_pending(struct mddev *mddev);
662extern bool md_write_start(struct mddev *mddev, struct bio *bi);
663extern void md_write_inc(struct mddev *mddev, struct bio *bi);
664extern void md_write_end(struct mddev *mddev);
665extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
666extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
667extern void md_finish_reshape(struct mddev *mddev);
668
669extern int mddev_congested(struct mddev *mddev, int bits);
670extern void md_flush_request(struct mddev *mddev, struct bio *bio);
671extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
672 sector_t sector, int size, struct page *page);
673extern int md_super_wait(struct mddev *mddev);
674extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
675 struct page *page, int rw, bool metadata_op);
676extern void md_do_sync(struct md_thread *thread);
677extern void md_new_event(struct mddev *mddev);
678extern void md_allow_write(struct mddev *mddev);
679extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
680extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors);
681extern int md_check_no_bitmap(struct mddev *mddev);
682extern int md_integrity_register(struct mddev *mddev);
683extern int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev);
684extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
685
686extern void mddev_init(struct mddev *mddev);
687extern int md_run(struct mddev *mddev);
688extern void md_stop(struct mddev *mddev);
689extern void md_stop_writes(struct mddev *mddev);
690extern int md_rdev_init(struct md_rdev *rdev);
691extern void md_rdev_clear(struct md_rdev *rdev);
692
693extern void md_handle_request(struct mddev *mddev, struct bio *bio);
694extern void mddev_suspend(struct mddev *mddev);
695extern void mddev_resume(struct mddev *mddev);
696extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
697 struct mddev *mddev);
698extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
699 struct mddev *mddev);
700
701extern void md_unplug(struct blk_plug_cb *cb, bool from_schedule);
702struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr);
703extern void md_kick_rdev_from_array(struct md_rdev * rdev);
704extern void md_update_sb(struct mddev *mddev, int force);
705static inline int mddev_check_plugged(struct mddev *mddev)
706{
707 return !!blk_check_plugged(md_unplug, mddev,
708 sizeof(struct blk_plug_cb));
709}
710
711static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
712{
713 int faulty = test_bit(Faulty, &rdev->flags);
714 if (atomic_dec_and_test(&rdev->nr_pending) && faulty) {
715 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
716 md_wakeup_thread(mddev->thread);
717 }
718}
719
720
721static inline void mddev_clear_unsupported_flags(struct mddev *mddev,
722 unsigned long unsupported_flags)
723{
724 mddev->flags &= ~unsupported_flags;
725}
726#endif
727