diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-26 15:39:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-26 15:39:42 -0400 |
commit | c3ae1f33569e06984f0426a7834ff63251d44d84 (patch) | |
tree | 0d7f6f6b49c331e440850cf2e8a7bc0cf220f8bc /drivers/md/md.h | |
parent | c28cfd60e4ec3f494b73ef7d6c661f5f491cd84f (diff) | |
parent | d890fa2b0586b6177b119643ff66932127d58afa (diff) |
Merge branch 'for-linus' of git://neil.brown.name/md
* 'for-linus' of git://neil.brown.name/md: (34 commits)
md: Fix some bugs in recovery_disabled handling.
md/raid5: fix bug that could result in reads from a failed device.
lib/raid6: Fix filename emitted in generated code
md.c: trivial comment fix
MD: Allow restarting an interrupted incremental recovery.
md: clear In_sync bit on devices added to an active array.
md: add proper write-congestion reporting to RAID1 and RAID10.
md: rename "mdk_personality" to "md_personality"
md/bitmap remove fault injection options.
md/raid5: typedef removal: raid5_conf_t -> struct r5conf
md/raid1: typedef removal: conf_t -> struct r1conf
md/raid10: typedef removal: conf_t -> struct r10conf
md/raid0: typedef removal: raid0_conf_t -> struct r0conf
md/multipath: typedef removal: multipath_conf_t -> struct mpconf
md/linear: typedef removal: linear_conf_t -> struct linear_conf
md/faulty: remove typedef: conf_t -> struct faulty_conf
md/linear: remove typedefs: dev_info_t -> struct dev_info
md: remove typedefs: mirror_info_t -> struct mirror_info
md: remove typedefs: r10bio_t -> struct r10bio and r1bio_t -> struct r1bio
md: remove typedefs: mdk_thread_t -> struct md_thread
...
Diffstat (limited to 'drivers/md/md.h')
-rw-r--r-- | drivers/md/md.h | 153 |
1 files changed, 75 insertions, 78 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h index 0a309dc29b45..51c1d91557e0 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | md_k.h : kernel internal structure of the Linux MD driver | 2 | md.h : kernel internal structure of the Linux MD driver |
3 | Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman | 3 | Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
@@ -26,9 +26,6 @@ | |||
26 | 26 | ||
27 | #define MaxSector (~(sector_t)0) | 27 | #define MaxSector (~(sector_t)0) |
28 | 28 | ||
29 | typedef struct mddev_s mddev_t; | ||
30 | typedef struct mdk_rdev_s mdk_rdev_t; | ||
31 | |||
32 | /* Bad block numbers are stored sorted in a single page. | 29 | /* Bad block numbers are stored sorted in a single page. |
33 | * 64bits is used for each block or extent. | 30 | * 64bits is used for each block or extent. |
34 | * 54 bits are sector number, 9 bits are extent size, | 31 | * 54 bits are sector number, 9 bits are extent size, |
@@ -39,12 +36,11 @@ typedef struct mdk_rdev_s mdk_rdev_t; | |||
39 | /* | 36 | /* |
40 | * MD's 'extended' device | 37 | * MD's 'extended' device |
41 | */ | 38 | */ |
42 | struct mdk_rdev_s | 39 | struct md_rdev { |
43 | { | ||
44 | struct list_head same_set; /* RAID devices within the same set */ | 40 | struct list_head same_set; /* RAID devices within the same set */ |
45 | 41 | ||
46 | sector_t sectors; /* Device size (in 512bytes sectors) */ | 42 | sector_t sectors; /* Device size (in 512bytes sectors) */ |
47 | mddev_t *mddev; /* RAID array if running */ | 43 | struct mddev *mddev; /* RAID array if running */ |
48 | int last_events; /* IO event timestamp */ | 44 | int last_events; /* IO event timestamp */ |
49 | 45 | ||
50 | /* | 46 | /* |
@@ -168,7 +164,7 @@ struct mdk_rdev_s | |||
168 | 164 | ||
169 | extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors, | 165 | extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors, |
170 | sector_t *first_bad, int *bad_sectors); | 166 | sector_t *first_bad, int *bad_sectors); |
171 | static inline int is_badblock(mdk_rdev_t *rdev, sector_t s, int sectors, | 167 | static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors, |
172 | sector_t *first_bad, int *bad_sectors) | 168 | sector_t *first_bad, int *bad_sectors) |
173 | { | 169 | { |
174 | if (unlikely(rdev->badblocks.count)) { | 170 | if (unlikely(rdev->badblocks.count)) { |
@@ -181,15 +177,14 @@ static inline int is_badblock(mdk_rdev_t *rdev, sector_t s, int sectors, | |||
181 | } | 177 | } |
182 | return 0; | 178 | return 0; |
183 | } | 179 | } |
184 | extern int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors, | 180 | extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors, |
185 | int acknowledged); | 181 | int acknowledged); |
186 | extern int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors); | 182 | extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors); |
187 | extern void md_ack_all_badblocks(struct badblocks *bb); | 183 | extern void md_ack_all_badblocks(struct badblocks *bb); |
188 | 184 | ||
189 | struct mddev_s | 185 | struct mddev { |
190 | { | ||
191 | void *private; | 186 | void *private; |
192 | struct mdk_personality *pers; | 187 | struct md_personality *pers; |
193 | dev_t unit; | 188 | dev_t unit; |
194 | int md_minor; | 189 | int md_minor; |
195 | struct list_head disks; | 190 | struct list_head disks; |
@@ -256,8 +251,8 @@ struct mddev_s | |||
256 | atomic_t plug_cnt; /* If device is expecting | 251 | atomic_t plug_cnt; /* If device is expecting |
257 | * more bios soon. | 252 | * more bios soon. |
258 | */ | 253 | */ |
259 | struct mdk_thread_s *thread; /* management thread */ | 254 | struct md_thread *thread; /* management thread */ |
260 | struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ | 255 | struct md_thread *sync_thread; /* doing resync or reconstruct */ |
261 | sector_t curr_resync; /* last block scheduled */ | 256 | sector_t curr_resync; /* last block scheduled */ |
262 | /* As resync requests can complete out of order, we cannot easily track | 257 | /* As resync requests can complete out of order, we cannot easily track |
263 | * how much resync has been completed. So we occasionally pause until | 258 | * how much resync has been completed. So we occasionally pause until |
@@ -402,11 +397,11 @@ struct mddev_s | |||
402 | atomic_t flush_pending; | 397 | atomic_t flush_pending; |
403 | struct work_struct flush_work; | 398 | struct work_struct flush_work; |
404 | struct work_struct event_work; /* used by dm to report failure event */ | 399 | struct work_struct event_work; /* used by dm to report failure event */ |
405 | void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev); | 400 | void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev); |
406 | }; | 401 | }; |
407 | 402 | ||
408 | 403 | ||
409 | static inline void rdev_dec_pending(mdk_rdev_t *rdev, mddev_t *mddev) | 404 | static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev) |
410 | { | 405 | { |
411 | int faulty = test_bit(Faulty, &rdev->flags); | 406 | int faulty = test_bit(Faulty, &rdev->flags); |
412 | if (atomic_dec_and_test(&rdev->nr_pending) && faulty) | 407 | if (atomic_dec_and_test(&rdev->nr_pending) && faulty) |
@@ -418,35 +413,35 @@ static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sect | |||
418 | atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io); | 413 | atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io); |
419 | } | 414 | } |
420 | 415 | ||
421 | struct mdk_personality | 416 | struct md_personality |
422 | { | 417 | { |
423 | char *name; | 418 | char *name; |
424 | int level; | 419 | int level; |
425 | struct list_head list; | 420 | struct list_head list; |
426 | struct module *owner; | 421 | struct module *owner; |
427 | int (*make_request)(mddev_t *mddev, struct bio *bio); | 422 | int (*make_request)(struct mddev *mddev, struct bio *bio); |
428 | int (*run)(mddev_t *mddev); | 423 | int (*run)(struct mddev *mddev); |
429 | int (*stop)(mddev_t *mddev); | 424 | int (*stop)(struct mddev *mddev); |
430 | void (*status)(struct seq_file *seq, mddev_t *mddev); | 425 | void (*status)(struct seq_file *seq, struct mddev *mddev); |
431 | /* error_handler must set ->faulty and clear ->in_sync | 426 | /* error_handler must set ->faulty and clear ->in_sync |
432 | * if appropriate, and should abort recovery if needed | 427 | * if appropriate, and should abort recovery if needed |
433 | */ | 428 | */ |
434 | void (*error_handler)(mddev_t *mddev, mdk_rdev_t *rdev); | 429 | void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev); |
435 | int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev); | 430 | int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev); |
436 | int (*hot_remove_disk) (mddev_t *mddev, int number); | 431 | int (*hot_remove_disk) (struct mddev *mddev, int number); |
437 | int (*spare_active) (mddev_t *mddev); | 432 | int (*spare_active) (struct mddev *mddev); |
438 | sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster); | 433 | sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster); |
439 | int (*resize) (mddev_t *mddev, sector_t sectors); | 434 | int (*resize) (struct mddev *mddev, sector_t sectors); |
440 | sector_t (*size) (mddev_t *mddev, sector_t sectors, int raid_disks); | 435 | sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks); |
441 | int (*check_reshape) (mddev_t *mddev); | 436 | int (*check_reshape) (struct mddev *mddev); |
442 | int (*start_reshape) (mddev_t *mddev); | 437 | int (*start_reshape) (struct mddev *mddev); |
443 | void (*finish_reshape) (mddev_t *mddev); | 438 | void (*finish_reshape) (struct mddev *mddev); |
444 | /* quiesce moves between quiescence states | 439 | /* quiesce moves between quiescence states |
445 | * 0 - fully active | 440 | * 0 - fully active |
446 | * 1 - no new requests allowed | 441 | * 1 - no new requests allowed |
447 | * others - reserved | 442 | * others - reserved |
448 | */ | 443 | */ |
449 | void (*quiesce) (mddev_t *mddev, int state); | 444 | void (*quiesce) (struct mddev *mddev, int state); |
450 | /* takeover is used to transition an array from one | 445 | /* takeover is used to transition an array from one |
451 | * personality to another. The new personality must be able | 446 | * personality to another. The new personality must be able |
452 | * to handle the data in the current layout. | 447 | * to handle the data in the current layout. |
@@ -456,14 +451,14 @@ struct mdk_personality | |||
456 | * This needs to be installed and then ->run used to activate the | 451 | * This needs to be installed and then ->run used to activate the |
457 | * array. | 452 | * array. |
458 | */ | 453 | */ |
459 | void *(*takeover) (mddev_t *mddev); | 454 | void *(*takeover) (struct mddev *mddev); |
460 | }; | 455 | }; |
461 | 456 | ||
462 | 457 | ||
463 | struct md_sysfs_entry { | 458 | struct md_sysfs_entry { |
464 | struct attribute attr; | 459 | struct attribute attr; |
465 | ssize_t (*show)(mddev_t *, char *); | 460 | ssize_t (*show)(struct mddev *, char *); |
466 | ssize_t (*store)(mddev_t *, const char *, size_t); | 461 | ssize_t (*store)(struct mddev *, const char *, size_t); |
467 | }; | 462 | }; |
468 | extern struct attribute_group md_bitmap_group; | 463 | extern struct attribute_group md_bitmap_group; |
469 | 464 | ||
@@ -479,19 +474,19 @@ static inline void sysfs_notify_dirent_safe(struct sysfs_dirent *sd) | |||
479 | sysfs_notify_dirent(sd); | 474 | sysfs_notify_dirent(sd); |
480 | } | 475 | } |
481 | 476 | ||
482 | static inline char * mdname (mddev_t * mddev) | 477 | static inline char * mdname (struct mddev * mddev) |
483 | { | 478 | { |
484 | return mddev->gendisk ? mddev->gendisk->disk_name : "mdX"; | 479 | return mddev->gendisk ? mddev->gendisk->disk_name : "mdX"; |
485 | } | 480 | } |
486 | 481 | ||
487 | static inline int sysfs_link_rdev(mddev_t *mddev, mdk_rdev_t *rdev) | 482 | static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev) |
488 | { | 483 | { |
489 | char nm[20]; | 484 | char nm[20]; |
490 | sprintf(nm, "rd%d", rdev->raid_disk); | 485 | sprintf(nm, "rd%d", rdev->raid_disk); |
491 | return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); | 486 | return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); |
492 | } | 487 | } |
493 | 488 | ||
494 | static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev) | 489 | static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev) |
495 | { | 490 | { |
496 | char nm[20]; | 491 | char nm[20]; |
497 | sprintf(nm, "rd%d", rdev->raid_disk); | 492 | sprintf(nm, "rd%d", rdev->raid_disk); |
@@ -514,14 +509,14 @@ static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev) | |||
514 | #define rdev_for_each_rcu(rdev, mddev) \ | 509 | #define rdev_for_each_rcu(rdev, mddev) \ |
515 | list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set) | 510 | list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set) |
516 | 511 | ||
517 | typedef struct mdk_thread_s { | 512 | struct md_thread { |
518 | void (*run) (mddev_t *mddev); | 513 | void (*run) (struct mddev *mddev); |
519 | mddev_t *mddev; | 514 | struct mddev *mddev; |
520 | wait_queue_head_t wqueue; | 515 | wait_queue_head_t wqueue; |
521 | unsigned long flags; | 516 | unsigned long flags; |
522 | struct task_struct *tsk; | 517 | struct task_struct *tsk; |
523 | unsigned long timeout; | 518 | unsigned long timeout; |
524 | } mdk_thread_t; | 519 | }; |
525 | 520 | ||
526 | #define THREAD_WAKEUP 0 | 521 | #define THREAD_WAKEUP 0 |
527 | 522 | ||
@@ -556,48 +551,50 @@ static inline void safe_put_page(struct page *p) | |||
556 | if (p) put_page(p); | 551 | if (p) put_page(p); |
557 | } | 552 | } |
558 | 553 | ||
559 | extern int register_md_personality(struct mdk_personality *p); | 554 | extern int register_md_personality(struct md_personality *p); |
560 | extern int unregister_md_personality(struct mdk_personality *p); | 555 | extern int unregister_md_personality(struct md_personality *p); |
561 | extern mdk_thread_t * md_register_thread(void (*run) (mddev_t *mddev), | 556 | extern struct md_thread *md_register_thread( |
562 | mddev_t *mddev, const char *name); | 557 | void (*run)(struct mddev *mddev), |
563 | extern void md_unregister_thread(mdk_thread_t **threadp); | 558 | struct mddev *mddev, |
564 | extern void md_wakeup_thread(mdk_thread_t *thread); | 559 | const char *name); |
565 | extern void md_check_recovery(mddev_t *mddev); | 560 | extern void md_unregister_thread(struct md_thread **threadp); |
566 | extern void md_write_start(mddev_t *mddev, struct bio *bi); | 561 | extern void md_wakeup_thread(struct md_thread *thread); |
567 | extern void md_write_end(mddev_t *mddev); | 562 | extern void md_check_recovery(struct mddev *mddev); |
568 | extern void md_done_sync(mddev_t *mddev, int blocks, int ok); | 563 | extern void md_write_start(struct mddev *mddev, struct bio *bi); |
569 | extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev); | 564 | extern void md_write_end(struct mddev *mddev); |
570 | 565 | extern void md_done_sync(struct mddev *mddev, int blocks, int ok); | |
571 | extern int mddev_congested(mddev_t *mddev, int bits); | 566 | extern void md_error(struct mddev *mddev, struct md_rdev *rdev); |
572 | extern void md_flush_request(mddev_t *mddev, struct bio *bio); | 567 | |
573 | extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | 568 | extern int mddev_congested(struct mddev *mddev, int bits); |
569 | extern void md_flush_request(struct mddev *mddev, struct bio *bio); | ||
570 | extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, | ||
574 | sector_t sector, int size, struct page *page); | 571 | sector_t sector, int size, struct page *page); |
575 | extern void md_super_wait(mddev_t *mddev); | 572 | extern void md_super_wait(struct mddev *mddev); |
576 | extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, | 573 | extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, |
577 | struct page *page, int rw, bool metadata_op); | 574 | struct page *page, int rw, bool metadata_op); |
578 | extern void md_do_sync(mddev_t *mddev); | 575 | extern void md_do_sync(struct mddev *mddev); |
579 | extern void md_new_event(mddev_t *mddev); | 576 | extern void md_new_event(struct mddev *mddev); |
580 | extern int md_allow_write(mddev_t *mddev); | 577 | extern int md_allow_write(struct mddev *mddev); |
581 | extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev); | 578 | extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev); |
582 | extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors); | 579 | extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors); |
583 | extern int md_check_no_bitmap(mddev_t *mddev); | 580 | extern int md_check_no_bitmap(struct mddev *mddev); |
584 | extern int md_integrity_register(mddev_t *mddev); | 581 | extern int md_integrity_register(struct mddev *mddev); |
585 | extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev); | 582 | extern void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev); |
586 | extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale); | 583 | extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale); |
587 | extern void restore_bitmap_write_access(struct file *file); | 584 | extern void restore_bitmap_write_access(struct file *file); |
588 | 585 | ||
589 | extern void mddev_init(mddev_t *mddev); | 586 | extern void mddev_init(struct mddev *mddev); |
590 | extern int md_run(mddev_t *mddev); | 587 | extern int md_run(struct mddev *mddev); |
591 | extern void md_stop(mddev_t *mddev); | 588 | extern void md_stop(struct mddev *mddev); |
592 | extern void md_stop_writes(mddev_t *mddev); | 589 | extern void md_stop_writes(struct mddev *mddev); |
593 | extern int md_rdev_init(mdk_rdev_t *rdev); | 590 | extern int md_rdev_init(struct md_rdev *rdev); |
594 | 591 | ||
595 | extern void mddev_suspend(mddev_t *mddev); | 592 | extern void mddev_suspend(struct mddev *mddev); |
596 | extern void mddev_resume(mddev_t *mddev); | 593 | extern void mddev_resume(struct mddev *mddev); |
597 | extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask, | 594 | extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask, |
598 | mddev_t *mddev); | 595 | struct mddev *mddev); |
599 | extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, | 596 | extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, |
600 | mddev_t *mddev); | 597 | struct mddev *mddev); |
601 | extern int mddev_check_plugged(mddev_t *mddev); | 598 | extern int mddev_check_plugged(struct mddev *mddev); |
602 | extern void md_trim_bio(struct bio *bio, int offset, int size); | 599 | extern void md_trim_bio(struct bio *bio, int offset, int size); |
603 | #endif /* _MD_MD_H */ | 600 | #endif /* _MD_MD_H */ |