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