aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-10-26 15:39:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-10-26 15:39:42 -0400
commitc3ae1f33569e06984f0426a7834ff63251d44d84 (patch)
tree0d7f6f6b49c331e440850cf2e8a7bc0cf220f8bc /drivers/md/md.h
parentc28cfd60e4ec3f494b73ef7d6c661f5f491cd84f (diff)
parentd890fa2b0586b6177b119643ff66932127d58afa (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.h153
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
29typedef struct mddev_s mddev_t;
30typedef 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 */
42struct mdk_rdev_s 39struct 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
169extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors, 165extern 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);
171static inline int is_badblock(mdk_rdev_t *rdev, sector_t s, int sectors, 167static 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}
184extern int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors, 180extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
185 int acknowledged); 181 int acknowledged);
186extern int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors); 182extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors);
187extern void md_ack_all_badblocks(struct badblocks *bb); 183extern void md_ack_all_badblocks(struct badblocks *bb);
188 184
189struct mddev_s 185struct 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
409static inline void rdev_dec_pending(mdk_rdev_t *rdev, mddev_t *mddev) 404static 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
421struct mdk_personality 416struct 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
463struct md_sysfs_entry { 458struct 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};
468extern struct attribute_group md_bitmap_group; 463extern 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
482static inline char * mdname (mddev_t * mddev) 477static 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
487static inline int sysfs_link_rdev(mddev_t *mddev, mdk_rdev_t *rdev) 482static 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
494static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev) 489static 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
517typedef struct mdk_thread_s { 512struct 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
559extern int register_md_personality(struct mdk_personality *p); 554extern int register_md_personality(struct md_personality *p);
560extern int unregister_md_personality(struct mdk_personality *p); 555extern int unregister_md_personality(struct md_personality *p);
561extern mdk_thread_t * md_register_thread(void (*run) (mddev_t *mddev), 556extern struct md_thread *md_register_thread(
562 mddev_t *mddev, const char *name); 557 void (*run)(struct mddev *mddev),
563extern void md_unregister_thread(mdk_thread_t **threadp); 558 struct mddev *mddev,
564extern void md_wakeup_thread(mdk_thread_t *thread); 559 const char *name);
565extern void md_check_recovery(mddev_t *mddev); 560extern void md_unregister_thread(struct md_thread **threadp);
566extern void md_write_start(mddev_t *mddev, struct bio *bi); 561extern void md_wakeup_thread(struct md_thread *thread);
567extern void md_write_end(mddev_t *mddev); 562extern void md_check_recovery(struct mddev *mddev);
568extern void md_done_sync(mddev_t *mddev, int blocks, int ok); 563extern void md_write_start(struct mddev *mddev, struct bio *bi);
569extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev); 564extern void md_write_end(struct mddev *mddev);
570 565extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
571extern int mddev_congested(mddev_t *mddev, int bits); 566extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
572extern void md_flush_request(mddev_t *mddev, struct bio *bio); 567
573extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, 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,
574 sector_t sector, int size, struct page *page); 571 sector_t sector, int size, struct page *page);
575extern void md_super_wait(mddev_t *mddev); 572extern void md_super_wait(struct mddev *mddev);
576extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, 573extern 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);
578extern void md_do_sync(mddev_t *mddev); 575extern void md_do_sync(struct mddev *mddev);
579extern void md_new_event(mddev_t *mddev); 576extern void md_new_event(struct mddev *mddev);
580extern int md_allow_write(mddev_t *mddev); 577extern int md_allow_write(struct mddev *mddev);
581extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev); 578extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
582extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors); 579extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors);
583extern int md_check_no_bitmap(mddev_t *mddev); 580extern int md_check_no_bitmap(struct mddev *mddev);
584extern int md_integrity_register(mddev_t *mddev); 581extern int md_integrity_register(struct mddev *mddev);
585extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev); 582extern void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev);
586extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale); 583extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
587extern void restore_bitmap_write_access(struct file *file); 584extern void restore_bitmap_write_access(struct file *file);
588 585
589extern void mddev_init(mddev_t *mddev); 586extern void mddev_init(struct mddev *mddev);
590extern int md_run(mddev_t *mddev); 587extern int md_run(struct mddev *mddev);
591extern void md_stop(mddev_t *mddev); 588extern void md_stop(struct mddev *mddev);
592extern void md_stop_writes(mddev_t *mddev); 589extern void md_stop_writes(struct mddev *mddev);
593extern int md_rdev_init(mdk_rdev_t *rdev); 590extern int md_rdev_init(struct md_rdev *rdev);
594 591
595extern void mddev_suspend(mddev_t *mddev); 592extern void mddev_suspend(struct mddev *mddev);
596extern void mddev_resume(mddev_t *mddev); 593extern void mddev_resume(struct mddev *mddev);
597extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask, 594extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
598 mddev_t *mddev); 595 struct mddev *mddev);
599extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, 596extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
600 mddev_t *mddev); 597 struct mddev *mddev);
601extern int mddev_check_plugged(mddev_t *mddev); 598extern int mddev_check_plugged(struct mddev *mddev);
602extern void md_trim_bio(struct bio *bio, int offset, int size); 599extern void md_trim_bio(struct bio *bio, int offset, int size);
603#endif /* _MD_MD_H */ 600#endif /* _MD_MD_H */