diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 686 |
1 files changed, 363 insertions, 323 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 8e221a20f5d9..84acfe7d10e4 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/hdreg.h> | 44 | #include <linux/hdreg.h> |
45 | #include <linux/proc_fs.h> | 45 | #include <linux/proc_fs.h> |
46 | #include <linux/random.h> | 46 | #include <linux/random.h> |
47 | #include <linux/module.h> | ||
47 | #include <linux/reboot.h> | 48 | #include <linux/reboot.h> |
48 | #include <linux/file.h> | 49 | #include <linux/file.h> |
49 | #include <linux/compat.h> | 50 | #include <linux/compat.h> |
@@ -54,13 +55,15 @@ | |||
54 | #include "md.h" | 55 | #include "md.h" |
55 | #include "bitmap.h" | 56 | #include "bitmap.h" |
56 | 57 | ||
57 | #define DEBUG 0 | ||
58 | #define dprintk(x...) ((void)(DEBUG && printk(x))) | ||
59 | |||
60 | #ifndef MODULE | 58 | #ifndef MODULE |
61 | static void autostart_arrays(int part); | 59 | static void autostart_arrays(int part); |
62 | #endif | 60 | #endif |
63 | 61 | ||
62 | /* pers_list is a list of registered personalities protected | ||
63 | * by pers_lock. | ||
64 | * pers_lock does extra service to protect accesses to | ||
65 | * mddev->thread when the mutex cannot be held. | ||
66 | */ | ||
64 | static LIST_HEAD(pers_list); | 67 | static LIST_HEAD(pers_list); |
65 | static DEFINE_SPINLOCK(pers_lock); | 68 | static DEFINE_SPINLOCK(pers_lock); |
66 | 69 | ||
@@ -93,13 +96,13 @@ static struct workqueue_struct *md_misc_wq; | |||
93 | 96 | ||
94 | static int sysctl_speed_limit_min = 1000; | 97 | static int sysctl_speed_limit_min = 1000; |
95 | static int sysctl_speed_limit_max = 200000; | 98 | static int sysctl_speed_limit_max = 200000; |
96 | static inline int speed_min(mddev_t *mddev) | 99 | static inline int speed_min(struct mddev *mddev) |
97 | { | 100 | { |
98 | return mddev->sync_speed_min ? | 101 | return mddev->sync_speed_min ? |
99 | mddev->sync_speed_min : sysctl_speed_limit_min; | 102 | mddev->sync_speed_min : sysctl_speed_limit_min; |
100 | } | 103 | } |
101 | 104 | ||
102 | static inline int speed_max(mddev_t *mddev) | 105 | static inline int speed_max(struct mddev *mddev) |
103 | { | 106 | { |
104 | return mddev->sync_speed_max ? | 107 | return mddev->sync_speed_max ? |
105 | mddev->sync_speed_max : sysctl_speed_limit_max; | 108 | mddev->sync_speed_max : sysctl_speed_limit_max; |
@@ -155,7 +158,7 @@ static int start_readonly; | |||
155 | 158 | ||
156 | static void mddev_bio_destructor(struct bio *bio) | 159 | static void mddev_bio_destructor(struct bio *bio) |
157 | { | 160 | { |
158 | mddev_t *mddev, **mddevp; | 161 | struct mddev *mddev, **mddevp; |
159 | 162 | ||
160 | mddevp = (void*)bio; | 163 | mddevp = (void*)bio; |
161 | mddev = mddevp[-1]; | 164 | mddev = mddevp[-1]; |
@@ -164,10 +167,10 @@ static void mddev_bio_destructor(struct bio *bio) | |||
164 | } | 167 | } |
165 | 168 | ||
166 | struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, | 169 | struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, |
167 | mddev_t *mddev) | 170 | struct mddev *mddev) |
168 | { | 171 | { |
169 | struct bio *b; | 172 | struct bio *b; |
170 | mddev_t **mddevp; | 173 | struct mddev **mddevp; |
171 | 174 | ||
172 | if (!mddev || !mddev->bio_set) | 175 | if (!mddev || !mddev->bio_set) |
173 | return bio_alloc(gfp_mask, nr_iovecs); | 176 | return bio_alloc(gfp_mask, nr_iovecs); |
@@ -184,10 +187,10 @@ struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, | |||
184 | EXPORT_SYMBOL_GPL(bio_alloc_mddev); | 187 | EXPORT_SYMBOL_GPL(bio_alloc_mddev); |
185 | 188 | ||
186 | struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask, | 189 | struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask, |
187 | mddev_t *mddev) | 190 | struct mddev *mddev) |
188 | { | 191 | { |
189 | struct bio *b; | 192 | struct bio *b; |
190 | mddev_t **mddevp; | 193 | struct mddev **mddevp; |
191 | 194 | ||
192 | if (!mddev || !mddev->bio_set) | 195 | if (!mddev || !mddev->bio_set) |
193 | return bio_clone(bio, gfp_mask); | 196 | return bio_clone(bio, gfp_mask); |
@@ -276,7 +279,7 @@ EXPORT_SYMBOL_GPL(md_trim_bio); | |||
276 | */ | 279 | */ |
277 | static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters); | 280 | static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters); |
278 | static atomic_t md_event_count; | 281 | static atomic_t md_event_count; |
279 | void md_new_event(mddev_t *mddev) | 282 | void md_new_event(struct mddev *mddev) |
280 | { | 283 | { |
281 | atomic_inc(&md_event_count); | 284 | atomic_inc(&md_event_count); |
282 | wake_up(&md_event_waiters); | 285 | wake_up(&md_event_waiters); |
@@ -286,7 +289,7 @@ EXPORT_SYMBOL_GPL(md_new_event); | |||
286 | /* Alternate version that can be called from interrupts | 289 | /* Alternate version that can be called from interrupts |
287 | * when calling sysfs_notify isn't needed. | 290 | * when calling sysfs_notify isn't needed. |
288 | */ | 291 | */ |
289 | static void md_new_event_inintr(mddev_t *mddev) | 292 | static void md_new_event_inintr(struct mddev *mddev) |
290 | { | 293 | { |
291 | atomic_inc(&md_event_count); | 294 | atomic_inc(&md_event_count); |
292 | wake_up(&md_event_waiters); | 295 | wake_up(&md_event_waiters); |
@@ -307,19 +310,19 @@ static DEFINE_SPINLOCK(all_mddevs_lock); | |||
307 | * Any code which breaks out of this loop while own | 310 | * Any code which breaks out of this loop while own |
308 | * a reference to the current mddev and must mddev_put it. | 311 | * a reference to the current mddev and must mddev_put it. |
309 | */ | 312 | */ |
310 | #define for_each_mddev(mddev,tmp) \ | 313 | #define for_each_mddev(_mddev,_tmp) \ |
311 | \ | 314 | \ |
312 | for (({ spin_lock(&all_mddevs_lock); \ | 315 | for (({ spin_lock(&all_mddevs_lock); \ |
313 | tmp = all_mddevs.next; \ | 316 | _tmp = all_mddevs.next; \ |
314 | mddev = NULL;}); \ | 317 | _mddev = NULL;}); \ |
315 | ({ if (tmp != &all_mddevs) \ | 318 | ({ if (_tmp != &all_mddevs) \ |
316 | mddev_get(list_entry(tmp, mddev_t, all_mddevs));\ | 319 | mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\ |
317 | spin_unlock(&all_mddevs_lock); \ | 320 | spin_unlock(&all_mddevs_lock); \ |
318 | if (mddev) mddev_put(mddev); \ | 321 | if (_mddev) mddev_put(_mddev); \ |
319 | mddev = list_entry(tmp, mddev_t, all_mddevs); \ | 322 | _mddev = list_entry(_tmp, struct mddev, all_mddevs); \ |
320 | tmp != &all_mddevs;}); \ | 323 | _tmp != &all_mddevs;}); \ |
321 | ({ spin_lock(&all_mddevs_lock); \ | 324 | ({ spin_lock(&all_mddevs_lock); \ |
322 | tmp = tmp->next;}) \ | 325 | _tmp = _tmp->next;}) \ |
323 | ) | 326 | ) |
324 | 327 | ||
325 | 328 | ||
@@ -330,18 +333,17 @@ static DEFINE_SPINLOCK(all_mddevs_lock); | |||
330 | * call has finished, the bio has been linked into some internal structure | 333 | * call has finished, the bio has been linked into some internal structure |
331 | * and so is visible to ->quiesce(), so we don't need the refcount any more. | 334 | * and so is visible to ->quiesce(), so we don't need the refcount any more. |
332 | */ | 335 | */ |
333 | static int md_make_request(struct request_queue *q, struct bio *bio) | 336 | static void md_make_request(struct request_queue *q, struct bio *bio) |
334 | { | 337 | { |
335 | const int rw = bio_data_dir(bio); | 338 | const int rw = bio_data_dir(bio); |
336 | mddev_t *mddev = q->queuedata; | 339 | struct mddev *mddev = q->queuedata; |
337 | int rv; | ||
338 | int cpu; | 340 | int cpu; |
339 | unsigned int sectors; | 341 | unsigned int sectors; |
340 | 342 | ||
341 | if (mddev == NULL || mddev->pers == NULL | 343 | if (mddev == NULL || mddev->pers == NULL |
342 | || !mddev->ready) { | 344 | || !mddev->ready) { |
343 | bio_io_error(bio); | 345 | bio_io_error(bio); |
344 | return 0; | 346 | return; |
345 | } | 347 | } |
346 | smp_rmb(); /* Ensure implications of 'active' are visible */ | 348 | smp_rmb(); /* Ensure implications of 'active' are visible */ |
347 | rcu_read_lock(); | 349 | rcu_read_lock(); |
@@ -366,7 +368,7 @@ static int md_make_request(struct request_queue *q, struct bio *bio) | |||
366 | * go away inside make_request | 368 | * go away inside make_request |
367 | */ | 369 | */ |
368 | sectors = bio_sectors(bio); | 370 | sectors = bio_sectors(bio); |
369 | rv = mddev->pers->make_request(mddev, bio); | 371 | mddev->pers->make_request(mddev, bio); |
370 | 372 | ||
371 | cpu = part_stat_lock(); | 373 | cpu = part_stat_lock(); |
372 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | 374 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); |
@@ -375,8 +377,6 @@ static int md_make_request(struct request_queue *q, struct bio *bio) | |||
375 | 377 | ||
376 | if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) | 378 | if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) |
377 | wake_up(&mddev->sb_wait); | 379 | wake_up(&mddev->sb_wait); |
378 | |||
379 | return rv; | ||
380 | } | 380 | } |
381 | 381 | ||
382 | /* mddev_suspend makes sure no new requests are submitted | 382 | /* mddev_suspend makes sure no new requests are submitted |
@@ -385,7 +385,7 @@ static int md_make_request(struct request_queue *q, struct bio *bio) | |||
385 | * Once ->stop is called and completes, the module will be completely | 385 | * Once ->stop is called and completes, the module will be completely |
386 | * unused. | 386 | * unused. |
387 | */ | 387 | */ |
388 | void mddev_suspend(mddev_t *mddev) | 388 | void mddev_suspend(struct mddev *mddev) |
389 | { | 389 | { |
390 | BUG_ON(mddev->suspended); | 390 | BUG_ON(mddev->suspended); |
391 | mddev->suspended = 1; | 391 | mddev->suspended = 1; |
@@ -395,7 +395,7 @@ void mddev_suspend(mddev_t *mddev) | |||
395 | } | 395 | } |
396 | EXPORT_SYMBOL_GPL(mddev_suspend); | 396 | EXPORT_SYMBOL_GPL(mddev_suspend); |
397 | 397 | ||
398 | void mddev_resume(mddev_t *mddev) | 398 | void mddev_resume(struct mddev *mddev) |
399 | { | 399 | { |
400 | mddev->suspended = 0; | 400 | mddev->suspended = 0; |
401 | wake_up(&mddev->sb_wait); | 401 | wake_up(&mddev->sb_wait); |
@@ -406,7 +406,7 @@ void mddev_resume(mddev_t *mddev) | |||
406 | } | 406 | } |
407 | EXPORT_SYMBOL_GPL(mddev_resume); | 407 | EXPORT_SYMBOL_GPL(mddev_resume); |
408 | 408 | ||
409 | int mddev_congested(mddev_t *mddev, int bits) | 409 | int mddev_congested(struct mddev *mddev, int bits) |
410 | { | 410 | { |
411 | return mddev->suspended; | 411 | return mddev->suspended; |
412 | } | 412 | } |
@@ -418,8 +418,8 @@ EXPORT_SYMBOL(mddev_congested); | |||
418 | 418 | ||
419 | static void md_end_flush(struct bio *bio, int err) | 419 | static void md_end_flush(struct bio *bio, int err) |
420 | { | 420 | { |
421 | mdk_rdev_t *rdev = bio->bi_private; | 421 | struct md_rdev *rdev = bio->bi_private; |
422 | mddev_t *mddev = rdev->mddev; | 422 | struct mddev *mddev = rdev->mddev; |
423 | 423 | ||
424 | rdev_dec_pending(rdev, mddev); | 424 | rdev_dec_pending(rdev, mddev); |
425 | 425 | ||
@@ -434,8 +434,8 @@ static void md_submit_flush_data(struct work_struct *ws); | |||
434 | 434 | ||
435 | static void submit_flushes(struct work_struct *ws) | 435 | static void submit_flushes(struct work_struct *ws) |
436 | { | 436 | { |
437 | mddev_t *mddev = container_of(ws, mddev_t, flush_work); | 437 | struct mddev *mddev = container_of(ws, struct mddev, flush_work); |
438 | mdk_rdev_t *rdev; | 438 | struct md_rdev *rdev; |
439 | 439 | ||
440 | INIT_WORK(&mddev->flush_work, md_submit_flush_data); | 440 | INIT_WORK(&mddev->flush_work, md_submit_flush_data); |
441 | atomic_set(&mddev->flush_pending, 1); | 441 | atomic_set(&mddev->flush_pending, 1); |
@@ -467,7 +467,7 @@ static void submit_flushes(struct work_struct *ws) | |||
467 | 467 | ||
468 | static void md_submit_flush_data(struct work_struct *ws) | 468 | static void md_submit_flush_data(struct work_struct *ws) |
469 | { | 469 | { |
470 | mddev_t *mddev = container_of(ws, mddev_t, flush_work); | 470 | struct mddev *mddev = container_of(ws, struct mddev, flush_work); |
471 | struct bio *bio = mddev->flush_bio; | 471 | struct bio *bio = mddev->flush_bio; |
472 | 472 | ||
473 | if (bio->bi_size == 0) | 473 | if (bio->bi_size == 0) |
@@ -475,15 +475,14 @@ static void md_submit_flush_data(struct work_struct *ws) | |||
475 | bio_endio(bio, 0); | 475 | bio_endio(bio, 0); |
476 | else { | 476 | else { |
477 | bio->bi_rw &= ~REQ_FLUSH; | 477 | bio->bi_rw &= ~REQ_FLUSH; |
478 | if (mddev->pers->make_request(mddev, bio)) | 478 | mddev->pers->make_request(mddev, bio); |
479 | generic_make_request(bio); | ||
480 | } | 479 | } |
481 | 480 | ||
482 | mddev->flush_bio = NULL; | 481 | mddev->flush_bio = NULL; |
483 | wake_up(&mddev->sb_wait); | 482 | wake_up(&mddev->sb_wait); |
484 | } | 483 | } |
485 | 484 | ||
486 | void md_flush_request(mddev_t *mddev, struct bio *bio) | 485 | void md_flush_request(struct mddev *mddev, struct bio *bio) |
487 | { | 486 | { |
488 | spin_lock_irq(&mddev->write_lock); | 487 | spin_lock_irq(&mddev->write_lock); |
489 | wait_event_lock_irq(mddev->sb_wait, | 488 | wait_event_lock_irq(mddev->sb_wait, |
@@ -507,7 +506,7 @@ EXPORT_SYMBOL(md_flush_request); | |||
507 | */ | 506 | */ |
508 | struct md_plug_cb { | 507 | struct md_plug_cb { |
509 | struct blk_plug_cb cb; | 508 | struct blk_plug_cb cb; |
510 | mddev_t *mddev; | 509 | struct mddev *mddev; |
511 | }; | 510 | }; |
512 | 511 | ||
513 | static void plugger_unplug(struct blk_plug_cb *cb) | 512 | static void plugger_unplug(struct blk_plug_cb *cb) |
@@ -521,7 +520,7 @@ static void plugger_unplug(struct blk_plug_cb *cb) | |||
521 | /* Check that an unplug wakeup will come shortly. | 520 | /* Check that an unplug wakeup will come shortly. |
522 | * If not, wakeup the md thread immediately | 521 | * If not, wakeup the md thread immediately |
523 | */ | 522 | */ |
524 | int mddev_check_plugged(mddev_t *mddev) | 523 | int mddev_check_plugged(struct mddev *mddev) |
525 | { | 524 | { |
526 | struct blk_plug *plug = current->plug; | 525 | struct blk_plug *plug = current->plug; |
527 | struct md_plug_cb *mdcb; | 526 | struct md_plug_cb *mdcb; |
@@ -553,7 +552,7 @@ int mddev_check_plugged(mddev_t *mddev) | |||
553 | } | 552 | } |
554 | EXPORT_SYMBOL_GPL(mddev_check_plugged); | 553 | EXPORT_SYMBOL_GPL(mddev_check_plugged); |
555 | 554 | ||
556 | static inline mddev_t *mddev_get(mddev_t *mddev) | 555 | static inline struct mddev *mddev_get(struct mddev *mddev) |
557 | { | 556 | { |
558 | atomic_inc(&mddev->active); | 557 | atomic_inc(&mddev->active); |
559 | return mddev; | 558 | return mddev; |
@@ -561,7 +560,7 @@ static inline mddev_t *mddev_get(mddev_t *mddev) | |||
561 | 560 | ||
562 | static void mddev_delayed_delete(struct work_struct *ws); | 561 | static void mddev_delayed_delete(struct work_struct *ws); |
563 | 562 | ||
564 | static void mddev_put(mddev_t *mddev) | 563 | static void mddev_put(struct mddev *mddev) |
565 | { | 564 | { |
566 | struct bio_set *bs = NULL; | 565 | struct bio_set *bs = NULL; |
567 | 566 | ||
@@ -590,7 +589,7 @@ static void mddev_put(mddev_t *mddev) | |||
590 | bioset_free(bs); | 589 | bioset_free(bs); |
591 | } | 590 | } |
592 | 591 | ||
593 | void mddev_init(mddev_t *mddev) | 592 | void mddev_init(struct mddev *mddev) |
594 | { | 593 | { |
595 | mutex_init(&mddev->open_mutex); | 594 | mutex_init(&mddev->open_mutex); |
596 | mutex_init(&mddev->reconfig_mutex); | 595 | mutex_init(&mddev->reconfig_mutex); |
@@ -613,9 +612,9 @@ void mddev_init(mddev_t *mddev) | |||
613 | } | 612 | } |
614 | EXPORT_SYMBOL_GPL(mddev_init); | 613 | EXPORT_SYMBOL_GPL(mddev_init); |
615 | 614 | ||
616 | static mddev_t * mddev_find(dev_t unit) | 615 | static struct mddev * mddev_find(dev_t unit) |
617 | { | 616 | { |
618 | mddev_t *mddev, *new = NULL; | 617 | struct mddev *mddev, *new = NULL; |
619 | 618 | ||
620 | if (unit && MAJOR(unit) != MD_MAJOR) | 619 | if (unit && MAJOR(unit) != MD_MAJOR) |
621 | unit &= ~((1<<MdpMinorShift)-1); | 620 | unit &= ~((1<<MdpMinorShift)-1); |
@@ -687,24 +686,24 @@ static mddev_t * mddev_find(dev_t unit) | |||
687 | goto retry; | 686 | goto retry; |
688 | } | 687 | } |
689 | 688 | ||
690 | static inline int mddev_lock(mddev_t * mddev) | 689 | static inline int mddev_lock(struct mddev * mddev) |
691 | { | 690 | { |
692 | return mutex_lock_interruptible(&mddev->reconfig_mutex); | 691 | return mutex_lock_interruptible(&mddev->reconfig_mutex); |
693 | } | 692 | } |
694 | 693 | ||
695 | static inline int mddev_is_locked(mddev_t *mddev) | 694 | static inline int mddev_is_locked(struct mddev *mddev) |
696 | { | 695 | { |
697 | return mutex_is_locked(&mddev->reconfig_mutex); | 696 | return mutex_is_locked(&mddev->reconfig_mutex); |
698 | } | 697 | } |
699 | 698 | ||
700 | static inline int mddev_trylock(mddev_t * mddev) | 699 | static inline int mddev_trylock(struct mddev * mddev) |
701 | { | 700 | { |
702 | return mutex_trylock(&mddev->reconfig_mutex); | 701 | return mutex_trylock(&mddev->reconfig_mutex); |
703 | } | 702 | } |
704 | 703 | ||
705 | static struct attribute_group md_redundancy_group; | 704 | static struct attribute_group md_redundancy_group; |
706 | 705 | ||
707 | static void mddev_unlock(mddev_t * mddev) | 706 | static void mddev_unlock(struct mddev * mddev) |
708 | { | 707 | { |
709 | if (mddev->to_remove) { | 708 | if (mddev->to_remove) { |
710 | /* These cannot be removed under reconfig_mutex as | 709 | /* These cannot be removed under reconfig_mutex as |
@@ -739,12 +738,17 @@ static void mddev_unlock(mddev_t * mddev) | |||
739 | } else | 738 | } else |
740 | mutex_unlock(&mddev->reconfig_mutex); | 739 | mutex_unlock(&mddev->reconfig_mutex); |
741 | 740 | ||
741 | /* As we've dropped the mutex we need a spinlock to | ||
742 | * make sure the thread doesn't disappear | ||
743 | */ | ||
744 | spin_lock(&pers_lock); | ||
742 | md_wakeup_thread(mddev->thread); | 745 | md_wakeup_thread(mddev->thread); |
746 | spin_unlock(&pers_lock); | ||
743 | } | 747 | } |
744 | 748 | ||
745 | static mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr) | 749 | static struct md_rdev * find_rdev_nr(struct mddev *mddev, int nr) |
746 | { | 750 | { |
747 | mdk_rdev_t *rdev; | 751 | struct md_rdev *rdev; |
748 | 752 | ||
749 | list_for_each_entry(rdev, &mddev->disks, same_set) | 753 | list_for_each_entry(rdev, &mddev->disks, same_set) |
750 | if (rdev->desc_nr == nr) | 754 | if (rdev->desc_nr == nr) |
@@ -753,9 +757,9 @@ static mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr) | |||
753 | return NULL; | 757 | return NULL; |
754 | } | 758 | } |
755 | 759 | ||
756 | static mdk_rdev_t * find_rdev(mddev_t * mddev, dev_t dev) | 760 | static struct md_rdev * find_rdev(struct mddev * mddev, dev_t dev) |
757 | { | 761 | { |
758 | mdk_rdev_t *rdev; | 762 | struct md_rdev *rdev; |
759 | 763 | ||
760 | list_for_each_entry(rdev, &mddev->disks, same_set) | 764 | list_for_each_entry(rdev, &mddev->disks, same_set) |
761 | if (rdev->bdev->bd_dev == dev) | 765 | if (rdev->bdev->bd_dev == dev) |
@@ -764,9 +768,9 @@ static mdk_rdev_t * find_rdev(mddev_t * mddev, dev_t dev) | |||
764 | return NULL; | 768 | return NULL; |
765 | } | 769 | } |
766 | 770 | ||
767 | static struct mdk_personality *find_pers(int level, char *clevel) | 771 | static struct md_personality *find_pers(int level, char *clevel) |
768 | { | 772 | { |
769 | struct mdk_personality *pers; | 773 | struct md_personality *pers; |
770 | list_for_each_entry(pers, &pers_list, list) { | 774 | list_for_each_entry(pers, &pers_list, list) { |
771 | if (level != LEVEL_NONE && pers->level == level) | 775 | if (level != LEVEL_NONE && pers->level == level) |
772 | return pers; | 776 | return pers; |
@@ -777,13 +781,13 @@ static struct mdk_personality *find_pers(int level, char *clevel) | |||
777 | } | 781 | } |
778 | 782 | ||
779 | /* return the offset of the super block in 512byte sectors */ | 783 | /* return the offset of the super block in 512byte sectors */ |
780 | static inline sector_t calc_dev_sboffset(mdk_rdev_t *rdev) | 784 | static inline sector_t calc_dev_sboffset(struct md_rdev *rdev) |
781 | { | 785 | { |
782 | sector_t num_sectors = i_size_read(rdev->bdev->bd_inode) / 512; | 786 | sector_t num_sectors = i_size_read(rdev->bdev->bd_inode) / 512; |
783 | return MD_NEW_SIZE_SECTORS(num_sectors); | 787 | return MD_NEW_SIZE_SECTORS(num_sectors); |
784 | } | 788 | } |
785 | 789 | ||
786 | static int alloc_disk_sb(mdk_rdev_t * rdev) | 790 | static int alloc_disk_sb(struct md_rdev * rdev) |
787 | { | 791 | { |
788 | if (rdev->sb_page) | 792 | if (rdev->sb_page) |
789 | MD_BUG(); | 793 | MD_BUG(); |
@@ -797,7 +801,7 @@ static int alloc_disk_sb(mdk_rdev_t * rdev) | |||
797 | return 0; | 801 | return 0; |
798 | } | 802 | } |
799 | 803 | ||
800 | static void free_disk_sb(mdk_rdev_t * rdev) | 804 | static void free_disk_sb(struct md_rdev * rdev) |
801 | { | 805 | { |
802 | if (rdev->sb_page) { | 806 | if (rdev->sb_page) { |
803 | put_page(rdev->sb_page); | 807 | put_page(rdev->sb_page); |
@@ -815,8 +819,8 @@ static void free_disk_sb(mdk_rdev_t * rdev) | |||
815 | 819 | ||
816 | static void super_written(struct bio *bio, int error) | 820 | static void super_written(struct bio *bio, int error) |
817 | { | 821 | { |
818 | mdk_rdev_t *rdev = bio->bi_private; | 822 | struct md_rdev *rdev = bio->bi_private; |
819 | mddev_t *mddev = rdev->mddev; | 823 | struct mddev *mddev = rdev->mddev; |
820 | 824 | ||
821 | if (error || !test_bit(BIO_UPTODATE, &bio->bi_flags)) { | 825 | if (error || !test_bit(BIO_UPTODATE, &bio->bi_flags)) { |
822 | printk("md: super_written gets error=%d, uptodate=%d\n", | 826 | printk("md: super_written gets error=%d, uptodate=%d\n", |
@@ -830,7 +834,7 @@ static void super_written(struct bio *bio, int error) | |||
830 | bio_put(bio); | 834 | bio_put(bio); |
831 | } | 835 | } |
832 | 836 | ||
833 | void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | 837 | void md_super_write(struct mddev *mddev, struct md_rdev *rdev, |
834 | sector_t sector, int size, struct page *page) | 838 | sector_t sector, int size, struct page *page) |
835 | { | 839 | { |
836 | /* write first size bytes of page to sector of rdev | 840 | /* write first size bytes of page to sector of rdev |
@@ -848,10 +852,10 @@ void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | |||
848 | bio->bi_end_io = super_written; | 852 | bio->bi_end_io = super_written; |
849 | 853 | ||
850 | atomic_inc(&mddev->pending_writes); | 854 | atomic_inc(&mddev->pending_writes); |
851 | submit_bio(REQ_WRITE | REQ_SYNC | REQ_FLUSH | REQ_FUA, bio); | 855 | submit_bio(WRITE_FLUSH_FUA, bio); |
852 | } | 856 | } |
853 | 857 | ||
854 | void md_super_wait(mddev_t *mddev) | 858 | void md_super_wait(struct mddev *mddev) |
855 | { | 859 | { |
856 | /* wait for all superblock writes that were scheduled to complete */ | 860 | /* wait for all superblock writes that were scheduled to complete */ |
857 | DEFINE_WAIT(wq); | 861 | DEFINE_WAIT(wq); |
@@ -869,7 +873,7 @@ static void bi_complete(struct bio *bio, int error) | |||
869 | complete((struct completion*)bio->bi_private); | 873 | complete((struct completion*)bio->bi_private); |
870 | } | 874 | } |
871 | 875 | ||
872 | int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, | 876 | int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, |
873 | struct page *page, int rw, bool metadata_op) | 877 | struct page *page, int rw, bool metadata_op) |
874 | { | 878 | { |
875 | struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); | 879 | struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); |
@@ -897,7 +901,7 @@ int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, | |||
897 | } | 901 | } |
898 | EXPORT_SYMBOL_GPL(sync_page_io); | 902 | EXPORT_SYMBOL_GPL(sync_page_io); |
899 | 903 | ||
900 | static int read_disk_sb(mdk_rdev_t * rdev, int size) | 904 | static int read_disk_sb(struct md_rdev * rdev, int size) |
901 | { | 905 | { |
902 | char b[BDEVNAME_SIZE]; | 906 | char b[BDEVNAME_SIZE]; |
903 | if (!rdev->sb_page) { | 907 | if (!rdev->sb_page) { |
@@ -1004,7 +1008,7 @@ static unsigned int calc_sb_csum(mdp_super_t * sb) | |||
1004 | * We rely on user-space to write the initial superblock, and support | 1008 | * We rely on user-space to write the initial superblock, and support |
1005 | * reading and updating of superblocks. | 1009 | * reading and updating of superblocks. |
1006 | * Interface methods are: | 1010 | * Interface methods are: |
1007 | * int load_super(mdk_rdev_t *dev, mdk_rdev_t *refdev, int minor_version) | 1011 | * int load_super(struct md_rdev *dev, struct md_rdev *refdev, int minor_version) |
1008 | * loads and validates a superblock on dev. | 1012 | * loads and validates a superblock on dev. |
1009 | * if refdev != NULL, compare superblocks on both devices | 1013 | * if refdev != NULL, compare superblocks on both devices |
1010 | * Return: | 1014 | * Return: |
@@ -1014,13 +1018,13 @@ static unsigned int calc_sb_csum(mdp_super_t * sb) | |||
1014 | * -EINVAL superblock incompatible or invalid | 1018 | * -EINVAL superblock incompatible or invalid |
1015 | * -othererror e.g. -EIO | 1019 | * -othererror e.g. -EIO |
1016 | * | 1020 | * |
1017 | * int validate_super(mddev_t *mddev, mdk_rdev_t *dev) | 1021 | * int validate_super(struct mddev *mddev, struct md_rdev *dev) |
1018 | * Verify that dev is acceptable into mddev. | 1022 | * Verify that dev is acceptable into mddev. |
1019 | * The first time, mddev->raid_disks will be 0, and data from | 1023 | * The first time, mddev->raid_disks will be 0, and data from |
1020 | * dev should be merged in. Subsequent calls check that dev | 1024 | * dev should be merged in. Subsequent calls check that dev |
1021 | * is new enough. Return 0 or -EINVAL | 1025 | * is new enough. Return 0 or -EINVAL |
1022 | * | 1026 | * |
1023 | * void sync_super(mddev_t *mddev, mdk_rdev_t *dev) | 1027 | * void sync_super(struct mddev *mddev, struct md_rdev *dev) |
1024 | * Update the superblock for rdev with data in mddev | 1028 | * Update the superblock for rdev with data in mddev |
1025 | * This does not write to disc. | 1029 | * This does not write to disc. |
1026 | * | 1030 | * |
@@ -1029,11 +1033,11 @@ static unsigned int calc_sb_csum(mdp_super_t * sb) | |||
1029 | struct super_type { | 1033 | struct super_type { |
1030 | char *name; | 1034 | char *name; |
1031 | struct module *owner; | 1035 | struct module *owner; |
1032 | int (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev, | 1036 | int (*load_super)(struct md_rdev *rdev, struct md_rdev *refdev, |
1033 | int minor_version); | 1037 | int minor_version); |
1034 | int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev); | 1038 | int (*validate_super)(struct mddev *mddev, struct md_rdev *rdev); |
1035 | void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev); | 1039 | void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev); |
1036 | unsigned long long (*rdev_size_change)(mdk_rdev_t *rdev, | 1040 | unsigned long long (*rdev_size_change)(struct md_rdev *rdev, |
1037 | sector_t num_sectors); | 1041 | sector_t num_sectors); |
1038 | }; | 1042 | }; |
1039 | 1043 | ||
@@ -1045,7 +1049,7 @@ struct super_type { | |||
1045 | * has a bitmap. Otherwise, it returns 0. | 1049 | * has a bitmap. Otherwise, it returns 0. |
1046 | * | 1050 | * |
1047 | */ | 1051 | */ |
1048 | int md_check_no_bitmap(mddev_t *mddev) | 1052 | int md_check_no_bitmap(struct mddev *mddev) |
1049 | { | 1053 | { |
1050 | if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset) | 1054 | if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset) |
1051 | return 0; | 1055 | return 0; |
@@ -1058,7 +1062,7 @@ EXPORT_SYMBOL(md_check_no_bitmap); | |||
1058 | /* | 1062 | /* |
1059 | * load_super for 0.90.0 | 1063 | * load_super for 0.90.0 |
1060 | */ | 1064 | */ |
1061 | static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | 1065 | static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version) |
1062 | { | 1066 | { |
1063 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; | 1067 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; |
1064 | mdp_super_t *sb; | 1068 | mdp_super_t *sb; |
@@ -1138,8 +1142,11 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version | |||
1138 | ret = 0; | 1142 | ret = 0; |
1139 | } | 1143 | } |
1140 | rdev->sectors = rdev->sb_start; | 1144 | rdev->sectors = rdev->sb_start; |
1145 | /* Limit to 4TB as metadata cannot record more than that */ | ||
1146 | if (rdev->sectors >= (2ULL << 32)) | ||
1147 | rdev->sectors = (2ULL << 32) - 2; | ||
1141 | 1148 | ||
1142 | if (rdev->sectors < sb->size * 2 && sb->level > 1) | 1149 | if (rdev->sectors < ((sector_t)sb->size) * 2 && sb->level >= 1) |
1143 | /* "this cannot possibly happen" ... */ | 1150 | /* "this cannot possibly happen" ... */ |
1144 | ret = -EINVAL; | 1151 | ret = -EINVAL; |
1145 | 1152 | ||
@@ -1150,7 +1157,7 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version | |||
1150 | /* | 1157 | /* |
1151 | * validate_super for 0.90.0 | 1158 | * validate_super for 0.90.0 |
1152 | */ | 1159 | */ |
1153 | static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) | 1160 | static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) |
1154 | { | 1161 | { |
1155 | mdp_disk_t *desc; | 1162 | mdp_disk_t *desc; |
1156 | mdp_super_t *sb = page_address(rdev->sb_page); | 1163 | mdp_super_t *sb = page_address(rdev->sb_page); |
@@ -1173,7 +1180,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1173 | mddev->clevel[0] = 0; | 1180 | mddev->clevel[0] = 0; |
1174 | mddev->layout = sb->layout; | 1181 | mddev->layout = sb->layout; |
1175 | mddev->raid_disks = sb->raid_disks; | 1182 | mddev->raid_disks = sb->raid_disks; |
1176 | mddev->dev_sectors = sb->size * 2; | 1183 | mddev->dev_sectors = ((sector_t)sb->size) * 2; |
1177 | mddev->events = ev1; | 1184 | mddev->events = ev1; |
1178 | mddev->bitmap_info.offset = 0; | 1185 | mddev->bitmap_info.offset = 0; |
1179 | mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; | 1186 | mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; |
@@ -1262,10 +1269,10 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1262 | /* | 1269 | /* |
1263 | * sync_super for 0.90.0 | 1270 | * sync_super for 0.90.0 |
1264 | */ | 1271 | */ |
1265 | static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) | 1272 | static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev) |
1266 | { | 1273 | { |
1267 | mdp_super_t *sb; | 1274 | mdp_super_t *sb; |
1268 | mdk_rdev_t *rdev2; | 1275 | struct md_rdev *rdev2; |
1269 | int next_spare = mddev->raid_disks; | 1276 | int next_spare = mddev->raid_disks; |
1270 | 1277 | ||
1271 | 1278 | ||
@@ -1406,7 +1413,7 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1406 | * rdev_size_change for 0.90.0 | 1413 | * rdev_size_change for 0.90.0 |
1407 | */ | 1414 | */ |
1408 | static unsigned long long | 1415 | static unsigned long long |
1409 | super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) | 1416 | super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors) |
1410 | { | 1417 | { |
1411 | if (num_sectors && num_sectors < rdev->mddev->dev_sectors) | 1418 | if (num_sectors && num_sectors < rdev->mddev->dev_sectors) |
1412 | return 0; /* component must fit device */ | 1419 | return 0; /* component must fit device */ |
@@ -1415,6 +1422,11 @@ super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) | |||
1415 | rdev->sb_start = calc_dev_sboffset(rdev); | 1422 | rdev->sb_start = calc_dev_sboffset(rdev); |
1416 | if (!num_sectors || num_sectors > rdev->sb_start) | 1423 | if (!num_sectors || num_sectors > rdev->sb_start) |
1417 | num_sectors = rdev->sb_start; | 1424 | num_sectors = rdev->sb_start; |
1425 | /* Limit to 4TB as metadata cannot record more than that. | ||
1426 | * 4TB == 2^32 KB, or 2*2^32 sectors. | ||
1427 | */ | ||
1428 | if (num_sectors >= (2ULL << 32)) | ||
1429 | num_sectors = (2ULL << 32) - 2; | ||
1418 | md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, | 1430 | md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, |
1419 | rdev->sb_page); | 1431 | rdev->sb_page); |
1420 | md_super_wait(rdev->mddev); | 1432 | md_super_wait(rdev->mddev); |
@@ -1451,7 +1463,7 @@ static __le32 calc_sb_1_csum(struct mdp_superblock_1 * sb) | |||
1451 | 1463 | ||
1452 | static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors, | 1464 | static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors, |
1453 | int acknowledged); | 1465 | int acknowledged); |
1454 | static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | 1466 | static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version) |
1455 | { | 1467 | { |
1456 | struct mdp_superblock_1 *sb; | 1468 | struct mdp_superblock_1 *sb; |
1457 | int ret; | 1469 | int ret; |
@@ -1607,7 +1619,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
1607 | return ret; | 1619 | return ret; |
1608 | } | 1620 | } |
1609 | 1621 | ||
1610 | static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) | 1622 | static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) |
1611 | { | 1623 | { |
1612 | struct mdp_superblock_1 *sb = page_address(rdev->sb_page); | 1624 | struct mdp_superblock_1 *sb = page_address(rdev->sb_page); |
1613 | __u64 ev1 = le64_to_cpu(sb->events); | 1625 | __u64 ev1 = le64_to_cpu(sb->events); |
@@ -1708,10 +1720,10 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1708 | return 0; | 1720 | return 0; |
1709 | } | 1721 | } |
1710 | 1722 | ||
1711 | static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | 1723 | static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev) |
1712 | { | 1724 | { |
1713 | struct mdp_superblock_1 *sb; | 1725 | struct mdp_superblock_1 *sb; |
1714 | mdk_rdev_t *rdev2; | 1726 | struct md_rdev *rdev2; |
1715 | int max_dev, i; | 1727 | int max_dev, i; |
1716 | /* make rdev->sb match mddev and rdev data. */ | 1728 | /* make rdev->sb match mddev and rdev data. */ |
1717 | 1729 | ||
@@ -1738,6 +1750,11 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1738 | sb->level = cpu_to_le32(mddev->level); | 1750 | sb->level = cpu_to_le32(mddev->level); |
1739 | sb->layout = cpu_to_le32(mddev->layout); | 1751 | sb->layout = cpu_to_le32(mddev->layout); |
1740 | 1752 | ||
1753 | if (test_bit(WriteMostly, &rdev->flags)) | ||
1754 | sb->devflags |= WriteMostly1; | ||
1755 | else | ||
1756 | sb->devflags &= ~WriteMostly1; | ||
1757 | |||
1741 | if (mddev->bitmap && mddev->bitmap_info.file == NULL) { | 1758 | if (mddev->bitmap && mddev->bitmap_info.file == NULL) { |
1742 | sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset); | 1759 | sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset); |
1743 | sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); | 1760 | sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); |
@@ -1828,7 +1845,7 @@ retry: | |||
1828 | } | 1845 | } |
1829 | 1846 | ||
1830 | static unsigned long long | 1847 | static unsigned long long |
1831 | super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) | 1848 | super_1_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors) |
1832 | { | 1849 | { |
1833 | struct mdp_superblock_1 *sb; | 1850 | struct mdp_superblock_1 *sb; |
1834 | sector_t max_sectors; | 1851 | sector_t max_sectors; |
@@ -1882,7 +1899,7 @@ static struct super_type super_types[] = { | |||
1882 | }, | 1899 | }, |
1883 | }; | 1900 | }; |
1884 | 1901 | ||
1885 | static void sync_super(mddev_t *mddev, mdk_rdev_t *rdev) | 1902 | static void sync_super(struct mddev *mddev, struct md_rdev *rdev) |
1886 | { | 1903 | { |
1887 | if (mddev->sync_super) { | 1904 | if (mddev->sync_super) { |
1888 | mddev->sync_super(mddev, rdev); | 1905 | mddev->sync_super(mddev, rdev); |
@@ -1894,9 +1911,9 @@ static void sync_super(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1894 | super_types[mddev->major_version].sync_super(mddev, rdev); | 1911 | super_types[mddev->major_version].sync_super(mddev, rdev); |
1895 | } | 1912 | } |
1896 | 1913 | ||
1897 | static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2) | 1914 | static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2) |
1898 | { | 1915 | { |
1899 | mdk_rdev_t *rdev, *rdev2; | 1916 | struct md_rdev *rdev, *rdev2; |
1900 | 1917 | ||
1901 | rcu_read_lock(); | 1918 | rcu_read_lock(); |
1902 | rdev_for_each_rcu(rdev, mddev1) | 1919 | rdev_for_each_rcu(rdev, mddev1) |
@@ -1919,9 +1936,9 @@ static LIST_HEAD(pending_raid_disks); | |||
1919 | * from the array. It only succeeds if all working and active component devices | 1936 | * from the array. It only succeeds if all working and active component devices |
1920 | * are integrity capable with matching profiles. | 1937 | * are integrity capable with matching profiles. |
1921 | */ | 1938 | */ |
1922 | int md_integrity_register(mddev_t *mddev) | 1939 | int md_integrity_register(struct mddev *mddev) |
1923 | { | 1940 | { |
1924 | mdk_rdev_t *rdev, *reference = NULL; | 1941 | struct md_rdev *rdev, *reference = NULL; |
1925 | 1942 | ||
1926 | if (list_empty(&mddev->disks)) | 1943 | if (list_empty(&mddev->disks)) |
1927 | return 0; /* nothing to do */ | 1944 | return 0; /* nothing to do */ |
@@ -1966,7 +1983,7 @@ int md_integrity_register(mddev_t *mddev) | |||
1966 | EXPORT_SYMBOL(md_integrity_register); | 1983 | EXPORT_SYMBOL(md_integrity_register); |
1967 | 1984 | ||
1968 | /* Disable data integrity if non-capable/non-matching disk is being added */ | 1985 | /* Disable data integrity if non-capable/non-matching disk is being added */ |
1969 | void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev) | 1986 | void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev) |
1970 | { | 1987 | { |
1971 | struct blk_integrity *bi_rdev = bdev_get_integrity(rdev->bdev); | 1988 | struct blk_integrity *bi_rdev = bdev_get_integrity(rdev->bdev); |
1972 | struct blk_integrity *bi_mddev = blk_get_integrity(mddev->gendisk); | 1989 | struct blk_integrity *bi_mddev = blk_get_integrity(mddev->gendisk); |
@@ -1983,7 +2000,7 @@ void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev) | |||
1983 | } | 2000 | } |
1984 | EXPORT_SYMBOL(md_integrity_add_rdev); | 2001 | EXPORT_SYMBOL(md_integrity_add_rdev); |
1985 | 2002 | ||
1986 | static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | 2003 | static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev) |
1987 | { | 2004 | { |
1988 | char b[BDEVNAME_SIZE]; | 2005 | char b[BDEVNAME_SIZE]; |
1989 | struct kobject *ko; | 2006 | struct kobject *ko; |
@@ -2063,12 +2080,12 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | |||
2063 | 2080 | ||
2064 | static void md_delayed_delete(struct work_struct *ws) | 2081 | static void md_delayed_delete(struct work_struct *ws) |
2065 | { | 2082 | { |
2066 | mdk_rdev_t *rdev = container_of(ws, mdk_rdev_t, del_work); | 2083 | struct md_rdev *rdev = container_of(ws, struct md_rdev, del_work); |
2067 | kobject_del(&rdev->kobj); | 2084 | kobject_del(&rdev->kobj); |
2068 | kobject_put(&rdev->kobj); | 2085 | kobject_put(&rdev->kobj); |
2069 | } | 2086 | } |
2070 | 2087 | ||
2071 | static void unbind_rdev_from_array(mdk_rdev_t * rdev) | 2088 | static void unbind_rdev_from_array(struct md_rdev * rdev) |
2072 | { | 2089 | { |
2073 | char b[BDEVNAME_SIZE]; | 2090 | char b[BDEVNAME_SIZE]; |
2074 | if (!rdev->mddev) { | 2091 | if (!rdev->mddev) { |
@@ -2100,14 +2117,14 @@ static void unbind_rdev_from_array(mdk_rdev_t * rdev) | |||
2100 | * otherwise reused by a RAID array (or any other kernel | 2117 | * otherwise reused by a RAID array (or any other kernel |
2101 | * subsystem), by bd_claiming the device. | 2118 | * subsystem), by bd_claiming the device. |
2102 | */ | 2119 | */ |
2103 | static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared) | 2120 | static int lock_rdev(struct md_rdev *rdev, dev_t dev, int shared) |
2104 | { | 2121 | { |
2105 | int err = 0; | 2122 | int err = 0; |
2106 | struct block_device *bdev; | 2123 | struct block_device *bdev; |
2107 | char b[BDEVNAME_SIZE]; | 2124 | char b[BDEVNAME_SIZE]; |
2108 | 2125 | ||
2109 | bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, | 2126 | bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
2110 | shared ? (mdk_rdev_t *)lock_rdev : rdev); | 2127 | shared ? (struct md_rdev *)lock_rdev : rdev); |
2111 | if (IS_ERR(bdev)) { | 2128 | if (IS_ERR(bdev)) { |
2112 | printk(KERN_ERR "md: could not open %s.\n", | 2129 | printk(KERN_ERR "md: could not open %s.\n", |
2113 | __bdevname(dev, b)); | 2130 | __bdevname(dev, b)); |
@@ -2117,7 +2134,7 @@ static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared) | |||
2117 | return err; | 2134 | return err; |
2118 | } | 2135 | } |
2119 | 2136 | ||
2120 | static void unlock_rdev(mdk_rdev_t *rdev) | 2137 | static void unlock_rdev(struct md_rdev *rdev) |
2121 | { | 2138 | { |
2122 | struct block_device *bdev = rdev->bdev; | 2139 | struct block_device *bdev = rdev->bdev; |
2123 | rdev->bdev = NULL; | 2140 | rdev->bdev = NULL; |
@@ -2128,7 +2145,7 @@ static void unlock_rdev(mdk_rdev_t *rdev) | |||
2128 | 2145 | ||
2129 | void md_autodetect_dev(dev_t dev); | 2146 | void md_autodetect_dev(dev_t dev); |
2130 | 2147 | ||
2131 | static void export_rdev(mdk_rdev_t * rdev) | 2148 | static void export_rdev(struct md_rdev * rdev) |
2132 | { | 2149 | { |
2133 | char b[BDEVNAME_SIZE]; | 2150 | char b[BDEVNAME_SIZE]; |
2134 | printk(KERN_INFO "md: export_rdev(%s)\n", | 2151 | printk(KERN_INFO "md: export_rdev(%s)\n", |
@@ -2144,15 +2161,15 @@ static void export_rdev(mdk_rdev_t * rdev) | |||
2144 | kobject_put(&rdev->kobj); | 2161 | kobject_put(&rdev->kobj); |
2145 | } | 2162 | } |
2146 | 2163 | ||
2147 | static void kick_rdev_from_array(mdk_rdev_t * rdev) | 2164 | static void kick_rdev_from_array(struct md_rdev * rdev) |
2148 | { | 2165 | { |
2149 | unbind_rdev_from_array(rdev); | 2166 | unbind_rdev_from_array(rdev); |
2150 | export_rdev(rdev); | 2167 | export_rdev(rdev); |
2151 | } | 2168 | } |
2152 | 2169 | ||
2153 | static void export_array(mddev_t *mddev) | 2170 | static void export_array(struct mddev *mddev) |
2154 | { | 2171 | { |
2155 | mdk_rdev_t *rdev, *tmp; | 2172 | struct md_rdev *rdev, *tmp; |
2156 | 2173 | ||
2157 | rdev_for_each(rdev, tmp, mddev) { | 2174 | rdev_for_each(rdev, tmp, mddev) { |
2158 | if (!rdev->mddev) { | 2175 | if (!rdev->mddev) { |
@@ -2248,7 +2265,7 @@ static void print_sb_1(struct mdp_superblock_1 *sb) | |||
2248 | ); | 2265 | ); |
2249 | } | 2266 | } |
2250 | 2267 | ||
2251 | static void print_rdev(mdk_rdev_t *rdev, int major_version) | 2268 | static void print_rdev(struct md_rdev *rdev, int major_version) |
2252 | { | 2269 | { |
2253 | char b[BDEVNAME_SIZE]; | 2270 | char b[BDEVNAME_SIZE]; |
2254 | printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n", | 2271 | printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n", |
@@ -2272,8 +2289,8 @@ static void print_rdev(mdk_rdev_t *rdev, int major_version) | |||
2272 | static void md_print_devices(void) | 2289 | static void md_print_devices(void) |
2273 | { | 2290 | { |
2274 | struct list_head *tmp; | 2291 | struct list_head *tmp; |
2275 | mdk_rdev_t *rdev; | 2292 | struct md_rdev *rdev; |
2276 | mddev_t *mddev; | 2293 | struct mddev *mddev; |
2277 | char b[BDEVNAME_SIZE]; | 2294 | char b[BDEVNAME_SIZE]; |
2278 | 2295 | ||
2279 | printk("\n"); | 2296 | printk("\n"); |
@@ -2298,7 +2315,7 @@ static void md_print_devices(void) | |||
2298 | } | 2315 | } |
2299 | 2316 | ||
2300 | 2317 | ||
2301 | static void sync_sbs(mddev_t * mddev, int nospares) | 2318 | static void sync_sbs(struct mddev * mddev, int nospares) |
2302 | { | 2319 | { |
2303 | /* Update each superblock (in-memory image), but | 2320 | /* Update each superblock (in-memory image), but |
2304 | * if we are allowed to, skip spares which already | 2321 | * if we are allowed to, skip spares which already |
@@ -2306,7 +2323,7 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
2306 | * (which would mean they aren't being marked as dirty | 2323 | * (which would mean they aren't being marked as dirty |
2307 | * with the rest of the array) | 2324 | * with the rest of the array) |
2308 | */ | 2325 | */ |
2309 | mdk_rdev_t *rdev; | 2326 | struct md_rdev *rdev; |
2310 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2327 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
2311 | if (rdev->sb_events == mddev->events || | 2328 | if (rdev->sb_events == mddev->events || |
2312 | (nospares && | 2329 | (nospares && |
@@ -2321,9 +2338,9 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
2321 | } | 2338 | } |
2322 | } | 2339 | } |
2323 | 2340 | ||
2324 | static void md_update_sb(mddev_t * mddev, int force_change) | 2341 | static void md_update_sb(struct mddev * mddev, int force_change) |
2325 | { | 2342 | { |
2326 | mdk_rdev_t *rdev; | 2343 | struct md_rdev *rdev; |
2327 | int sync_req; | 2344 | int sync_req; |
2328 | int nospares = 0; | 2345 | int nospares = 0; |
2329 | int any_badblocks_changed = 0; | 2346 | int any_badblocks_changed = 0; |
@@ -2419,27 +2436,24 @@ repeat: | |||
2419 | sync_sbs(mddev, nospares); | 2436 | sync_sbs(mddev, nospares); |
2420 | spin_unlock_irq(&mddev->write_lock); | 2437 | spin_unlock_irq(&mddev->write_lock); |
2421 | 2438 | ||
2422 | dprintk(KERN_INFO | 2439 | pr_debug("md: updating %s RAID superblock on device (in sync %d)\n", |
2423 | "md: updating %s RAID superblock on device (in sync %d)\n", | 2440 | mdname(mddev), mddev->in_sync); |
2424 | mdname(mddev),mddev->in_sync); | ||
2425 | 2441 | ||
2426 | bitmap_update_sb(mddev->bitmap); | 2442 | bitmap_update_sb(mddev->bitmap); |
2427 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2443 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
2428 | char b[BDEVNAME_SIZE]; | 2444 | char b[BDEVNAME_SIZE]; |
2429 | dprintk(KERN_INFO "md: "); | 2445 | |
2430 | if (rdev->sb_loaded != 1) | 2446 | if (rdev->sb_loaded != 1) |
2431 | continue; /* no noise on spare devices */ | 2447 | continue; /* no noise on spare devices */ |
2432 | if (test_bit(Faulty, &rdev->flags)) | ||
2433 | dprintk("(skipping faulty "); | ||
2434 | 2448 | ||
2435 | dprintk("%s ", bdevname(rdev->bdev,b)); | 2449 | if (!test_bit(Faulty, &rdev->flags) && |
2436 | if (!test_bit(Faulty, &rdev->flags)) { | 2450 | rdev->saved_raid_disk == -1) { |
2437 | md_super_write(mddev,rdev, | 2451 | md_super_write(mddev,rdev, |
2438 | rdev->sb_start, rdev->sb_size, | 2452 | rdev->sb_start, rdev->sb_size, |
2439 | rdev->sb_page); | 2453 | rdev->sb_page); |
2440 | dprintk(KERN_INFO "(write) %s's sb offset: %llu\n", | 2454 | pr_debug("md: (write) %s's sb offset: %llu\n", |
2441 | bdevname(rdev->bdev,b), | 2455 | bdevname(rdev->bdev, b), |
2442 | (unsigned long long)rdev->sb_start); | 2456 | (unsigned long long)rdev->sb_start); |
2443 | rdev->sb_events = mddev->events; | 2457 | rdev->sb_events = mddev->events; |
2444 | if (rdev->badblocks.size) { | 2458 | if (rdev->badblocks.size) { |
2445 | md_super_write(mddev, rdev, | 2459 | md_super_write(mddev, rdev, |
@@ -2449,8 +2463,12 @@ repeat: | |||
2449 | rdev->badblocks.size = 0; | 2463 | rdev->badblocks.size = 0; |
2450 | } | 2464 | } |
2451 | 2465 | ||
2452 | } else | 2466 | } else if (test_bit(Faulty, &rdev->flags)) |
2453 | dprintk(")\n"); | 2467 | pr_debug("md: %s (skipping faulty)\n", |
2468 | bdevname(rdev->bdev, b)); | ||
2469 | else | ||
2470 | pr_debug("(skipping incremental s/r "); | ||
2471 | |||
2454 | if (mddev->level == LEVEL_MULTIPATH) | 2472 | if (mddev->level == LEVEL_MULTIPATH) |
2455 | /* only need to write one superblock... */ | 2473 | /* only need to write one superblock... */ |
2456 | break; | 2474 | break; |
@@ -2504,12 +2522,12 @@ static int cmd_match(const char *cmd, const char *str) | |||
2504 | 2522 | ||
2505 | struct rdev_sysfs_entry { | 2523 | struct rdev_sysfs_entry { |
2506 | struct attribute attr; | 2524 | struct attribute attr; |
2507 | ssize_t (*show)(mdk_rdev_t *, char *); | 2525 | ssize_t (*show)(struct md_rdev *, char *); |
2508 | ssize_t (*store)(mdk_rdev_t *, const char *, size_t); | 2526 | ssize_t (*store)(struct md_rdev *, const char *, size_t); |
2509 | }; | 2527 | }; |
2510 | 2528 | ||
2511 | static ssize_t | 2529 | static ssize_t |
2512 | state_show(mdk_rdev_t *rdev, char *page) | 2530 | state_show(struct md_rdev *rdev, char *page) |
2513 | { | 2531 | { |
2514 | char *sep = ""; | 2532 | char *sep = ""; |
2515 | size_t len = 0; | 2533 | size_t len = 0; |
@@ -2545,7 +2563,7 @@ state_show(mdk_rdev_t *rdev, char *page) | |||
2545 | } | 2563 | } |
2546 | 2564 | ||
2547 | static ssize_t | 2565 | static ssize_t |
2548 | state_store(mdk_rdev_t *rdev, const char *buf, size_t len) | 2566 | state_store(struct md_rdev *rdev, const char *buf, size_t len) |
2549 | { | 2567 | { |
2550 | /* can write | 2568 | /* can write |
2551 | * faulty - simulates an error | 2569 | * faulty - simulates an error |
@@ -2561,12 +2579,15 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2561 | int err = -EINVAL; | 2579 | int err = -EINVAL; |
2562 | if (cmd_match(buf, "faulty") && rdev->mddev->pers) { | 2580 | if (cmd_match(buf, "faulty") && rdev->mddev->pers) { |
2563 | md_error(rdev->mddev, rdev); | 2581 | md_error(rdev->mddev, rdev); |
2564 | err = 0; | 2582 | if (test_bit(Faulty, &rdev->flags)) |
2583 | err = 0; | ||
2584 | else | ||
2585 | err = -EBUSY; | ||
2565 | } else if (cmd_match(buf, "remove")) { | 2586 | } else if (cmd_match(buf, "remove")) { |
2566 | if (rdev->raid_disk >= 0) | 2587 | if (rdev->raid_disk >= 0) |
2567 | err = -EBUSY; | 2588 | err = -EBUSY; |
2568 | else { | 2589 | else { |
2569 | mddev_t *mddev = rdev->mddev; | 2590 | struct mddev *mddev = rdev->mddev; |
2570 | kick_rdev_from_array(rdev); | 2591 | kick_rdev_from_array(rdev); |
2571 | if (mddev->pers) | 2592 | if (mddev->pers) |
2572 | md_update_sb(mddev, 1); | 2593 | md_update_sb(mddev, 1); |
@@ -2584,7 +2605,7 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2584 | err = 0; | 2605 | err = 0; |
2585 | } else if (cmd_match(buf, "-blocked")) { | 2606 | } else if (cmd_match(buf, "-blocked")) { |
2586 | if (!test_bit(Faulty, &rdev->flags) && | 2607 | if (!test_bit(Faulty, &rdev->flags) && |
2587 | test_bit(BlockedBadBlocks, &rdev->flags)) { | 2608 | rdev->badblocks.unacked_exist) { |
2588 | /* metadata handler doesn't understand badblocks, | 2609 | /* metadata handler doesn't understand badblocks, |
2589 | * so we need to fail the device | 2610 | * so we need to fail the device |
2590 | */ | 2611 | */ |
@@ -2615,13 +2636,13 @@ static struct rdev_sysfs_entry rdev_state = | |||
2615 | __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store); | 2636 | __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store); |
2616 | 2637 | ||
2617 | static ssize_t | 2638 | static ssize_t |
2618 | errors_show(mdk_rdev_t *rdev, char *page) | 2639 | errors_show(struct md_rdev *rdev, char *page) |
2619 | { | 2640 | { |
2620 | return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors)); | 2641 | return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors)); |
2621 | } | 2642 | } |
2622 | 2643 | ||
2623 | static ssize_t | 2644 | static ssize_t |
2624 | errors_store(mdk_rdev_t *rdev, const char *buf, size_t len) | 2645 | errors_store(struct md_rdev *rdev, const char *buf, size_t len) |
2625 | { | 2646 | { |
2626 | char *e; | 2647 | char *e; |
2627 | unsigned long n = simple_strtoul(buf, &e, 10); | 2648 | unsigned long n = simple_strtoul(buf, &e, 10); |
@@ -2635,7 +2656,7 @@ static struct rdev_sysfs_entry rdev_errors = | |||
2635 | __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store); | 2656 | __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store); |
2636 | 2657 | ||
2637 | static ssize_t | 2658 | static ssize_t |
2638 | slot_show(mdk_rdev_t *rdev, char *page) | 2659 | slot_show(struct md_rdev *rdev, char *page) |
2639 | { | 2660 | { |
2640 | if (rdev->raid_disk < 0) | 2661 | if (rdev->raid_disk < 0) |
2641 | return sprintf(page, "none\n"); | 2662 | return sprintf(page, "none\n"); |
@@ -2644,7 +2665,7 @@ slot_show(mdk_rdev_t *rdev, char *page) | |||
2644 | } | 2665 | } |
2645 | 2666 | ||
2646 | static ssize_t | 2667 | static ssize_t |
2647 | slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) | 2668 | slot_store(struct md_rdev *rdev, const char *buf, size_t len) |
2648 | { | 2669 | { |
2649 | char *e; | 2670 | char *e; |
2650 | int err; | 2671 | int err; |
@@ -2675,7 +2696,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2675 | set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); | 2696 | set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); |
2676 | md_wakeup_thread(rdev->mddev->thread); | 2697 | md_wakeup_thread(rdev->mddev->thread); |
2677 | } else if (rdev->mddev->pers) { | 2698 | } else if (rdev->mddev->pers) { |
2678 | mdk_rdev_t *rdev2; | 2699 | struct md_rdev *rdev2; |
2679 | /* Activating a spare .. or possibly reactivating | 2700 | /* Activating a spare .. or possibly reactivating |
2680 | * if we ever get bitmaps working here. | 2701 | * if we ever get bitmaps working here. |
2681 | */ | 2702 | */ |
@@ -2702,6 +2723,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2702 | rdev->saved_raid_disk = slot; | 2723 | rdev->saved_raid_disk = slot; |
2703 | else | 2724 | else |
2704 | rdev->saved_raid_disk = -1; | 2725 | rdev->saved_raid_disk = -1; |
2726 | clear_bit(In_sync, &rdev->flags); | ||
2705 | err = rdev->mddev->pers-> | 2727 | err = rdev->mddev->pers-> |
2706 | hot_add_disk(rdev->mddev, rdev); | 2728 | hot_add_disk(rdev->mddev, rdev); |
2707 | if (err) { | 2729 | if (err) { |
@@ -2731,13 +2753,13 @@ static struct rdev_sysfs_entry rdev_slot = | |||
2731 | __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store); | 2753 | __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store); |
2732 | 2754 | ||
2733 | static ssize_t | 2755 | static ssize_t |
2734 | offset_show(mdk_rdev_t *rdev, char *page) | 2756 | offset_show(struct md_rdev *rdev, char *page) |
2735 | { | 2757 | { |
2736 | return sprintf(page, "%llu\n", (unsigned long long)rdev->data_offset); | 2758 | return sprintf(page, "%llu\n", (unsigned long long)rdev->data_offset); |
2737 | } | 2759 | } |
2738 | 2760 | ||
2739 | static ssize_t | 2761 | static ssize_t |
2740 | offset_store(mdk_rdev_t *rdev, const char *buf, size_t len) | 2762 | offset_store(struct md_rdev *rdev, const char *buf, size_t len) |
2741 | { | 2763 | { |
2742 | char *e; | 2764 | char *e; |
2743 | unsigned long long offset = simple_strtoull(buf, &e, 10); | 2765 | unsigned long long offset = simple_strtoull(buf, &e, 10); |
@@ -2757,7 +2779,7 @@ static struct rdev_sysfs_entry rdev_offset = | |||
2757 | __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store); | 2779 | __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store); |
2758 | 2780 | ||
2759 | static ssize_t | 2781 | static ssize_t |
2760 | rdev_size_show(mdk_rdev_t *rdev, char *page) | 2782 | rdev_size_show(struct md_rdev *rdev, char *page) |
2761 | { | 2783 | { |
2762 | return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2); | 2784 | return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2); |
2763 | } | 2785 | } |
@@ -2792,9 +2814,9 @@ static int strict_blocks_to_sectors(const char *buf, sector_t *sectors) | |||
2792 | } | 2814 | } |
2793 | 2815 | ||
2794 | static ssize_t | 2816 | static ssize_t |
2795 | rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | 2817 | rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len) |
2796 | { | 2818 | { |
2797 | mddev_t *my_mddev = rdev->mddev; | 2819 | struct mddev *my_mddev = rdev->mddev; |
2798 | sector_t oldsectors = rdev->sectors; | 2820 | sector_t oldsectors = rdev->sectors; |
2799 | sector_t sectors; | 2821 | sector_t sectors; |
2800 | 2822 | ||
@@ -2820,13 +2842,13 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2820 | * a deadlock. We have already changed rdev->sectors, and if | 2842 | * a deadlock. We have already changed rdev->sectors, and if |
2821 | * we have to change it back, we will have the lock again. | 2843 | * we have to change it back, we will have the lock again. |
2822 | */ | 2844 | */ |
2823 | mddev_t *mddev; | 2845 | struct mddev *mddev; |
2824 | int overlap = 0; | 2846 | int overlap = 0; |
2825 | struct list_head *tmp; | 2847 | struct list_head *tmp; |
2826 | 2848 | ||
2827 | mddev_unlock(my_mddev); | 2849 | mddev_unlock(my_mddev); |
2828 | for_each_mddev(mddev, tmp) { | 2850 | for_each_mddev(mddev, tmp) { |
2829 | mdk_rdev_t *rdev2; | 2851 | struct md_rdev *rdev2; |
2830 | 2852 | ||
2831 | mddev_lock(mddev); | 2853 | mddev_lock(mddev); |
2832 | list_for_each_entry(rdev2, &mddev->disks, same_set) | 2854 | list_for_each_entry(rdev2, &mddev->disks, same_set) |
@@ -2863,7 +2885,7 @@ static struct rdev_sysfs_entry rdev_size = | |||
2863 | __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store); | 2885 | __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store); |
2864 | 2886 | ||
2865 | 2887 | ||
2866 | static ssize_t recovery_start_show(mdk_rdev_t *rdev, char *page) | 2888 | static ssize_t recovery_start_show(struct md_rdev *rdev, char *page) |
2867 | { | 2889 | { |
2868 | unsigned long long recovery_start = rdev->recovery_offset; | 2890 | unsigned long long recovery_start = rdev->recovery_offset; |
2869 | 2891 | ||
@@ -2874,7 +2896,7 @@ static ssize_t recovery_start_show(mdk_rdev_t *rdev, char *page) | |||
2874 | return sprintf(page, "%llu\n", recovery_start); | 2896 | return sprintf(page, "%llu\n", recovery_start); |
2875 | } | 2897 | } |
2876 | 2898 | ||
2877 | static ssize_t recovery_start_store(mdk_rdev_t *rdev, const char *buf, size_t len) | 2899 | static ssize_t recovery_start_store(struct md_rdev *rdev, const char *buf, size_t len) |
2878 | { | 2900 | { |
2879 | unsigned long long recovery_start; | 2901 | unsigned long long recovery_start; |
2880 | 2902 | ||
@@ -2904,11 +2926,11 @@ badblocks_show(struct badblocks *bb, char *page, int unack); | |||
2904 | static ssize_t | 2926 | static ssize_t |
2905 | badblocks_store(struct badblocks *bb, const char *page, size_t len, int unack); | 2927 | badblocks_store(struct badblocks *bb, const char *page, size_t len, int unack); |
2906 | 2928 | ||
2907 | static ssize_t bb_show(mdk_rdev_t *rdev, char *page) | 2929 | static ssize_t bb_show(struct md_rdev *rdev, char *page) |
2908 | { | 2930 | { |
2909 | return badblocks_show(&rdev->badblocks, page, 0); | 2931 | return badblocks_show(&rdev->badblocks, page, 0); |
2910 | } | 2932 | } |
2911 | static ssize_t bb_store(mdk_rdev_t *rdev, const char *page, size_t len) | 2933 | static ssize_t bb_store(struct md_rdev *rdev, const char *page, size_t len) |
2912 | { | 2934 | { |
2913 | int rv = badblocks_store(&rdev->badblocks, page, len, 0); | 2935 | int rv = badblocks_store(&rdev->badblocks, page, len, 0); |
2914 | /* Maybe that ack was all we needed */ | 2936 | /* Maybe that ack was all we needed */ |
@@ -2920,11 +2942,11 @@ static struct rdev_sysfs_entry rdev_bad_blocks = | |||
2920 | __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store); | 2942 | __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store); |
2921 | 2943 | ||
2922 | 2944 | ||
2923 | static ssize_t ubb_show(mdk_rdev_t *rdev, char *page) | 2945 | static ssize_t ubb_show(struct md_rdev *rdev, char *page) |
2924 | { | 2946 | { |
2925 | return badblocks_show(&rdev->badblocks, page, 1); | 2947 | return badblocks_show(&rdev->badblocks, page, 1); |
2926 | } | 2948 | } |
2927 | static ssize_t ubb_store(mdk_rdev_t *rdev, const char *page, size_t len) | 2949 | static ssize_t ubb_store(struct md_rdev *rdev, const char *page, size_t len) |
2928 | { | 2950 | { |
2929 | return badblocks_store(&rdev->badblocks, page, len, 1); | 2951 | return badblocks_store(&rdev->badblocks, page, len, 1); |
2930 | } | 2952 | } |
@@ -2946,8 +2968,8 @@ static ssize_t | |||
2946 | rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page) | 2968 | rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page) |
2947 | { | 2969 | { |
2948 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); | 2970 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); |
2949 | mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); | 2971 | struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj); |
2950 | mddev_t *mddev = rdev->mddev; | 2972 | struct mddev *mddev = rdev->mddev; |
2951 | ssize_t rv; | 2973 | ssize_t rv; |
2952 | 2974 | ||
2953 | if (!entry->show) | 2975 | if (!entry->show) |
@@ -2969,9 +2991,9 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr, | |||
2969 | const char *page, size_t length) | 2991 | const char *page, size_t length) |
2970 | { | 2992 | { |
2971 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); | 2993 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); |
2972 | mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); | 2994 | struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj); |
2973 | ssize_t rv; | 2995 | ssize_t rv; |
2974 | mddev_t *mddev = rdev->mddev; | 2996 | struct mddev *mddev = rdev->mddev; |
2975 | 2997 | ||
2976 | if (!entry->store) | 2998 | if (!entry->store) |
2977 | return -EIO; | 2999 | return -EIO; |
@@ -2990,7 +3012,7 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr, | |||
2990 | 3012 | ||
2991 | static void rdev_free(struct kobject *ko) | 3013 | static void rdev_free(struct kobject *ko) |
2992 | { | 3014 | { |
2993 | mdk_rdev_t *rdev = container_of(ko, mdk_rdev_t, kobj); | 3015 | struct md_rdev *rdev = container_of(ko, struct md_rdev, kobj); |
2994 | kfree(rdev); | 3016 | kfree(rdev); |
2995 | } | 3017 | } |
2996 | static const struct sysfs_ops rdev_sysfs_ops = { | 3018 | static const struct sysfs_ops rdev_sysfs_ops = { |
@@ -3003,7 +3025,7 @@ static struct kobj_type rdev_ktype = { | |||
3003 | .default_attrs = rdev_default_attrs, | 3025 | .default_attrs = rdev_default_attrs, |
3004 | }; | 3026 | }; |
3005 | 3027 | ||
3006 | int md_rdev_init(mdk_rdev_t *rdev) | 3028 | int md_rdev_init(struct md_rdev *rdev) |
3007 | { | 3029 | { |
3008 | rdev->desc_nr = -1; | 3030 | rdev->desc_nr = -1; |
3009 | rdev->saved_raid_disk = -1; | 3031 | rdev->saved_raid_disk = -1; |
@@ -3046,11 +3068,11 @@ EXPORT_SYMBOL_GPL(md_rdev_init); | |||
3046 | * | 3068 | * |
3047 | * a faulty rdev _never_ has rdev->sb set. | 3069 | * a faulty rdev _never_ has rdev->sb set. |
3048 | */ | 3070 | */ |
3049 | static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_minor) | 3071 | static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor) |
3050 | { | 3072 | { |
3051 | char b[BDEVNAME_SIZE]; | 3073 | char b[BDEVNAME_SIZE]; |
3052 | int err; | 3074 | int err; |
3053 | mdk_rdev_t *rdev; | 3075 | struct md_rdev *rdev; |
3054 | sector_t size; | 3076 | sector_t size; |
3055 | 3077 | ||
3056 | rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); | 3078 | rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); |
@@ -3119,10 +3141,10 @@ abort_free: | |||
3119 | */ | 3141 | */ |
3120 | 3142 | ||
3121 | 3143 | ||
3122 | static void analyze_sbs(mddev_t * mddev) | 3144 | static void analyze_sbs(struct mddev * mddev) |
3123 | { | 3145 | { |
3124 | int i; | 3146 | int i; |
3125 | mdk_rdev_t *rdev, *freshest, *tmp; | 3147 | struct md_rdev *rdev, *freshest, *tmp; |
3126 | char b[BDEVNAME_SIZE]; | 3148 | char b[BDEVNAME_SIZE]; |
3127 | 3149 | ||
3128 | freshest = NULL; | 3150 | freshest = NULL; |
@@ -3222,13 +3244,13 @@ int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale) | |||
3222 | static void md_safemode_timeout(unsigned long data); | 3244 | static void md_safemode_timeout(unsigned long data); |
3223 | 3245 | ||
3224 | static ssize_t | 3246 | static ssize_t |
3225 | safe_delay_show(mddev_t *mddev, char *page) | 3247 | safe_delay_show(struct mddev *mddev, char *page) |
3226 | { | 3248 | { |
3227 | int msec = (mddev->safemode_delay*1000)/HZ; | 3249 | int msec = (mddev->safemode_delay*1000)/HZ; |
3228 | return sprintf(page, "%d.%03d\n", msec/1000, msec%1000); | 3250 | return sprintf(page, "%d.%03d\n", msec/1000, msec%1000); |
3229 | } | 3251 | } |
3230 | static ssize_t | 3252 | static ssize_t |
3231 | safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len) | 3253 | safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len) |
3232 | { | 3254 | { |
3233 | unsigned long msec; | 3255 | unsigned long msec; |
3234 | 3256 | ||
@@ -3250,9 +3272,9 @@ static struct md_sysfs_entry md_safe_delay = | |||
3250 | __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store); | 3272 | __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store); |
3251 | 3273 | ||
3252 | static ssize_t | 3274 | static ssize_t |
3253 | level_show(mddev_t *mddev, char *page) | 3275 | level_show(struct mddev *mddev, char *page) |
3254 | { | 3276 | { |
3255 | struct mdk_personality *p = mddev->pers; | 3277 | struct md_personality *p = mddev->pers; |
3256 | if (p) | 3278 | if (p) |
3257 | return sprintf(page, "%s\n", p->name); | 3279 | return sprintf(page, "%s\n", p->name); |
3258 | else if (mddev->clevel[0]) | 3280 | else if (mddev->clevel[0]) |
@@ -3264,14 +3286,14 @@ level_show(mddev_t *mddev, char *page) | |||
3264 | } | 3286 | } |
3265 | 3287 | ||
3266 | static ssize_t | 3288 | static ssize_t |
3267 | level_store(mddev_t *mddev, const char *buf, size_t len) | 3289 | level_store(struct mddev *mddev, const char *buf, size_t len) |
3268 | { | 3290 | { |
3269 | char clevel[16]; | 3291 | char clevel[16]; |
3270 | ssize_t rv = len; | 3292 | ssize_t rv = len; |
3271 | struct mdk_personality *pers; | 3293 | struct md_personality *pers; |
3272 | long level; | 3294 | long level; |
3273 | void *priv; | 3295 | void *priv; |
3274 | mdk_rdev_t *rdev; | 3296 | struct md_rdev *rdev; |
3275 | 3297 | ||
3276 | if (mddev->pers == NULL) { | 3298 | if (mddev->pers == NULL) { |
3277 | if (len == 0) | 3299 | if (len == 0) |
@@ -3445,7 +3467,7 @@ __ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store); | |||
3445 | 3467 | ||
3446 | 3468 | ||
3447 | static ssize_t | 3469 | static ssize_t |
3448 | layout_show(mddev_t *mddev, char *page) | 3470 | layout_show(struct mddev *mddev, char *page) |
3449 | { | 3471 | { |
3450 | /* just a number, not meaningful for all levels */ | 3472 | /* just a number, not meaningful for all levels */ |
3451 | if (mddev->reshape_position != MaxSector && | 3473 | if (mddev->reshape_position != MaxSector && |
@@ -3456,7 +3478,7 @@ layout_show(mddev_t *mddev, char *page) | |||
3456 | } | 3478 | } |
3457 | 3479 | ||
3458 | static ssize_t | 3480 | static ssize_t |
3459 | layout_store(mddev_t *mddev, const char *buf, size_t len) | 3481 | layout_store(struct mddev *mddev, const char *buf, size_t len) |
3460 | { | 3482 | { |
3461 | char *e; | 3483 | char *e; |
3462 | unsigned long n = simple_strtoul(buf, &e, 10); | 3484 | unsigned long n = simple_strtoul(buf, &e, 10); |
@@ -3486,7 +3508,7 @@ __ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store); | |||
3486 | 3508 | ||
3487 | 3509 | ||
3488 | static ssize_t | 3510 | static ssize_t |
3489 | raid_disks_show(mddev_t *mddev, char *page) | 3511 | raid_disks_show(struct mddev *mddev, char *page) |
3490 | { | 3512 | { |
3491 | if (mddev->raid_disks == 0) | 3513 | if (mddev->raid_disks == 0) |
3492 | return 0; | 3514 | return 0; |
@@ -3497,10 +3519,10 @@ raid_disks_show(mddev_t *mddev, char *page) | |||
3497 | return sprintf(page, "%d\n", mddev->raid_disks); | 3519 | return sprintf(page, "%d\n", mddev->raid_disks); |
3498 | } | 3520 | } |
3499 | 3521 | ||
3500 | static int update_raid_disks(mddev_t *mddev, int raid_disks); | 3522 | static int update_raid_disks(struct mddev *mddev, int raid_disks); |
3501 | 3523 | ||
3502 | static ssize_t | 3524 | static ssize_t |
3503 | raid_disks_store(mddev_t *mddev, const char *buf, size_t len) | 3525 | raid_disks_store(struct mddev *mddev, const char *buf, size_t len) |
3504 | { | 3526 | { |
3505 | char *e; | 3527 | char *e; |
3506 | int rv = 0; | 3528 | int rv = 0; |
@@ -3523,7 +3545,7 @@ static struct md_sysfs_entry md_raid_disks = | |||
3523 | __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store); | 3545 | __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store); |
3524 | 3546 | ||
3525 | static ssize_t | 3547 | static ssize_t |
3526 | chunk_size_show(mddev_t *mddev, char *page) | 3548 | chunk_size_show(struct mddev *mddev, char *page) |
3527 | { | 3549 | { |
3528 | if (mddev->reshape_position != MaxSector && | 3550 | if (mddev->reshape_position != MaxSector && |
3529 | mddev->chunk_sectors != mddev->new_chunk_sectors) | 3551 | mddev->chunk_sectors != mddev->new_chunk_sectors) |
@@ -3534,7 +3556,7 @@ chunk_size_show(mddev_t *mddev, char *page) | |||
3534 | } | 3556 | } |
3535 | 3557 | ||
3536 | static ssize_t | 3558 | static ssize_t |
3537 | chunk_size_store(mddev_t *mddev, const char *buf, size_t len) | 3559 | chunk_size_store(struct mddev *mddev, const char *buf, size_t len) |
3538 | { | 3560 | { |
3539 | char *e; | 3561 | char *e; |
3540 | unsigned long n = simple_strtoul(buf, &e, 10); | 3562 | unsigned long n = simple_strtoul(buf, &e, 10); |
@@ -3563,7 +3585,7 @@ static struct md_sysfs_entry md_chunk_size = | |||
3563 | __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store); | 3585 | __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store); |
3564 | 3586 | ||
3565 | static ssize_t | 3587 | static ssize_t |
3566 | resync_start_show(mddev_t *mddev, char *page) | 3588 | resync_start_show(struct mddev *mddev, char *page) |
3567 | { | 3589 | { |
3568 | if (mddev->recovery_cp == MaxSector) | 3590 | if (mddev->recovery_cp == MaxSector) |
3569 | return sprintf(page, "none\n"); | 3591 | return sprintf(page, "none\n"); |
@@ -3571,7 +3593,7 @@ resync_start_show(mddev_t *mddev, char *page) | |||
3571 | } | 3593 | } |
3572 | 3594 | ||
3573 | static ssize_t | 3595 | static ssize_t |
3574 | resync_start_store(mddev_t *mddev, const char *buf, size_t len) | 3596 | resync_start_store(struct mddev *mddev, const char *buf, size_t len) |
3575 | { | 3597 | { |
3576 | char *e; | 3598 | char *e; |
3577 | unsigned long long n = simple_strtoull(buf, &e, 10); | 3599 | unsigned long long n = simple_strtoull(buf, &e, 10); |
@@ -3641,7 +3663,7 @@ static int match_word(const char *word, char **list) | |||
3641 | } | 3663 | } |
3642 | 3664 | ||
3643 | static ssize_t | 3665 | static ssize_t |
3644 | array_state_show(mddev_t *mddev, char *page) | 3666 | array_state_show(struct mddev *mddev, char *page) |
3645 | { | 3667 | { |
3646 | enum array_state st = inactive; | 3668 | enum array_state st = inactive; |
3647 | 3669 | ||
@@ -3674,13 +3696,13 @@ array_state_show(mddev_t *mddev, char *page) | |||
3674 | return sprintf(page, "%s\n", array_states[st]); | 3696 | return sprintf(page, "%s\n", array_states[st]); |
3675 | } | 3697 | } |
3676 | 3698 | ||
3677 | static int do_md_stop(mddev_t * mddev, int ro, int is_open); | 3699 | static int do_md_stop(struct mddev * mddev, int ro, int is_open); |
3678 | static int md_set_readonly(mddev_t * mddev, int is_open); | 3700 | static int md_set_readonly(struct mddev * mddev, int is_open); |
3679 | static int do_md_run(mddev_t * mddev); | 3701 | static int do_md_run(struct mddev * mddev); |
3680 | static int restart_array(mddev_t *mddev); | 3702 | static int restart_array(struct mddev *mddev); |
3681 | 3703 | ||
3682 | static ssize_t | 3704 | static ssize_t |
3683 | array_state_store(mddev_t *mddev, const char *buf, size_t len) | 3705 | array_state_store(struct mddev *mddev, const char *buf, size_t len) |
3684 | { | 3706 | { |
3685 | int err = -EINVAL; | 3707 | int err = -EINVAL; |
3686 | enum array_state st = match_word(buf, array_states); | 3708 | enum array_state st = match_word(buf, array_states); |
@@ -3774,13 +3796,13 @@ static struct md_sysfs_entry md_array_state = | |||
3774 | __ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store); | 3796 | __ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store); |
3775 | 3797 | ||
3776 | static ssize_t | 3798 | static ssize_t |
3777 | max_corrected_read_errors_show(mddev_t *mddev, char *page) { | 3799 | max_corrected_read_errors_show(struct mddev *mddev, char *page) { |
3778 | return sprintf(page, "%d\n", | 3800 | return sprintf(page, "%d\n", |
3779 | atomic_read(&mddev->max_corr_read_errors)); | 3801 | atomic_read(&mddev->max_corr_read_errors)); |
3780 | } | 3802 | } |
3781 | 3803 | ||
3782 | static ssize_t | 3804 | static ssize_t |
3783 | max_corrected_read_errors_store(mddev_t *mddev, const char *buf, size_t len) | 3805 | max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len) |
3784 | { | 3806 | { |
3785 | char *e; | 3807 | char *e; |
3786 | unsigned long n = simple_strtoul(buf, &e, 10); | 3808 | unsigned long n = simple_strtoul(buf, &e, 10); |
@@ -3797,13 +3819,13 @@ __ATTR(max_read_errors, S_IRUGO|S_IWUSR, max_corrected_read_errors_show, | |||
3797 | max_corrected_read_errors_store); | 3819 | max_corrected_read_errors_store); |
3798 | 3820 | ||
3799 | static ssize_t | 3821 | static ssize_t |
3800 | null_show(mddev_t *mddev, char *page) | 3822 | null_show(struct mddev *mddev, char *page) |
3801 | { | 3823 | { |
3802 | return -EINVAL; | 3824 | return -EINVAL; |
3803 | } | 3825 | } |
3804 | 3826 | ||
3805 | static ssize_t | 3827 | static ssize_t |
3806 | new_dev_store(mddev_t *mddev, const char *buf, size_t len) | 3828 | new_dev_store(struct mddev *mddev, const char *buf, size_t len) |
3807 | { | 3829 | { |
3808 | /* buf must be %d:%d\n? giving major and minor numbers */ | 3830 | /* buf must be %d:%d\n? giving major and minor numbers */ |
3809 | /* The new device is added to the array. | 3831 | /* The new device is added to the array. |
@@ -3816,7 +3838,7 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len) | |||
3816 | int major = simple_strtoul(buf, &e, 10); | 3838 | int major = simple_strtoul(buf, &e, 10); |
3817 | int minor; | 3839 | int minor; |
3818 | dev_t dev; | 3840 | dev_t dev; |
3819 | mdk_rdev_t *rdev; | 3841 | struct md_rdev *rdev; |
3820 | int err; | 3842 | int err; |
3821 | 3843 | ||
3822 | if (!*buf || *e != ':' || !e[1] || e[1] == '\n') | 3844 | if (!*buf || *e != ':' || !e[1] || e[1] == '\n') |
@@ -3834,8 +3856,9 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len) | |||
3834 | rdev = md_import_device(dev, mddev->major_version, | 3856 | rdev = md_import_device(dev, mddev->major_version, |
3835 | mddev->minor_version); | 3857 | mddev->minor_version); |
3836 | if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) { | 3858 | if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) { |
3837 | mdk_rdev_t *rdev0 = list_entry(mddev->disks.next, | 3859 | struct md_rdev *rdev0 |
3838 | mdk_rdev_t, same_set); | 3860 | = list_entry(mddev->disks.next, |
3861 | struct md_rdev, same_set); | ||
3839 | err = super_types[mddev->major_version] | 3862 | err = super_types[mddev->major_version] |
3840 | .load_super(rdev, rdev0, mddev->minor_version); | 3863 | .load_super(rdev, rdev0, mddev->minor_version); |
3841 | if (err < 0) | 3864 | if (err < 0) |
@@ -3859,7 +3882,7 @@ static struct md_sysfs_entry md_new_device = | |||
3859 | __ATTR(new_dev, S_IWUSR, null_show, new_dev_store); | 3882 | __ATTR(new_dev, S_IWUSR, null_show, new_dev_store); |
3860 | 3883 | ||
3861 | static ssize_t | 3884 | static ssize_t |
3862 | bitmap_store(mddev_t *mddev, const char *buf, size_t len) | 3885 | bitmap_store(struct mddev *mddev, const char *buf, size_t len) |
3863 | { | 3886 | { |
3864 | char *end; | 3887 | char *end; |
3865 | unsigned long chunk, end_chunk; | 3888 | unsigned long chunk, end_chunk; |
@@ -3888,16 +3911,16 @@ static struct md_sysfs_entry md_bitmap = | |||
3888 | __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store); | 3911 | __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store); |
3889 | 3912 | ||
3890 | static ssize_t | 3913 | static ssize_t |
3891 | size_show(mddev_t *mddev, char *page) | 3914 | size_show(struct mddev *mddev, char *page) |
3892 | { | 3915 | { |
3893 | return sprintf(page, "%llu\n", | 3916 | return sprintf(page, "%llu\n", |
3894 | (unsigned long long)mddev->dev_sectors / 2); | 3917 | (unsigned long long)mddev->dev_sectors / 2); |
3895 | } | 3918 | } |
3896 | 3919 | ||
3897 | static int update_size(mddev_t *mddev, sector_t num_sectors); | 3920 | static int update_size(struct mddev *mddev, sector_t num_sectors); |
3898 | 3921 | ||
3899 | static ssize_t | 3922 | static ssize_t |
3900 | size_store(mddev_t *mddev, const char *buf, size_t len) | 3923 | size_store(struct mddev *mddev, const char *buf, size_t len) |
3901 | { | 3924 | { |
3902 | /* If array is inactive, we can reduce the component size, but | 3925 | /* If array is inactive, we can reduce the component size, but |
3903 | * not increase it (except from 0). | 3926 | * not increase it (except from 0). |
@@ -3932,7 +3955,7 @@ __ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store); | |||
3932 | * or N.M for internally known formats | 3955 | * or N.M for internally known formats |
3933 | */ | 3956 | */ |
3934 | static ssize_t | 3957 | static ssize_t |
3935 | metadata_show(mddev_t *mddev, char *page) | 3958 | metadata_show(struct mddev *mddev, char *page) |
3936 | { | 3959 | { |
3937 | if (mddev->persistent) | 3960 | if (mddev->persistent) |
3938 | return sprintf(page, "%d.%d\n", | 3961 | return sprintf(page, "%d.%d\n", |
@@ -3944,7 +3967,7 @@ metadata_show(mddev_t *mddev, char *page) | |||
3944 | } | 3967 | } |
3945 | 3968 | ||
3946 | static ssize_t | 3969 | static ssize_t |
3947 | metadata_store(mddev_t *mddev, const char *buf, size_t len) | 3970 | metadata_store(struct mddev *mddev, const char *buf, size_t len) |
3948 | { | 3971 | { |
3949 | int major, minor; | 3972 | int major, minor; |
3950 | char *e; | 3973 | char *e; |
@@ -3998,7 +4021,7 @@ static struct md_sysfs_entry md_metadata = | |||
3998 | __ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store); | 4021 | __ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store); |
3999 | 4022 | ||
4000 | static ssize_t | 4023 | static ssize_t |
4001 | action_show(mddev_t *mddev, char *page) | 4024 | action_show(struct mddev *mddev, char *page) |
4002 | { | 4025 | { |
4003 | char *type = "idle"; | 4026 | char *type = "idle"; |
4004 | if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) | 4027 | if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) |
@@ -4020,10 +4043,10 @@ action_show(mddev_t *mddev, char *page) | |||
4020 | return sprintf(page, "%s\n", type); | 4043 | return sprintf(page, "%s\n", type); |
4021 | } | 4044 | } |
4022 | 4045 | ||
4023 | static void reap_sync_thread(mddev_t *mddev); | 4046 | static void reap_sync_thread(struct mddev *mddev); |
4024 | 4047 | ||
4025 | static ssize_t | 4048 | static ssize_t |
4026 | action_store(mddev_t *mddev, const char *page, size_t len) | 4049 | action_store(struct mddev *mddev, const char *page, size_t len) |
4027 | { | 4050 | { |
4028 | if (!mddev->pers || !mddev->pers->sync_request) | 4051 | if (!mddev->pers || !mddev->pers->sync_request) |
4029 | return -EINVAL; | 4052 | return -EINVAL; |
@@ -4069,7 +4092,7 @@ action_store(mddev_t *mddev, const char *page, size_t len) | |||
4069 | } | 4092 | } |
4070 | 4093 | ||
4071 | static ssize_t | 4094 | static ssize_t |
4072 | mismatch_cnt_show(mddev_t *mddev, char *page) | 4095 | mismatch_cnt_show(struct mddev *mddev, char *page) |
4073 | { | 4096 | { |
4074 | return sprintf(page, "%llu\n", | 4097 | return sprintf(page, "%llu\n", |
4075 | (unsigned long long) mddev->resync_mismatches); | 4098 | (unsigned long long) mddev->resync_mismatches); |
@@ -4082,14 +4105,14 @@ __ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store); | |||
4082 | static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt); | 4105 | static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt); |
4083 | 4106 | ||
4084 | static ssize_t | 4107 | static ssize_t |
4085 | sync_min_show(mddev_t *mddev, char *page) | 4108 | sync_min_show(struct mddev *mddev, char *page) |
4086 | { | 4109 | { |
4087 | return sprintf(page, "%d (%s)\n", speed_min(mddev), | 4110 | return sprintf(page, "%d (%s)\n", speed_min(mddev), |
4088 | mddev->sync_speed_min ? "local": "system"); | 4111 | mddev->sync_speed_min ? "local": "system"); |
4089 | } | 4112 | } |
4090 | 4113 | ||
4091 | static ssize_t | 4114 | static ssize_t |
4092 | sync_min_store(mddev_t *mddev, const char *buf, size_t len) | 4115 | sync_min_store(struct mddev *mddev, const char *buf, size_t len) |
4093 | { | 4116 | { |
4094 | int min; | 4117 | int min; |
4095 | char *e; | 4118 | char *e; |
@@ -4108,14 +4131,14 @@ static struct md_sysfs_entry md_sync_min = | |||
4108 | __ATTR(sync_speed_min, S_IRUGO|S_IWUSR, sync_min_show, sync_min_store); | 4131 | __ATTR(sync_speed_min, S_IRUGO|S_IWUSR, sync_min_show, sync_min_store); |
4109 | 4132 | ||
4110 | static ssize_t | 4133 | static ssize_t |
4111 | sync_max_show(mddev_t *mddev, char *page) | 4134 | sync_max_show(struct mddev *mddev, char *page) |
4112 | { | 4135 | { |
4113 | return sprintf(page, "%d (%s)\n", speed_max(mddev), | 4136 | return sprintf(page, "%d (%s)\n", speed_max(mddev), |
4114 | mddev->sync_speed_max ? "local": "system"); | 4137 | mddev->sync_speed_max ? "local": "system"); |
4115 | } | 4138 | } |
4116 | 4139 | ||
4117 | static ssize_t | 4140 | static ssize_t |
4118 | sync_max_store(mddev_t *mddev, const char *buf, size_t len) | 4141 | sync_max_store(struct mddev *mddev, const char *buf, size_t len) |
4119 | { | 4142 | { |
4120 | int max; | 4143 | int max; |
4121 | char *e; | 4144 | char *e; |
@@ -4134,20 +4157,20 @@ static struct md_sysfs_entry md_sync_max = | |||
4134 | __ATTR(sync_speed_max, S_IRUGO|S_IWUSR, sync_max_show, sync_max_store); | 4157 | __ATTR(sync_speed_max, S_IRUGO|S_IWUSR, sync_max_show, sync_max_store); |
4135 | 4158 | ||
4136 | static ssize_t | 4159 | static ssize_t |
4137 | degraded_show(mddev_t *mddev, char *page) | 4160 | degraded_show(struct mddev *mddev, char *page) |
4138 | { | 4161 | { |
4139 | return sprintf(page, "%d\n", mddev->degraded); | 4162 | return sprintf(page, "%d\n", mddev->degraded); |
4140 | } | 4163 | } |
4141 | static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded); | 4164 | static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded); |
4142 | 4165 | ||
4143 | static ssize_t | 4166 | static ssize_t |
4144 | sync_force_parallel_show(mddev_t *mddev, char *page) | 4167 | sync_force_parallel_show(struct mddev *mddev, char *page) |
4145 | { | 4168 | { |
4146 | return sprintf(page, "%d\n", mddev->parallel_resync); | 4169 | return sprintf(page, "%d\n", mddev->parallel_resync); |
4147 | } | 4170 | } |
4148 | 4171 | ||
4149 | static ssize_t | 4172 | static ssize_t |
4150 | sync_force_parallel_store(mddev_t *mddev, const char *buf, size_t len) | 4173 | sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len) |
4151 | { | 4174 | { |
4152 | long n; | 4175 | long n; |
4153 | 4176 | ||
@@ -4171,7 +4194,7 @@ __ATTR(sync_force_parallel, S_IRUGO|S_IWUSR, | |||
4171 | sync_force_parallel_show, sync_force_parallel_store); | 4194 | sync_force_parallel_show, sync_force_parallel_store); |
4172 | 4195 | ||
4173 | static ssize_t | 4196 | static ssize_t |
4174 | sync_speed_show(mddev_t *mddev, char *page) | 4197 | sync_speed_show(struct mddev *mddev, char *page) |
4175 | { | 4198 | { |
4176 | unsigned long resync, dt, db; | 4199 | unsigned long resync, dt, db; |
4177 | if (mddev->curr_resync == 0) | 4200 | if (mddev->curr_resync == 0) |
@@ -4186,7 +4209,7 @@ sync_speed_show(mddev_t *mddev, char *page) | |||
4186 | static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed); | 4209 | static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed); |
4187 | 4210 | ||
4188 | static ssize_t | 4211 | static ssize_t |
4189 | sync_completed_show(mddev_t *mddev, char *page) | 4212 | sync_completed_show(struct mddev *mddev, char *page) |
4190 | { | 4213 | { |
4191 | unsigned long long max_sectors, resync; | 4214 | unsigned long long max_sectors, resync; |
4192 | 4215 | ||
@@ -4205,13 +4228,13 @@ sync_completed_show(mddev_t *mddev, char *page) | |||
4205 | static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed); | 4228 | static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed); |
4206 | 4229 | ||
4207 | static ssize_t | 4230 | static ssize_t |
4208 | min_sync_show(mddev_t *mddev, char *page) | 4231 | min_sync_show(struct mddev *mddev, char *page) |
4209 | { | 4232 | { |
4210 | return sprintf(page, "%llu\n", | 4233 | return sprintf(page, "%llu\n", |
4211 | (unsigned long long)mddev->resync_min); | 4234 | (unsigned long long)mddev->resync_min); |
4212 | } | 4235 | } |
4213 | static ssize_t | 4236 | static ssize_t |
4214 | min_sync_store(mddev_t *mddev, const char *buf, size_t len) | 4237 | min_sync_store(struct mddev *mddev, const char *buf, size_t len) |
4215 | { | 4238 | { |
4216 | unsigned long long min; | 4239 | unsigned long long min; |
4217 | if (strict_strtoull(buf, 10, &min)) | 4240 | if (strict_strtoull(buf, 10, &min)) |
@@ -4236,7 +4259,7 @@ static struct md_sysfs_entry md_min_sync = | |||
4236 | __ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store); | 4259 | __ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store); |
4237 | 4260 | ||
4238 | static ssize_t | 4261 | static ssize_t |
4239 | max_sync_show(mddev_t *mddev, char *page) | 4262 | max_sync_show(struct mddev *mddev, char *page) |
4240 | { | 4263 | { |
4241 | if (mddev->resync_max == MaxSector) | 4264 | if (mddev->resync_max == MaxSector) |
4242 | return sprintf(page, "max\n"); | 4265 | return sprintf(page, "max\n"); |
@@ -4245,7 +4268,7 @@ max_sync_show(mddev_t *mddev, char *page) | |||
4245 | (unsigned long long)mddev->resync_max); | 4268 | (unsigned long long)mddev->resync_max); |
4246 | } | 4269 | } |
4247 | static ssize_t | 4270 | static ssize_t |
4248 | max_sync_store(mddev_t *mddev, const char *buf, size_t len) | 4271 | max_sync_store(struct mddev *mddev, const char *buf, size_t len) |
4249 | { | 4272 | { |
4250 | if (strncmp(buf, "max", 3) == 0) | 4273 | if (strncmp(buf, "max", 3) == 0) |
4251 | mddev->resync_max = MaxSector; | 4274 | mddev->resync_max = MaxSector; |
@@ -4276,13 +4299,13 @@ static struct md_sysfs_entry md_max_sync = | |||
4276 | __ATTR(sync_max, S_IRUGO|S_IWUSR, max_sync_show, max_sync_store); | 4299 | __ATTR(sync_max, S_IRUGO|S_IWUSR, max_sync_show, max_sync_store); |
4277 | 4300 | ||
4278 | static ssize_t | 4301 | static ssize_t |
4279 | suspend_lo_show(mddev_t *mddev, char *page) | 4302 | suspend_lo_show(struct mddev *mddev, char *page) |
4280 | { | 4303 | { |
4281 | return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo); | 4304 | return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo); |
4282 | } | 4305 | } |
4283 | 4306 | ||
4284 | static ssize_t | 4307 | static ssize_t |
4285 | suspend_lo_store(mddev_t *mddev, const char *buf, size_t len) | 4308 | suspend_lo_store(struct mddev *mddev, const char *buf, size_t len) |
4286 | { | 4309 | { |
4287 | char *e; | 4310 | char *e; |
4288 | unsigned long long new = simple_strtoull(buf, &e, 10); | 4311 | unsigned long long new = simple_strtoull(buf, &e, 10); |
@@ -4310,13 +4333,13 @@ __ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store); | |||
4310 | 4333 | ||
4311 | 4334 | ||
4312 | static ssize_t | 4335 | static ssize_t |
4313 | suspend_hi_show(mddev_t *mddev, char *page) | 4336 | suspend_hi_show(struct mddev *mddev, char *page) |
4314 | { | 4337 | { |
4315 | return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi); | 4338 | return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi); |
4316 | } | 4339 | } |
4317 | 4340 | ||
4318 | static ssize_t | 4341 | static ssize_t |
4319 | suspend_hi_store(mddev_t *mddev, const char *buf, size_t len) | 4342 | suspend_hi_store(struct mddev *mddev, const char *buf, size_t len) |
4320 | { | 4343 | { |
4321 | char *e; | 4344 | char *e; |
4322 | unsigned long long new = simple_strtoull(buf, &e, 10); | 4345 | unsigned long long new = simple_strtoull(buf, &e, 10); |
@@ -4343,7 +4366,7 @@ static struct md_sysfs_entry md_suspend_hi = | |||
4343 | __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store); | 4366 | __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store); |
4344 | 4367 | ||
4345 | static ssize_t | 4368 | static ssize_t |
4346 | reshape_position_show(mddev_t *mddev, char *page) | 4369 | reshape_position_show(struct mddev *mddev, char *page) |
4347 | { | 4370 | { |
4348 | if (mddev->reshape_position != MaxSector) | 4371 | if (mddev->reshape_position != MaxSector) |
4349 | return sprintf(page, "%llu\n", | 4372 | return sprintf(page, "%llu\n", |
@@ -4353,7 +4376,7 @@ reshape_position_show(mddev_t *mddev, char *page) | |||
4353 | } | 4376 | } |
4354 | 4377 | ||
4355 | static ssize_t | 4378 | static ssize_t |
4356 | reshape_position_store(mddev_t *mddev, const char *buf, size_t len) | 4379 | reshape_position_store(struct mddev *mddev, const char *buf, size_t len) |
4357 | { | 4380 | { |
4358 | char *e; | 4381 | char *e; |
4359 | unsigned long long new = simple_strtoull(buf, &e, 10); | 4382 | unsigned long long new = simple_strtoull(buf, &e, 10); |
@@ -4374,7 +4397,7 @@ __ATTR(reshape_position, S_IRUGO|S_IWUSR, reshape_position_show, | |||
4374 | reshape_position_store); | 4397 | reshape_position_store); |
4375 | 4398 | ||
4376 | static ssize_t | 4399 | static ssize_t |
4377 | array_size_show(mddev_t *mddev, char *page) | 4400 | array_size_show(struct mddev *mddev, char *page) |
4378 | { | 4401 | { |
4379 | if (mddev->external_size) | 4402 | if (mddev->external_size) |
4380 | return sprintf(page, "%llu\n", | 4403 | return sprintf(page, "%llu\n", |
@@ -4384,7 +4407,7 @@ array_size_show(mddev_t *mddev, char *page) | |||
4384 | } | 4407 | } |
4385 | 4408 | ||
4386 | static ssize_t | 4409 | static ssize_t |
4387 | array_size_store(mddev_t *mddev, const char *buf, size_t len) | 4410 | array_size_store(struct mddev *mddev, const char *buf, size_t len) |
4388 | { | 4411 | { |
4389 | sector_t sectors; | 4412 | sector_t sectors; |
4390 | 4413 | ||
@@ -4459,7 +4482,7 @@ static ssize_t | |||
4459 | md_attr_show(struct kobject *kobj, struct attribute *attr, char *page) | 4482 | md_attr_show(struct kobject *kobj, struct attribute *attr, char *page) |
4460 | { | 4483 | { |
4461 | struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr); | 4484 | struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr); |
4462 | mddev_t *mddev = container_of(kobj, struct mddev_s, kobj); | 4485 | struct mddev *mddev = container_of(kobj, struct mddev, kobj); |
4463 | ssize_t rv; | 4486 | ssize_t rv; |
4464 | 4487 | ||
4465 | if (!entry->show) | 4488 | if (!entry->show) |
@@ -4477,7 +4500,7 @@ md_attr_store(struct kobject *kobj, struct attribute *attr, | |||
4477 | const char *page, size_t length) | 4500 | const char *page, size_t length) |
4478 | { | 4501 | { |
4479 | struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr); | 4502 | struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr); |
4480 | mddev_t *mddev = container_of(kobj, struct mddev_s, kobj); | 4503 | struct mddev *mddev = container_of(kobj, struct mddev, kobj); |
4481 | ssize_t rv; | 4504 | ssize_t rv; |
4482 | 4505 | ||
4483 | if (!entry->store) | 4506 | if (!entry->store) |
@@ -4496,7 +4519,7 @@ md_attr_store(struct kobject *kobj, struct attribute *attr, | |||
4496 | 4519 | ||
4497 | static void md_free(struct kobject *ko) | 4520 | static void md_free(struct kobject *ko) |
4498 | { | 4521 | { |
4499 | mddev_t *mddev = container_of(ko, mddev_t, kobj); | 4522 | struct mddev *mddev = container_of(ko, struct mddev, kobj); |
4500 | 4523 | ||
4501 | if (mddev->sysfs_state) | 4524 | if (mddev->sysfs_state) |
4502 | sysfs_put(mddev->sysfs_state); | 4525 | sysfs_put(mddev->sysfs_state); |
@@ -4525,7 +4548,7 @@ int mdp_major = 0; | |||
4525 | 4548 | ||
4526 | static void mddev_delayed_delete(struct work_struct *ws) | 4549 | static void mddev_delayed_delete(struct work_struct *ws) |
4527 | { | 4550 | { |
4528 | mddev_t *mddev = container_of(ws, mddev_t, del_work); | 4551 | struct mddev *mddev = container_of(ws, struct mddev, del_work); |
4529 | 4552 | ||
4530 | sysfs_remove_group(&mddev->kobj, &md_bitmap_group); | 4553 | sysfs_remove_group(&mddev->kobj, &md_bitmap_group); |
4531 | kobject_del(&mddev->kobj); | 4554 | kobject_del(&mddev->kobj); |
@@ -4535,7 +4558,7 @@ static void mddev_delayed_delete(struct work_struct *ws) | |||
4535 | static int md_alloc(dev_t dev, char *name) | 4558 | static int md_alloc(dev_t dev, char *name) |
4536 | { | 4559 | { |
4537 | static DEFINE_MUTEX(disks_mutex); | 4560 | static DEFINE_MUTEX(disks_mutex); |
4538 | mddev_t *mddev = mddev_find(dev); | 4561 | struct mddev *mddev = mddev_find(dev); |
4539 | struct gendisk *disk; | 4562 | struct gendisk *disk; |
4540 | int partitioned; | 4563 | int partitioned; |
4541 | int shift; | 4564 | int shift; |
@@ -4562,7 +4585,7 @@ static int md_alloc(dev_t dev, char *name) | |||
4562 | if (name) { | 4585 | if (name) { |
4563 | /* Need to ensure that 'name' is not a duplicate. | 4586 | /* Need to ensure that 'name' is not a duplicate. |
4564 | */ | 4587 | */ |
4565 | mddev_t *mddev2; | 4588 | struct mddev *mddev2; |
4566 | spin_lock(&all_mddevs_lock); | 4589 | spin_lock(&all_mddevs_lock); |
4567 | 4590 | ||
4568 | list_for_each_entry(mddev2, &all_mddevs, all_mddevs) | 4591 | list_for_each_entry(mddev2, &all_mddevs, all_mddevs) |
@@ -4663,7 +4686,7 @@ static int add_named_array(const char *val, struct kernel_param *kp) | |||
4663 | 4686 | ||
4664 | static void md_safemode_timeout(unsigned long data) | 4687 | static void md_safemode_timeout(unsigned long data) |
4665 | { | 4688 | { |
4666 | mddev_t *mddev = (mddev_t *) data; | 4689 | struct mddev *mddev = (struct mddev *) data; |
4667 | 4690 | ||
4668 | if (!atomic_read(&mddev->writes_pending)) { | 4691 | if (!atomic_read(&mddev->writes_pending)) { |
4669 | mddev->safemode = 1; | 4692 | mddev->safemode = 1; |
@@ -4675,11 +4698,11 @@ static void md_safemode_timeout(unsigned long data) | |||
4675 | 4698 | ||
4676 | static int start_dirty_degraded; | 4699 | static int start_dirty_degraded; |
4677 | 4700 | ||
4678 | int md_run(mddev_t *mddev) | 4701 | int md_run(struct mddev *mddev) |
4679 | { | 4702 | { |
4680 | int err; | 4703 | int err; |
4681 | mdk_rdev_t *rdev; | 4704 | struct md_rdev *rdev; |
4682 | struct mdk_personality *pers; | 4705 | struct md_personality *pers; |
4683 | 4706 | ||
4684 | if (list_empty(&mddev->disks)) | 4707 | if (list_empty(&mddev->disks)) |
4685 | /* cannot run an array with no devices.. */ | 4708 | /* cannot run an array with no devices.. */ |
@@ -4743,7 +4766,7 @@ int md_run(mddev_t *mddev) | |||
4743 | 4766 | ||
4744 | if (mddev->bio_set == NULL) | 4767 | if (mddev->bio_set == NULL) |
4745 | mddev->bio_set = bioset_create(BIO_POOL_SIZE, | 4768 | mddev->bio_set = bioset_create(BIO_POOL_SIZE, |
4746 | sizeof(mddev_t *)); | 4769 | sizeof(struct mddev *)); |
4747 | 4770 | ||
4748 | spin_lock(&pers_lock); | 4771 | spin_lock(&pers_lock); |
4749 | pers = find_pers(mddev->level, mddev->clevel); | 4772 | pers = find_pers(mddev->level, mddev->clevel); |
@@ -4778,7 +4801,7 @@ int md_run(mddev_t *mddev) | |||
4778 | * configuration. | 4801 | * configuration. |
4779 | */ | 4802 | */ |
4780 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; | 4803 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; |
4781 | mdk_rdev_t *rdev2; | 4804 | struct md_rdev *rdev2; |
4782 | int warned = 0; | 4805 | int warned = 0; |
4783 | 4806 | ||
4784 | list_for_each_entry(rdev, &mddev->disks, same_set) | 4807 | list_for_each_entry(rdev, &mddev->disks, same_set) |
@@ -4877,7 +4900,7 @@ int md_run(mddev_t *mddev) | |||
4877 | } | 4900 | } |
4878 | EXPORT_SYMBOL_GPL(md_run); | 4901 | EXPORT_SYMBOL_GPL(md_run); |
4879 | 4902 | ||
4880 | static int do_md_run(mddev_t *mddev) | 4903 | static int do_md_run(struct mddev *mddev) |
4881 | { | 4904 | { |
4882 | int err; | 4905 | int err; |
4883 | 4906 | ||
@@ -4901,7 +4924,7 @@ out: | |||
4901 | return err; | 4924 | return err; |
4902 | } | 4925 | } |
4903 | 4926 | ||
4904 | static int restart_array(mddev_t *mddev) | 4927 | static int restart_array(struct mddev *mddev) |
4905 | { | 4928 | { |
4906 | struct gendisk *disk = mddev->gendisk; | 4929 | struct gendisk *disk = mddev->gendisk; |
4907 | 4930 | ||
@@ -4951,7 +4974,7 @@ void restore_bitmap_write_access(struct file *file) | |||
4951 | spin_unlock(&inode->i_lock); | 4974 | spin_unlock(&inode->i_lock); |
4952 | } | 4975 | } |
4953 | 4976 | ||
4954 | static void md_clean(mddev_t *mddev) | 4977 | static void md_clean(struct mddev *mddev) |
4955 | { | 4978 | { |
4956 | mddev->array_sectors = 0; | 4979 | mddev->array_sectors = 0; |
4957 | mddev->external_size = 0; | 4980 | mddev->external_size = 0; |
@@ -4994,7 +5017,7 @@ static void md_clean(mddev_t *mddev) | |||
4994 | mddev->bitmap_info.max_write_behind = 0; | 5017 | mddev->bitmap_info.max_write_behind = 0; |
4995 | } | 5018 | } |
4996 | 5019 | ||
4997 | static void __md_stop_writes(mddev_t *mddev) | 5020 | static void __md_stop_writes(struct mddev *mddev) |
4998 | { | 5021 | { |
4999 | if (mddev->sync_thread) { | 5022 | if (mddev->sync_thread) { |
5000 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 5023 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
@@ -5014,7 +5037,7 @@ static void __md_stop_writes(mddev_t *mddev) | |||
5014 | } | 5037 | } |
5015 | } | 5038 | } |
5016 | 5039 | ||
5017 | void md_stop_writes(mddev_t *mddev) | 5040 | void md_stop_writes(struct mddev *mddev) |
5018 | { | 5041 | { |
5019 | mddev_lock(mddev); | 5042 | mddev_lock(mddev); |
5020 | __md_stop_writes(mddev); | 5043 | __md_stop_writes(mddev); |
@@ -5022,7 +5045,7 @@ void md_stop_writes(mddev_t *mddev) | |||
5022 | } | 5045 | } |
5023 | EXPORT_SYMBOL_GPL(md_stop_writes); | 5046 | EXPORT_SYMBOL_GPL(md_stop_writes); |
5024 | 5047 | ||
5025 | void md_stop(mddev_t *mddev) | 5048 | void md_stop(struct mddev *mddev) |
5026 | { | 5049 | { |
5027 | mddev->ready = 0; | 5050 | mddev->ready = 0; |
5028 | mddev->pers->stop(mddev); | 5051 | mddev->pers->stop(mddev); |
@@ -5034,7 +5057,7 @@ void md_stop(mddev_t *mddev) | |||
5034 | } | 5057 | } |
5035 | EXPORT_SYMBOL_GPL(md_stop); | 5058 | EXPORT_SYMBOL_GPL(md_stop); |
5036 | 5059 | ||
5037 | static int md_set_readonly(mddev_t *mddev, int is_open) | 5060 | static int md_set_readonly(struct mddev *mddev, int is_open) |
5038 | { | 5061 | { |
5039 | int err = 0; | 5062 | int err = 0; |
5040 | mutex_lock(&mddev->open_mutex); | 5063 | mutex_lock(&mddev->open_mutex); |
@@ -5064,10 +5087,10 @@ out: | |||
5064 | * 0 - completely stop and dis-assemble array | 5087 | * 0 - completely stop and dis-assemble array |
5065 | * 2 - stop but do not disassemble array | 5088 | * 2 - stop but do not disassemble array |
5066 | */ | 5089 | */ |
5067 | static int do_md_stop(mddev_t * mddev, int mode, int is_open) | 5090 | static int do_md_stop(struct mddev * mddev, int mode, int is_open) |
5068 | { | 5091 | { |
5069 | struct gendisk *disk = mddev->gendisk; | 5092 | struct gendisk *disk = mddev->gendisk; |
5070 | mdk_rdev_t *rdev; | 5093 | struct md_rdev *rdev; |
5071 | 5094 | ||
5072 | mutex_lock(&mddev->open_mutex); | 5095 | mutex_lock(&mddev->open_mutex); |
5073 | if (atomic_read(&mddev->openers) > is_open || | 5096 | if (atomic_read(&mddev->openers) > is_open || |
@@ -5130,9 +5153,9 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
5130 | } | 5153 | } |
5131 | 5154 | ||
5132 | #ifndef MODULE | 5155 | #ifndef MODULE |
5133 | static void autorun_array(mddev_t *mddev) | 5156 | static void autorun_array(struct mddev *mddev) |
5134 | { | 5157 | { |
5135 | mdk_rdev_t *rdev; | 5158 | struct md_rdev *rdev; |
5136 | int err; | 5159 | int err; |
5137 | 5160 | ||
5138 | if (list_empty(&mddev->disks)) | 5161 | if (list_empty(&mddev->disks)) |
@@ -5167,8 +5190,8 @@ static void autorun_array(mddev_t *mddev) | |||
5167 | */ | 5190 | */ |
5168 | static void autorun_devices(int part) | 5191 | static void autorun_devices(int part) |
5169 | { | 5192 | { |
5170 | mdk_rdev_t *rdev0, *rdev, *tmp; | 5193 | struct md_rdev *rdev0, *rdev, *tmp; |
5171 | mddev_t *mddev; | 5194 | struct mddev *mddev; |
5172 | char b[BDEVNAME_SIZE]; | 5195 | char b[BDEVNAME_SIZE]; |
5173 | 5196 | ||
5174 | printk(KERN_INFO "md: autorun ...\n"); | 5197 | printk(KERN_INFO "md: autorun ...\n"); |
@@ -5177,7 +5200,7 @@ static void autorun_devices(int part) | |||
5177 | dev_t dev; | 5200 | dev_t dev; |
5178 | LIST_HEAD(candidates); | 5201 | LIST_HEAD(candidates); |
5179 | rdev0 = list_entry(pending_raid_disks.next, | 5202 | rdev0 = list_entry(pending_raid_disks.next, |
5180 | mdk_rdev_t, same_set); | 5203 | struct md_rdev, same_set); |
5181 | 5204 | ||
5182 | printk(KERN_INFO "md: considering %s ...\n", | 5205 | printk(KERN_INFO "md: considering %s ...\n", |
5183 | bdevname(rdev0->bdev,b)); | 5206 | bdevname(rdev0->bdev,b)); |
@@ -5263,11 +5286,11 @@ static int get_version(void __user * arg) | |||
5263 | return 0; | 5286 | return 0; |
5264 | } | 5287 | } |
5265 | 5288 | ||
5266 | static int get_array_info(mddev_t * mddev, void __user * arg) | 5289 | static int get_array_info(struct mddev * mddev, void __user * arg) |
5267 | { | 5290 | { |
5268 | mdu_array_info_t info; | 5291 | mdu_array_info_t info; |
5269 | int nr,working,insync,failed,spare; | 5292 | int nr,working,insync,failed,spare; |
5270 | mdk_rdev_t *rdev; | 5293 | struct md_rdev *rdev; |
5271 | 5294 | ||
5272 | nr=working=insync=failed=spare=0; | 5295 | nr=working=insync=failed=spare=0; |
5273 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 5296 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
@@ -5316,7 +5339,7 @@ static int get_array_info(mddev_t * mddev, void __user * arg) | |||
5316 | return 0; | 5339 | return 0; |
5317 | } | 5340 | } |
5318 | 5341 | ||
5319 | static int get_bitmap_file(mddev_t * mddev, void __user * arg) | 5342 | static int get_bitmap_file(struct mddev * mddev, void __user * arg) |
5320 | { | 5343 | { |
5321 | mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */ | 5344 | mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */ |
5322 | char *ptr, *buf = NULL; | 5345 | char *ptr, *buf = NULL; |
@@ -5356,10 +5379,10 @@ out: | |||
5356 | return err; | 5379 | return err; |
5357 | } | 5380 | } |
5358 | 5381 | ||
5359 | static int get_disk_info(mddev_t * mddev, void __user * arg) | 5382 | static int get_disk_info(struct mddev * mddev, void __user * arg) |
5360 | { | 5383 | { |
5361 | mdu_disk_info_t info; | 5384 | mdu_disk_info_t info; |
5362 | mdk_rdev_t *rdev; | 5385 | struct md_rdev *rdev; |
5363 | 5386 | ||
5364 | if (copy_from_user(&info, arg, sizeof(info))) | 5387 | if (copy_from_user(&info, arg, sizeof(info))) |
5365 | return -EFAULT; | 5388 | return -EFAULT; |
@@ -5390,10 +5413,10 @@ static int get_disk_info(mddev_t * mddev, void __user * arg) | |||
5390 | return 0; | 5413 | return 0; |
5391 | } | 5414 | } |
5392 | 5415 | ||
5393 | static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) | 5416 | static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info) |
5394 | { | 5417 | { |
5395 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; | 5418 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; |
5396 | mdk_rdev_t *rdev; | 5419 | struct md_rdev *rdev; |
5397 | dev_t dev = MKDEV(info->major,info->minor); | 5420 | dev_t dev = MKDEV(info->major,info->minor); |
5398 | 5421 | ||
5399 | if (info->major != MAJOR(dev) || info->minor != MINOR(dev)) | 5422 | if (info->major != MAJOR(dev) || info->minor != MINOR(dev)) |
@@ -5410,8 +5433,9 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) | |||
5410 | return PTR_ERR(rdev); | 5433 | return PTR_ERR(rdev); |
5411 | } | 5434 | } |
5412 | if (!list_empty(&mddev->disks)) { | 5435 | if (!list_empty(&mddev->disks)) { |
5413 | mdk_rdev_t *rdev0 = list_entry(mddev->disks.next, | 5436 | struct md_rdev *rdev0 |
5414 | mdk_rdev_t, same_set); | 5437 | = list_entry(mddev->disks.next, |
5438 | struct md_rdev, same_set); | ||
5415 | err = super_types[mddev->major_version] | 5439 | err = super_types[mddev->major_version] |
5416 | .load_super(rdev, rdev0, mddev->minor_version); | 5440 | .load_super(rdev, rdev0, mddev->minor_version); |
5417 | if (err < 0) { | 5441 | if (err < 0) { |
@@ -5561,10 +5585,10 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) | |||
5561 | return 0; | 5585 | return 0; |
5562 | } | 5586 | } |
5563 | 5587 | ||
5564 | static int hot_remove_disk(mddev_t * mddev, dev_t dev) | 5588 | static int hot_remove_disk(struct mddev * mddev, dev_t dev) |
5565 | { | 5589 | { |
5566 | char b[BDEVNAME_SIZE]; | 5590 | char b[BDEVNAME_SIZE]; |
5567 | mdk_rdev_t *rdev; | 5591 | struct md_rdev *rdev; |
5568 | 5592 | ||
5569 | rdev = find_rdev(mddev, dev); | 5593 | rdev = find_rdev(mddev, dev); |
5570 | if (!rdev) | 5594 | if (!rdev) |
@@ -5584,11 +5608,11 @@ busy: | |||
5584 | return -EBUSY; | 5608 | return -EBUSY; |
5585 | } | 5609 | } |
5586 | 5610 | ||
5587 | static int hot_add_disk(mddev_t * mddev, dev_t dev) | 5611 | static int hot_add_disk(struct mddev * mddev, dev_t dev) |
5588 | { | 5612 | { |
5589 | char b[BDEVNAME_SIZE]; | 5613 | char b[BDEVNAME_SIZE]; |
5590 | int err; | 5614 | int err; |
5591 | mdk_rdev_t *rdev; | 5615 | struct md_rdev *rdev; |
5592 | 5616 | ||
5593 | if (!mddev->pers) | 5617 | if (!mddev->pers) |
5594 | return -ENODEV; | 5618 | return -ENODEV; |
@@ -5658,7 +5682,7 @@ abort_export: | |||
5658 | return err; | 5682 | return err; |
5659 | } | 5683 | } |
5660 | 5684 | ||
5661 | static int set_bitmap_file(mddev_t *mddev, int fd) | 5685 | static int set_bitmap_file(struct mddev *mddev, int fd) |
5662 | { | 5686 | { |
5663 | int err; | 5687 | int err; |
5664 | 5688 | ||
@@ -5731,7 +5755,7 @@ static int set_bitmap_file(mddev_t *mddev, int fd) | |||
5731 | * The minor and patch _version numbers are also kept incase the | 5755 | * The minor and patch _version numbers are also kept incase the |
5732 | * super_block handler wishes to interpret them. | 5756 | * super_block handler wishes to interpret them. |
5733 | */ | 5757 | */ |
5734 | static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) | 5758 | static int set_array_info(struct mddev * mddev, mdu_array_info_t *info) |
5735 | { | 5759 | { |
5736 | 5760 | ||
5737 | if (info->raid_disks == 0) { | 5761 | if (info->raid_disks == 0) { |
@@ -5801,7 +5825,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) | |||
5801 | return 0; | 5825 | return 0; |
5802 | } | 5826 | } |
5803 | 5827 | ||
5804 | void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors) | 5828 | void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors) |
5805 | { | 5829 | { |
5806 | WARN(!mddev_is_locked(mddev), "%s: unlocked mddev!\n", __func__); | 5830 | WARN(!mddev_is_locked(mddev), "%s: unlocked mddev!\n", __func__); |
5807 | 5831 | ||
@@ -5812,9 +5836,9 @@ void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors) | |||
5812 | } | 5836 | } |
5813 | EXPORT_SYMBOL(md_set_array_sectors); | 5837 | EXPORT_SYMBOL(md_set_array_sectors); |
5814 | 5838 | ||
5815 | static int update_size(mddev_t *mddev, sector_t num_sectors) | 5839 | static int update_size(struct mddev *mddev, sector_t num_sectors) |
5816 | { | 5840 | { |
5817 | mdk_rdev_t *rdev; | 5841 | struct md_rdev *rdev; |
5818 | int rv; | 5842 | int rv; |
5819 | int fit = (num_sectors == 0); | 5843 | int fit = (num_sectors == 0); |
5820 | 5844 | ||
@@ -5850,7 +5874,7 @@ static int update_size(mddev_t *mddev, sector_t num_sectors) | |||
5850 | return rv; | 5874 | return rv; |
5851 | } | 5875 | } |
5852 | 5876 | ||
5853 | static int update_raid_disks(mddev_t *mddev, int raid_disks) | 5877 | static int update_raid_disks(struct mddev *mddev, int raid_disks) |
5854 | { | 5878 | { |
5855 | int rv; | 5879 | int rv; |
5856 | /* change the number of raid disks */ | 5880 | /* change the number of raid disks */ |
@@ -5878,7 +5902,7 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks) | |||
5878 | * Any differences that cannot be handled will cause an error. | 5902 | * Any differences that cannot be handled will cause an error. |
5879 | * Normally, only one change can be managed at a time. | 5903 | * Normally, only one change can be managed at a time. |
5880 | */ | 5904 | */ |
5881 | static int update_array_info(mddev_t *mddev, mdu_array_info_t *info) | 5905 | static int update_array_info(struct mddev *mddev, mdu_array_info_t *info) |
5882 | { | 5906 | { |
5883 | int rv = 0; | 5907 | int rv = 0; |
5884 | int cnt = 0; | 5908 | int cnt = 0; |
@@ -5971,9 +5995,9 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info) | |||
5971 | return rv; | 5995 | return rv; |
5972 | } | 5996 | } |
5973 | 5997 | ||
5974 | static int set_disk_faulty(mddev_t *mddev, dev_t dev) | 5998 | static int set_disk_faulty(struct mddev *mddev, dev_t dev) |
5975 | { | 5999 | { |
5976 | mdk_rdev_t *rdev; | 6000 | struct md_rdev *rdev; |
5977 | 6001 | ||
5978 | if (mddev->pers == NULL) | 6002 | if (mddev->pers == NULL) |
5979 | return -ENODEV; | 6003 | return -ENODEV; |
@@ -5983,6 +6007,8 @@ static int set_disk_faulty(mddev_t *mddev, dev_t dev) | |||
5983 | return -ENODEV; | 6007 | return -ENODEV; |
5984 | 6008 | ||
5985 | md_error(mddev, rdev); | 6009 | md_error(mddev, rdev); |
6010 | if (!test_bit(Faulty, &rdev->flags)) | ||
6011 | return -EBUSY; | ||
5986 | return 0; | 6012 | return 0; |
5987 | } | 6013 | } |
5988 | 6014 | ||
@@ -5994,7 +6020,7 @@ static int set_disk_faulty(mddev_t *mddev, dev_t dev) | |||
5994 | */ | 6020 | */ |
5995 | static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo) | 6021 | static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo) |
5996 | { | 6022 | { |
5997 | mddev_t *mddev = bdev->bd_disk->private_data; | 6023 | struct mddev *mddev = bdev->bd_disk->private_data; |
5998 | 6024 | ||
5999 | geo->heads = 2; | 6025 | geo->heads = 2; |
6000 | geo->sectors = 4; | 6026 | geo->sectors = 4; |
@@ -6007,7 +6033,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
6007 | { | 6033 | { |
6008 | int err = 0; | 6034 | int err = 0; |
6009 | void __user *argp = (void __user *)arg; | 6035 | void __user *argp = (void __user *)arg; |
6010 | mddev_t *mddev = NULL; | 6036 | struct mddev *mddev = NULL; |
6011 | int ro; | 6037 | int ro; |
6012 | 6038 | ||
6013 | if (!capable(CAP_SYS_ADMIN)) | 6039 | if (!capable(CAP_SYS_ADMIN)) |
@@ -6270,7 +6296,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
6270 | * Succeed if we can lock the mddev, which confirms that | 6296 | * Succeed if we can lock the mddev, which confirms that |
6271 | * it isn't being stopped right now. | 6297 | * it isn't being stopped right now. |
6272 | */ | 6298 | */ |
6273 | mddev_t *mddev = mddev_find(bdev->bd_dev); | 6299 | struct mddev *mddev = mddev_find(bdev->bd_dev); |
6274 | int err; | 6300 | int err; |
6275 | 6301 | ||
6276 | if (mddev->gendisk != bdev->bd_disk) { | 6302 | if (mddev->gendisk != bdev->bd_disk) { |
@@ -6299,7 +6325,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
6299 | 6325 | ||
6300 | static int md_release(struct gendisk *disk, fmode_t mode) | 6326 | static int md_release(struct gendisk *disk, fmode_t mode) |
6301 | { | 6327 | { |
6302 | mddev_t *mddev = disk->private_data; | 6328 | struct mddev *mddev = disk->private_data; |
6303 | 6329 | ||
6304 | BUG_ON(!mddev); | 6330 | BUG_ON(!mddev); |
6305 | atomic_dec(&mddev->openers); | 6331 | atomic_dec(&mddev->openers); |
@@ -6310,14 +6336,14 @@ static int md_release(struct gendisk *disk, fmode_t mode) | |||
6310 | 6336 | ||
6311 | static int md_media_changed(struct gendisk *disk) | 6337 | static int md_media_changed(struct gendisk *disk) |
6312 | { | 6338 | { |
6313 | mddev_t *mddev = disk->private_data; | 6339 | struct mddev *mddev = disk->private_data; |
6314 | 6340 | ||
6315 | return mddev->changed; | 6341 | return mddev->changed; |
6316 | } | 6342 | } |
6317 | 6343 | ||
6318 | static int md_revalidate(struct gendisk *disk) | 6344 | static int md_revalidate(struct gendisk *disk) |
6319 | { | 6345 | { |
6320 | mddev_t *mddev = disk->private_data; | 6346 | struct mddev *mddev = disk->private_data; |
6321 | 6347 | ||
6322 | mddev->changed = 0; | 6348 | mddev->changed = 0; |
6323 | return 0; | 6349 | return 0; |
@@ -6338,7 +6364,7 @@ static const struct block_device_operations md_fops = | |||
6338 | 6364 | ||
6339 | static int md_thread(void * arg) | 6365 | static int md_thread(void * arg) |
6340 | { | 6366 | { |
6341 | mdk_thread_t *thread = arg; | 6367 | struct md_thread *thread = arg; |
6342 | 6368 | ||
6343 | /* | 6369 | /* |
6344 | * md_thread is a 'system-thread', it's priority should be very | 6370 | * md_thread is a 'system-thread', it's priority should be very |
@@ -6377,21 +6403,21 @@ static int md_thread(void * arg) | |||
6377 | return 0; | 6403 | return 0; |
6378 | } | 6404 | } |
6379 | 6405 | ||
6380 | void md_wakeup_thread(mdk_thread_t *thread) | 6406 | void md_wakeup_thread(struct md_thread *thread) |
6381 | { | 6407 | { |
6382 | if (thread) { | 6408 | if (thread) { |
6383 | dprintk("md: waking up MD thread %s.\n", thread->tsk->comm); | 6409 | pr_debug("md: waking up MD thread %s.\n", thread->tsk->comm); |
6384 | set_bit(THREAD_WAKEUP, &thread->flags); | 6410 | set_bit(THREAD_WAKEUP, &thread->flags); |
6385 | wake_up(&thread->wqueue); | 6411 | wake_up(&thread->wqueue); |
6386 | } | 6412 | } |
6387 | } | 6413 | } |
6388 | 6414 | ||
6389 | mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev, | 6415 | struct md_thread *md_register_thread(void (*run) (struct mddev *), struct mddev *mddev, |
6390 | const char *name) | 6416 | const char *name) |
6391 | { | 6417 | { |
6392 | mdk_thread_t *thread; | 6418 | struct md_thread *thread; |
6393 | 6419 | ||
6394 | thread = kzalloc(sizeof(mdk_thread_t), GFP_KERNEL); | 6420 | thread = kzalloc(sizeof(struct md_thread), GFP_KERNEL); |
6395 | if (!thread) | 6421 | if (!thread) |
6396 | return NULL; | 6422 | return NULL; |
6397 | 6423 | ||
@@ -6411,17 +6437,24 @@ mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev, | |||
6411 | return thread; | 6437 | return thread; |
6412 | } | 6438 | } |
6413 | 6439 | ||
6414 | void md_unregister_thread(mdk_thread_t *thread) | 6440 | void md_unregister_thread(struct md_thread **threadp) |
6415 | { | 6441 | { |
6442 | struct md_thread *thread = *threadp; | ||
6416 | if (!thread) | 6443 | if (!thread) |
6417 | return; | 6444 | return; |
6418 | dprintk("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk)); | 6445 | pr_debug("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk)); |
6446 | /* Locking ensures that mddev_unlock does not wake_up a | ||
6447 | * non-existent thread | ||
6448 | */ | ||
6449 | spin_lock(&pers_lock); | ||
6450 | *threadp = NULL; | ||
6451 | spin_unlock(&pers_lock); | ||
6419 | 6452 | ||
6420 | kthread_stop(thread->tsk); | 6453 | kthread_stop(thread->tsk); |
6421 | kfree(thread); | 6454 | kfree(thread); |
6422 | } | 6455 | } |
6423 | 6456 | ||
6424 | void md_error(mddev_t *mddev, mdk_rdev_t *rdev) | 6457 | void md_error(struct mddev *mddev, struct md_rdev *rdev) |
6425 | { | 6458 | { |
6426 | if (!mddev) { | 6459 | if (!mddev) { |
6427 | MD_BUG(); | 6460 | MD_BUG(); |
@@ -6450,7 +6483,7 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
6450 | static void status_unused(struct seq_file *seq) | 6483 | static void status_unused(struct seq_file *seq) |
6451 | { | 6484 | { |
6452 | int i = 0; | 6485 | int i = 0; |
6453 | mdk_rdev_t *rdev; | 6486 | struct md_rdev *rdev; |
6454 | 6487 | ||
6455 | seq_printf(seq, "unused devices: "); | 6488 | seq_printf(seq, "unused devices: "); |
6456 | 6489 | ||
@@ -6467,7 +6500,7 @@ static void status_unused(struct seq_file *seq) | |||
6467 | } | 6500 | } |
6468 | 6501 | ||
6469 | 6502 | ||
6470 | static void status_resync(struct seq_file *seq, mddev_t * mddev) | 6503 | static void status_resync(struct seq_file *seq, struct mddev * mddev) |
6471 | { | 6504 | { |
6472 | sector_t max_sectors, resync, res; | 6505 | sector_t max_sectors, resync, res; |
6473 | unsigned long dt, db; | 6506 | unsigned long dt, db; |
@@ -6558,7 +6591,7 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos) | |||
6558 | { | 6591 | { |
6559 | struct list_head *tmp; | 6592 | struct list_head *tmp; |
6560 | loff_t l = *pos; | 6593 | loff_t l = *pos; |
6561 | mddev_t *mddev; | 6594 | struct mddev *mddev; |
6562 | 6595 | ||
6563 | if (l >= 0x10000) | 6596 | if (l >= 0x10000) |
6564 | return NULL; | 6597 | return NULL; |
@@ -6569,7 +6602,7 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos) | |||
6569 | spin_lock(&all_mddevs_lock); | 6602 | spin_lock(&all_mddevs_lock); |
6570 | list_for_each(tmp,&all_mddevs) | 6603 | list_for_each(tmp,&all_mddevs) |
6571 | if (!l--) { | 6604 | if (!l--) { |
6572 | mddev = list_entry(tmp, mddev_t, all_mddevs); | 6605 | mddev = list_entry(tmp, struct mddev, all_mddevs); |
6573 | mddev_get(mddev); | 6606 | mddev_get(mddev); |
6574 | spin_unlock(&all_mddevs_lock); | 6607 | spin_unlock(&all_mddevs_lock); |
6575 | return mddev; | 6608 | return mddev; |
@@ -6583,7 +6616,7 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos) | |||
6583 | static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 6616 | static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
6584 | { | 6617 | { |
6585 | struct list_head *tmp; | 6618 | struct list_head *tmp; |
6586 | mddev_t *next_mddev, *mddev = v; | 6619 | struct mddev *next_mddev, *mddev = v; |
6587 | 6620 | ||
6588 | ++*pos; | 6621 | ++*pos; |
6589 | if (v == (void*)2) | 6622 | if (v == (void*)2) |
@@ -6595,7 +6628,7 @@ static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
6595 | else | 6628 | else |
6596 | tmp = mddev->all_mddevs.next; | 6629 | tmp = mddev->all_mddevs.next; |
6597 | if (tmp != &all_mddevs) | 6630 | if (tmp != &all_mddevs) |
6598 | next_mddev = mddev_get(list_entry(tmp,mddev_t,all_mddevs)); | 6631 | next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs)); |
6599 | else { | 6632 | else { |
6600 | next_mddev = (void*)2; | 6633 | next_mddev = (void*)2; |
6601 | *pos = 0x10000; | 6634 | *pos = 0x10000; |
@@ -6610,7 +6643,7 @@ static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
6610 | 6643 | ||
6611 | static void md_seq_stop(struct seq_file *seq, void *v) | 6644 | static void md_seq_stop(struct seq_file *seq, void *v) |
6612 | { | 6645 | { |
6613 | mddev_t *mddev = v; | 6646 | struct mddev *mddev = v; |
6614 | 6647 | ||
6615 | if (mddev && v != (void*)1 && v != (void*)2) | 6648 | if (mddev && v != (void*)1 && v != (void*)2) |
6616 | mddev_put(mddev); | 6649 | mddev_put(mddev); |
@@ -6618,13 +6651,13 @@ static void md_seq_stop(struct seq_file *seq, void *v) | |||
6618 | 6651 | ||
6619 | static int md_seq_show(struct seq_file *seq, void *v) | 6652 | static int md_seq_show(struct seq_file *seq, void *v) |
6620 | { | 6653 | { |
6621 | mddev_t *mddev = v; | 6654 | struct mddev *mddev = v; |
6622 | sector_t sectors; | 6655 | sector_t sectors; |
6623 | mdk_rdev_t *rdev; | 6656 | struct md_rdev *rdev; |
6624 | struct bitmap *bitmap; | 6657 | struct bitmap *bitmap; |
6625 | 6658 | ||
6626 | if (v == (void*)1) { | 6659 | if (v == (void*)1) { |
6627 | struct mdk_personality *pers; | 6660 | struct md_personality *pers; |
6628 | seq_printf(seq, "Personalities : "); | 6661 | seq_printf(seq, "Personalities : "); |
6629 | spin_lock(&pers_lock); | 6662 | spin_lock(&pers_lock); |
6630 | list_for_each_entry(pers, &pers_list, list) | 6663 | list_for_each_entry(pers, &pers_list, list) |
@@ -6780,7 +6813,7 @@ static const struct file_operations md_seq_fops = { | |||
6780 | .poll = mdstat_poll, | 6813 | .poll = mdstat_poll, |
6781 | }; | 6814 | }; |
6782 | 6815 | ||
6783 | int register_md_personality(struct mdk_personality *p) | 6816 | int register_md_personality(struct md_personality *p) |
6784 | { | 6817 | { |
6785 | spin_lock(&pers_lock); | 6818 | spin_lock(&pers_lock); |
6786 | list_add_tail(&p->list, &pers_list); | 6819 | list_add_tail(&p->list, &pers_list); |
@@ -6789,7 +6822,7 @@ int register_md_personality(struct mdk_personality *p) | |||
6789 | return 0; | 6822 | return 0; |
6790 | } | 6823 | } |
6791 | 6824 | ||
6792 | int unregister_md_personality(struct mdk_personality *p) | 6825 | int unregister_md_personality(struct md_personality *p) |
6793 | { | 6826 | { |
6794 | printk(KERN_INFO "md: %s personality unregistered\n", p->name); | 6827 | printk(KERN_INFO "md: %s personality unregistered\n", p->name); |
6795 | spin_lock(&pers_lock); | 6828 | spin_lock(&pers_lock); |
@@ -6798,9 +6831,9 @@ int unregister_md_personality(struct mdk_personality *p) | |||
6798 | return 0; | 6831 | return 0; |
6799 | } | 6832 | } |
6800 | 6833 | ||
6801 | static int is_mddev_idle(mddev_t *mddev, int init) | 6834 | static int is_mddev_idle(struct mddev *mddev, int init) |
6802 | { | 6835 | { |
6803 | mdk_rdev_t * rdev; | 6836 | struct md_rdev * rdev; |
6804 | int idle; | 6837 | int idle; |
6805 | int curr_events; | 6838 | int curr_events; |
6806 | 6839 | ||
@@ -6842,7 +6875,7 @@ static int is_mddev_idle(mddev_t *mddev, int init) | |||
6842 | return idle; | 6875 | return idle; |
6843 | } | 6876 | } |
6844 | 6877 | ||
6845 | void md_done_sync(mddev_t *mddev, int blocks, int ok) | 6878 | void md_done_sync(struct mddev *mddev, int blocks, int ok) |
6846 | { | 6879 | { |
6847 | /* another "blocks" (512byte) blocks have been synced */ | 6880 | /* another "blocks" (512byte) blocks have been synced */ |
6848 | atomic_sub(blocks, &mddev->recovery_active); | 6881 | atomic_sub(blocks, &mddev->recovery_active); |
@@ -6860,7 +6893,7 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok) | |||
6860 | * in superblock) before writing, schedule a superblock update | 6893 | * in superblock) before writing, schedule a superblock update |
6861 | * and wait for it to complete. | 6894 | * and wait for it to complete. |
6862 | */ | 6895 | */ |
6863 | void md_write_start(mddev_t *mddev, struct bio *bi) | 6896 | void md_write_start(struct mddev *mddev, struct bio *bi) |
6864 | { | 6897 | { |
6865 | int did_change = 0; | 6898 | int did_change = 0; |
6866 | if (bio_data_dir(bi) != WRITE) | 6899 | if (bio_data_dir(bi) != WRITE) |
@@ -6895,7 +6928,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
6895 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); | 6928 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); |
6896 | } | 6929 | } |
6897 | 6930 | ||
6898 | void md_write_end(mddev_t *mddev) | 6931 | void md_write_end(struct mddev *mddev) |
6899 | { | 6932 | { |
6900 | if (atomic_dec_and_test(&mddev->writes_pending)) { | 6933 | if (atomic_dec_and_test(&mddev->writes_pending)) { |
6901 | if (mddev->safemode == 2) | 6934 | if (mddev->safemode == 2) |
@@ -6914,7 +6947,7 @@ void md_write_end(mddev_t *mddev) | |||
6914 | * In the ->external case MD_CHANGE_CLEAN can not be cleared until mddev->lock | 6947 | * In the ->external case MD_CHANGE_CLEAN can not be cleared until mddev->lock |
6915 | * is dropped, so return -EAGAIN after notifying userspace. | 6948 | * is dropped, so return -EAGAIN after notifying userspace. |
6916 | */ | 6949 | */ |
6917 | int md_allow_write(mddev_t *mddev) | 6950 | int md_allow_write(struct mddev *mddev) |
6918 | { | 6951 | { |
6919 | if (!mddev->pers) | 6952 | if (!mddev->pers) |
6920 | return 0; | 6953 | return 0; |
@@ -6946,9 +6979,9 @@ EXPORT_SYMBOL_GPL(md_allow_write); | |||
6946 | 6979 | ||
6947 | #define SYNC_MARKS 10 | 6980 | #define SYNC_MARKS 10 |
6948 | #define SYNC_MARK_STEP (3*HZ) | 6981 | #define SYNC_MARK_STEP (3*HZ) |
6949 | void md_do_sync(mddev_t *mddev) | 6982 | void md_do_sync(struct mddev *mddev) |
6950 | { | 6983 | { |
6951 | mddev_t *mddev2; | 6984 | struct mddev *mddev2; |
6952 | unsigned int currspeed = 0, | 6985 | unsigned int currspeed = 0, |
6953 | window; | 6986 | window; |
6954 | sector_t max_sectors,j, io_sectors; | 6987 | sector_t max_sectors,j, io_sectors; |
@@ -6958,7 +6991,7 @@ void md_do_sync(mddev_t *mddev) | |||
6958 | struct list_head *tmp; | 6991 | struct list_head *tmp; |
6959 | sector_t last_check; | 6992 | sector_t last_check; |
6960 | int skipped = 0; | 6993 | int skipped = 0; |
6961 | mdk_rdev_t *rdev; | 6994 | struct md_rdev *rdev; |
6962 | char *desc; | 6995 | char *desc; |
6963 | 6996 | ||
6964 | /* just incase thread restarts... */ | 6997 | /* just incase thread restarts... */ |
@@ -7273,9 +7306,9 @@ void md_do_sync(mddev_t *mddev) | |||
7273 | } | 7306 | } |
7274 | EXPORT_SYMBOL_GPL(md_do_sync); | 7307 | EXPORT_SYMBOL_GPL(md_do_sync); |
7275 | 7308 | ||
7276 | static int remove_and_add_spares(mddev_t *mddev) | 7309 | static int remove_and_add_spares(struct mddev *mddev) |
7277 | { | 7310 | { |
7278 | mdk_rdev_t *rdev; | 7311 | struct md_rdev *rdev; |
7279 | int spares = 0; | 7312 | int spares = 0; |
7280 | 7313 | ||
7281 | mddev->curr_resync_completed = 0; | 7314 | mddev->curr_resync_completed = 0; |
@@ -7317,13 +7350,12 @@ static int remove_and_add_spares(mddev_t *mddev) | |||
7317 | return spares; | 7350 | return spares; |
7318 | } | 7351 | } |
7319 | 7352 | ||
7320 | static void reap_sync_thread(mddev_t *mddev) | 7353 | static void reap_sync_thread(struct mddev *mddev) |
7321 | { | 7354 | { |
7322 | mdk_rdev_t *rdev; | 7355 | struct md_rdev *rdev; |
7323 | 7356 | ||
7324 | /* resync has finished, collect result */ | 7357 | /* resync has finished, collect result */ |
7325 | md_unregister_thread(mddev->sync_thread); | 7358 | md_unregister_thread(&mddev->sync_thread); |
7326 | mddev->sync_thread = NULL; | ||
7327 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && | 7359 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && |
7328 | !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { | 7360 | !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { |
7329 | /* success...*/ | 7361 | /* success...*/ |
@@ -7335,15 +7367,19 @@ static void reap_sync_thread(mddev_t *mddev) | |||
7335 | if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && | 7367 | if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && |
7336 | mddev->pers->finish_reshape) | 7368 | mddev->pers->finish_reshape) |
7337 | mddev->pers->finish_reshape(mddev); | 7369 | mddev->pers->finish_reshape(mddev); |
7338 | md_update_sb(mddev, 1); | ||
7339 | 7370 | ||
7340 | /* if array is no-longer degraded, then any saved_raid_disk | 7371 | /* If array is no-longer degraded, then any saved_raid_disk |
7341 | * information must be scrapped | 7372 | * information must be scrapped. Also if any device is now |
7373 | * In_sync we must scrape the saved_raid_disk for that device | ||
7374 | * do the superblock for an incrementally recovered device | ||
7375 | * written out. | ||
7342 | */ | 7376 | */ |
7343 | if (!mddev->degraded) | 7377 | list_for_each_entry(rdev, &mddev->disks, same_set) |
7344 | list_for_each_entry(rdev, &mddev->disks, same_set) | 7378 | if (!mddev->degraded || |
7379 | test_bit(In_sync, &rdev->flags)) | ||
7345 | rdev->saved_raid_disk = -1; | 7380 | rdev->saved_raid_disk = -1; |
7346 | 7381 | ||
7382 | md_update_sb(mddev, 1); | ||
7347 | clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); | 7383 | clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
7348 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 7384 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
7349 | clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); | 7385 | clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); |
@@ -7379,7 +7415,7 @@ static void reap_sync_thread(mddev_t *mddev) | |||
7379 | * 5/ If array is degraded, try to add spares devices | 7415 | * 5/ If array is degraded, try to add spares devices |
7380 | * 6/ If array has spares or is not in-sync, start a resync thread. | 7416 | * 6/ If array has spares or is not in-sync, start a resync thread. |
7381 | */ | 7417 | */ |
7382 | void md_check_recovery(mddev_t *mddev) | 7418 | void md_check_recovery(struct mddev *mddev) |
7383 | { | 7419 | { |
7384 | if (mddev->suspended) | 7420 | if (mddev->suspended) |
7385 | return; | 7421 | return; |
@@ -7415,7 +7451,7 @@ void md_check_recovery(mddev_t *mddev) | |||
7415 | /* Only thing we do on a ro array is remove | 7451 | /* Only thing we do on a ro array is remove |
7416 | * failed devices. | 7452 | * failed devices. |
7417 | */ | 7453 | */ |
7418 | mdk_rdev_t *rdev; | 7454 | struct md_rdev *rdev; |
7419 | list_for_each_entry(rdev, &mddev->disks, same_set) | 7455 | list_for_each_entry(rdev, &mddev->disks, same_set) |
7420 | if (rdev->raid_disk >= 0 && | 7456 | if (rdev->raid_disk >= 0 && |
7421 | !test_bit(Blocked, &rdev->flags) && | 7457 | !test_bit(Blocked, &rdev->flags) && |
@@ -7539,7 +7575,7 @@ void md_check_recovery(mddev_t *mddev) | |||
7539 | } | 7575 | } |
7540 | } | 7576 | } |
7541 | 7577 | ||
7542 | void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev) | 7578 | void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev) |
7543 | { | 7579 | { |
7544 | sysfs_notify_dirent_safe(rdev->sysfs_state); | 7580 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
7545 | wait_event_timeout(rdev->blocked_wait, | 7581 | wait_event_timeout(rdev->blocked_wait, |
@@ -7797,7 +7833,7 @@ static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors, | |||
7797 | return rv; | 7833 | return rv; |
7798 | } | 7834 | } |
7799 | 7835 | ||
7800 | int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors, | 7836 | int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors, |
7801 | int acknowledged) | 7837 | int acknowledged) |
7802 | { | 7838 | { |
7803 | int rv = md_set_badblocks(&rdev->badblocks, | 7839 | int rv = md_set_badblocks(&rdev->badblocks, |
@@ -7906,7 +7942,7 @@ out: | |||
7906 | return rv; | 7942 | return rv; |
7907 | } | 7943 | } |
7908 | 7944 | ||
7909 | int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors) | 7945 | int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors) |
7910 | { | 7946 | { |
7911 | return md_clear_badblocks(&rdev->badblocks, | 7947 | return md_clear_badblocks(&rdev->badblocks, |
7912 | s + rdev->data_offset, | 7948 | s + rdev->data_offset, |
@@ -8040,13 +8076,14 @@ static int md_notify_reboot(struct notifier_block *this, | |||
8040 | unsigned long code, void *x) | 8076 | unsigned long code, void *x) |
8041 | { | 8077 | { |
8042 | struct list_head *tmp; | 8078 | struct list_head *tmp; |
8043 | mddev_t *mddev; | 8079 | struct mddev *mddev; |
8080 | int need_delay = 0; | ||
8044 | 8081 | ||
8045 | if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) { | 8082 | if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) { |
8046 | 8083 | ||
8047 | printk(KERN_INFO "md: stopping all md devices.\n"); | 8084 | printk(KERN_INFO "md: stopping all md devices.\n"); |
8048 | 8085 | ||
8049 | for_each_mddev(mddev, tmp) | 8086 | for_each_mddev(mddev, tmp) { |
8050 | if (mddev_trylock(mddev)) { | 8087 | if (mddev_trylock(mddev)) { |
8051 | /* Force a switch to readonly even array | 8088 | /* Force a switch to readonly even array |
8052 | * appears to still be in use. Hence | 8089 | * appears to still be in use. Hence |
@@ -8055,13 +8092,16 @@ static int md_notify_reboot(struct notifier_block *this, | |||
8055 | md_set_readonly(mddev, 100); | 8092 | md_set_readonly(mddev, 100); |
8056 | mddev_unlock(mddev); | 8093 | mddev_unlock(mddev); |
8057 | } | 8094 | } |
8095 | need_delay = 1; | ||
8096 | } | ||
8058 | /* | 8097 | /* |
8059 | * certain more exotic SCSI devices are known to be | 8098 | * certain more exotic SCSI devices are known to be |
8060 | * volatile wrt too early system reboots. While the | 8099 | * volatile wrt too early system reboots. While the |
8061 | * right place to handle this issue is the given | 8100 | * right place to handle this issue is the given |
8062 | * driver, we do want to have a safe RAID driver ... | 8101 | * driver, we do want to have a safe RAID driver ... |
8063 | */ | 8102 | */ |
8064 | mdelay(1000*1); | 8103 | if (need_delay) |
8104 | mdelay(1000*1); | ||
8065 | } | 8105 | } |
8066 | return NOTIFY_DONE; | 8106 | return NOTIFY_DONE; |
8067 | } | 8107 | } |
@@ -8074,7 +8114,7 @@ static struct notifier_block md_notifier = { | |||
8074 | 8114 | ||
8075 | static void md_geninit(void) | 8115 | static void md_geninit(void) |
8076 | { | 8116 | { |
8077 | dprintk("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t)); | 8117 | pr_debug("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t)); |
8078 | 8118 | ||
8079 | proc_create("mdstat", S_IRUGO, NULL, &md_seq_fops); | 8119 | proc_create("mdstat", S_IRUGO, NULL, &md_seq_fops); |
8080 | } | 8120 | } |
@@ -8149,7 +8189,7 @@ void md_autodetect_dev(dev_t dev) | |||
8149 | 8189 | ||
8150 | static void autostart_arrays(int part) | 8190 | static void autostart_arrays(int part) |
8151 | { | 8191 | { |
8152 | mdk_rdev_t *rdev; | 8192 | struct md_rdev *rdev; |
8153 | struct detected_devices_node *node_detected_dev; | 8193 | struct detected_devices_node *node_detected_dev; |
8154 | dev_t dev; | 8194 | dev_t dev; |
8155 | int i_scanned, i_passed; | 8195 | int i_scanned, i_passed; |
@@ -8189,7 +8229,7 @@ static void autostart_arrays(int part) | |||
8189 | 8229 | ||
8190 | static __exit void md_exit(void) | 8230 | static __exit void md_exit(void) |
8191 | { | 8231 | { |
8192 | mddev_t *mddev; | 8232 | struct mddev *mddev; |
8193 | struct list_head *tmp; | 8233 | struct list_head *tmp; |
8194 | 8234 | ||
8195 | blk_unregister_region(MKDEV(MD_MAJOR,0), 1U << MINORBITS); | 8235 | blk_unregister_region(MKDEV(MD_MAJOR,0), 1U << MINORBITS); |