Lines Matching refs:mddev

90 static int remove_and_add_spares(struct mddev *mddev,
92 static void mddev_detach(struct mddev *mddev);
117 static inline int speed_min(struct mddev *mddev) in speed_min() argument
119 return mddev->sync_speed_min ? in speed_min()
120 mddev->sync_speed_min : sysctl_speed_limit_min; in speed_min()
123 static inline int speed_max(struct mddev *mddev) in speed_max() argument
125 return mddev->sync_speed_max ? in speed_max()
126 mddev->sync_speed_max : sysctl_speed_limit_max; in speed_max()
138 static void rdevs_uninit_serial(struct mddev *mddev) in rdevs_uninit_serial() argument
142 rdev_for_each(rdev, mddev) in rdevs_uninit_serial()
174 static int rdevs_init_serial(struct mddev *mddev) in rdevs_init_serial() argument
179 rdev_for_each(rdev, mddev) { in rdevs_init_serial()
186 if (ret && !mddev->serial_info_pool) in rdevs_init_serial()
187 rdevs_uninit_serial(mddev); in rdevs_init_serial()
199 return (rdev && rdev->mddev->bitmap_info.max_write_behind > 0 && in rdev_need_serial()
209 void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev, in mddev_create_serial_pool() argument
219 mddev_suspend(mddev); in mddev_create_serial_pool()
222 ret = rdevs_init_serial(mddev); in mddev_create_serial_pool()
228 if (mddev->serial_info_pool == NULL) { in mddev_create_serial_pool()
233 mddev->serial_info_pool = in mddev_create_serial_pool()
236 if (!mddev->serial_info_pool) { in mddev_create_serial_pool()
237 rdevs_uninit_serial(mddev); in mddev_create_serial_pool()
244 mddev_resume(mddev); in mddev_create_serial_pool()
253 void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev, in mddev_destroy_serial_pool() argument
259 if (mddev->serial_info_pool) { in mddev_destroy_serial_pool()
264 mddev_suspend(mddev); in mddev_destroy_serial_pool()
265 rdev_for_each(temp, mddev) { in mddev_destroy_serial_pool()
267 if (!mddev->serialize_policy || in mddev_destroy_serial_pool()
283 mempool_destroy(mddev->serial_info_pool); in mddev_destroy_serial_pool()
284 mddev->serial_info_pool = NULL; in mddev_destroy_serial_pool()
287 mddev_resume(mddev); in mddev_destroy_serial_pool()
355 void md_new_event(struct mddev *mddev) in md_new_event() argument
382 mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\
385 _mddev = list_entry(_tmp, struct mddev, all_mddevs); \
398 static bool is_suspended(struct mddev *mddev, struct bio *bio) in is_suspended() argument
400 if (mddev->suspended) in is_suspended()
404 if (mddev->suspend_lo >= mddev->suspend_hi) in is_suspended()
406 if (bio->bi_iter.bi_sector >= mddev->suspend_hi) in is_suspended()
408 if (bio_end_sector(bio) < mddev->suspend_lo) in is_suspended()
413 void md_handle_request(struct mddev *mddev, struct bio *bio) in md_handle_request() argument
417 if (is_suspended(mddev, bio)) { in md_handle_request()
420 prepare_to_wait(&mddev->sb_wait, &__wait, in md_handle_request()
422 if (!is_suspended(mddev, bio)) in md_handle_request()
428 finish_wait(&mddev->sb_wait, &__wait); in md_handle_request()
430 atomic_inc(&mddev->active_io); in md_handle_request()
433 if (!mddev->pers->make_request(mddev, bio)) { in md_handle_request()
434 atomic_dec(&mddev->active_io); in md_handle_request()
435 wake_up(&mddev->sb_wait); in md_handle_request()
439 if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) in md_handle_request()
440 wake_up(&mddev->sb_wait); in md_handle_request()
447 struct mddev *mddev = bio->bi_bdev->bd_disk->private_data; in md_submit_bio() local
449 if (mddev == NULL || mddev->pers == NULL) { in md_submit_bio()
454 if (unlikely(test_bit(MD_BROKEN, &mddev->flags)) && (rw == WRITE)) { in md_submit_bio()
461 if (mddev->ro == 1 && unlikely(rw == WRITE)) { in md_submit_bio()
471 md_handle_request(mddev, bio); in md_submit_bio()
482 void mddev_suspend(struct mddev *mddev) in mddev_suspend() argument
484 WARN_ON_ONCE(mddev->thread && current == mddev->thread->tsk); in mddev_suspend()
485 lockdep_assert_held(&mddev->reconfig_mutex); in mddev_suspend()
486 if (mddev->suspended++) in mddev_suspend()
489 wake_up(&mddev->sb_wait); in mddev_suspend()
490 set_bit(MD_ALLOW_SB_UPDATE, &mddev->flags); in mddev_suspend()
492 wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); in mddev_suspend()
493 mddev->pers->quiesce(mddev, 1); in mddev_suspend()
494 clear_bit_unlock(MD_ALLOW_SB_UPDATE, &mddev->flags); in mddev_suspend()
495 wait_event(mddev->sb_wait, !test_bit(MD_UPDATING_SB, &mddev->flags)); in mddev_suspend()
497 del_timer_sync(&mddev->safemode_timer); in mddev_suspend()
499 mddev->noio_flag = memalloc_noio_save(); in mddev_suspend()
503 void mddev_resume(struct mddev *mddev) in mddev_resume() argument
506 memalloc_noio_restore(mddev->noio_flag); in mddev_resume()
507 lockdep_assert_held(&mddev->reconfig_mutex); in mddev_resume()
508 if (--mddev->suspended) in mddev_resume()
510 wake_up(&mddev->sb_wait); in mddev_resume()
511 mddev->pers->quiesce(mddev, 0); in mddev_resume()
513 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in mddev_resume()
514 md_wakeup_thread(mddev->thread); in mddev_resume()
515 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ in mddev_resume()
526 struct mddev *mddev = rdev->mddev; in md_end_flush() local
528 rdev_dec_pending(rdev, mddev); in md_end_flush()
530 if (atomic_dec_and_test(&mddev->flush_pending)) { in md_end_flush()
532 queue_work(md_wq, &mddev->flush_work); in md_end_flush()
541 struct mddev *mddev = container_of(ws, struct mddev, flush_work); in submit_flushes() local
544 mddev->start_flush = ktime_get_boottime(); in submit_flushes()
545 INIT_WORK(&mddev->flush_work, md_submit_flush_data); in submit_flushes()
546 atomic_set(&mddev->flush_pending, 1); in submit_flushes()
548 rdev_for_each_rcu(rdev, mddev) in submit_flushes()
559 bi = bio_alloc_bioset(GFP_NOIO, 0, &mddev->bio_set); in submit_flushes()
564 atomic_inc(&mddev->flush_pending); in submit_flushes()
567 rdev_dec_pending(rdev, mddev); in submit_flushes()
570 if (atomic_dec_and_test(&mddev->flush_pending)) in submit_flushes()
571 queue_work(md_wq, &mddev->flush_work); in submit_flushes()
576 struct mddev *mddev = container_of(ws, struct mddev, flush_work); in md_submit_flush_data() local
577 struct bio *bio = mddev->flush_bio; in md_submit_flush_data()
585 spin_lock_irq(&mddev->lock); in md_submit_flush_data()
586 mddev->prev_flush_start = mddev->start_flush; in md_submit_flush_data()
587 mddev->flush_bio = NULL; in md_submit_flush_data()
588 spin_unlock_irq(&mddev->lock); in md_submit_flush_data()
589 wake_up(&mddev->sb_wait); in md_submit_flush_data()
596 md_handle_request(mddev, bio); in md_submit_flush_data()
606 bool md_flush_request(struct mddev *mddev, struct bio *bio) in md_flush_request() argument
609 spin_lock_irq(&mddev->lock); in md_flush_request()
613 wait_event_lock_irq(mddev->sb_wait, in md_flush_request()
614 !mddev->flush_bio || in md_flush_request()
615 ktime_before(req_start, mddev->prev_flush_start), in md_flush_request()
616 mddev->lock); in md_flush_request()
618 if (ktime_after(req_start, mddev->prev_flush_start)) { in md_flush_request()
619 WARN_ON(mddev->flush_bio); in md_flush_request()
620 mddev->flush_bio = bio; in md_flush_request()
623 spin_unlock_irq(&mddev->lock); in md_flush_request()
626 INIT_WORK(&mddev->flush_work, submit_flushes); in md_flush_request()
627 queue_work(md_wq, &mddev->flush_work); in md_flush_request()
642 static inline struct mddev *mddev_get(struct mddev *mddev) in mddev_get() argument
644 atomic_inc(&mddev->active); in mddev_get()
645 return mddev; in mddev_get()
650 static void mddev_put(struct mddev *mddev) in mddev_put() argument
652 if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock)) in mddev_put()
654 if (!mddev->raid_disks && list_empty(&mddev->disks) && in mddev_put()
655 mddev->ctime == 0 && !mddev->hold_active) { in mddev_put()
658 list_del_init(&mddev->all_mddevs); in mddev_put()
665 INIT_WORK(&mddev->del_work, mddev_delayed_delete); in mddev_put()
666 queue_work(md_misc_wq, &mddev->del_work); in mddev_put()
673 void mddev_init(struct mddev *mddev) in mddev_init() argument
675 kobject_init(&mddev->kobj, &md_ktype); in mddev_init()
676 mutex_init(&mddev->open_mutex); in mddev_init()
677 mutex_init(&mddev->reconfig_mutex); in mddev_init()
678 mutex_init(&mddev->bitmap_info.mutex); in mddev_init()
679 INIT_LIST_HEAD(&mddev->disks); in mddev_init()
680 INIT_LIST_HEAD(&mddev->all_mddevs); in mddev_init()
681 timer_setup(&mddev->safemode_timer, md_safemode_timeout, 0); in mddev_init()
682 atomic_set(&mddev->active, 1); in mddev_init()
683 atomic_set(&mddev->openers, 0); in mddev_init()
684 atomic_set(&mddev->active_io, 0); in mddev_init()
685 spin_lock_init(&mddev->lock); in mddev_init()
686 atomic_set(&mddev->flush_pending, 0); in mddev_init()
687 init_waitqueue_head(&mddev->sb_wait); in mddev_init()
688 init_waitqueue_head(&mddev->recovery_wait); in mddev_init()
689 mddev->reshape_position = MaxSector; in mddev_init()
690 mddev->reshape_backwards = 0; in mddev_init()
691 mddev->last_sync_action = "none"; in mddev_init()
692 mddev->resync_min = 0; in mddev_init()
693 mddev->resync_max = MaxSector; in mddev_init()
694 mddev->level = LEVEL_NONE; in mddev_init()
698 static struct mddev *mddev_find_locked(dev_t unit) in mddev_find_locked()
700 struct mddev *mddev; in mddev_find_locked() local
702 list_for_each_entry(mddev, &all_mddevs, all_mddevs) in mddev_find_locked()
703 if (mddev->unit == unit) in mddev_find_locked()
704 return mddev; in mddev_find_locked()
730 static struct mddev *mddev_find(dev_t unit) in mddev_find()
732 struct mddev *mddev; in mddev_find() local
738 mddev = mddev_find_locked(unit); in mddev_find()
739 if (mddev) in mddev_find()
740 mddev_get(mddev); in mddev_find()
743 return mddev; in mddev_find()
746 static struct mddev *mddev_alloc(dev_t unit) in mddev_alloc()
748 struct mddev *new; in mddev_alloc()
790 void mddev_unlock(struct mddev *mddev) in mddev_unlock() argument
792 if (mddev->to_remove) { in mddev_unlock()
805 const struct attribute_group *to_remove = mddev->to_remove; in mddev_unlock()
806 mddev->to_remove = NULL; in mddev_unlock()
807 mddev->sysfs_active = 1; in mddev_unlock()
808 mutex_unlock(&mddev->reconfig_mutex); in mddev_unlock()
810 if (mddev->kobj.sd) { in mddev_unlock()
812 sysfs_remove_group(&mddev->kobj, to_remove); in mddev_unlock()
813 if (mddev->pers == NULL || in mddev_unlock()
814 mddev->pers->sync_request == NULL) { in mddev_unlock()
815 sysfs_remove_group(&mddev->kobj, &md_redundancy_group); in mddev_unlock()
816 if (mddev->sysfs_action) in mddev_unlock()
817 sysfs_put(mddev->sysfs_action); in mddev_unlock()
818 if (mddev->sysfs_completed) in mddev_unlock()
819 sysfs_put(mddev->sysfs_completed); in mddev_unlock()
820 if (mddev->sysfs_degraded) in mddev_unlock()
821 sysfs_put(mddev->sysfs_degraded); in mddev_unlock()
822 mddev->sysfs_action = NULL; in mddev_unlock()
823 mddev->sysfs_completed = NULL; in mddev_unlock()
824 mddev->sysfs_degraded = NULL; in mddev_unlock()
827 mddev->sysfs_active = 0; in mddev_unlock()
829 mutex_unlock(&mddev->reconfig_mutex); in mddev_unlock()
835 md_wakeup_thread(mddev->thread); in mddev_unlock()
836 wake_up(&mddev->sb_wait); in mddev_unlock()
841 struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr) in md_find_rdev_nr_rcu() argument
845 rdev_for_each_rcu(rdev, mddev) in md_find_rdev_nr_rcu()
853 static struct md_rdev *find_rdev(struct mddev *mddev, dev_t dev) in find_rdev() argument
857 rdev_for_each(rdev, mddev) in find_rdev()
864 struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev) in md_find_rdev_rcu() argument
868 rdev_for_each_rcu(rdev, mddev) in md_find_rdev_rcu()
923 struct mddev *mddev = rdev->mddev; in super_written() local
928 md_error(mddev, rdev); in super_written()
931 set_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags); in super_written()
937 if (atomic_dec_and_test(&mddev->pending_writes)) in super_written()
938 wake_up(&mddev->sb_wait); in super_written()
939 rdev_dec_pending(rdev, mddev); in super_written()
943 void md_super_write(struct mddev *mddev, struct md_rdev *rdev, in md_super_write() argument
961 bio = bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set); in md_super_write()
971 if (test_bit(MD_FAILFAST_SUPPORTED, &mddev->flags) && in md_super_write()
977 atomic_inc(&mddev->pending_writes); in md_super_write()
981 int md_super_wait(struct mddev *mddev) in md_super_wait() argument
984 wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0); in md_super_wait()
985 if (test_and_clear_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags)) in md_super_wait()
1005 else if (rdev->mddev->reshape_position != MaxSector && in sync_page_io()
1006 (rdev->mddev->reshape_backwards == in sync_page_io()
1007 (sector >= rdev->mddev->reshape_position))) in sync_page_io()
1146 int (*validate_super)(struct mddev *mddev,
1148 void (*sync_super)(struct mddev *mddev,
1164 int md_check_no_bitmap(struct mddev *mddev) in md_check_no_bitmap() argument
1166 if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset) in md_check_no_bitmap()
1169 mdname(mddev), mddev->pers->name); in md_check_no_bitmap()
1286 static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) in super_90_validate() argument
1298 if (mddev->raid_disks == 0) { in super_90_validate()
1299 mddev->major_version = 0; in super_90_validate()
1300 mddev->minor_version = sb->minor_version; in super_90_validate()
1301 mddev->patch_version = sb->patch_version; in super_90_validate()
1302 mddev->external = 0; in super_90_validate()
1303 mddev->chunk_sectors = sb->chunk_size >> 9; in super_90_validate()
1304 mddev->ctime = sb->ctime; in super_90_validate()
1305 mddev->utime = sb->utime; in super_90_validate()
1306 mddev->level = sb->level; in super_90_validate()
1307 mddev->clevel[0] = 0; in super_90_validate()
1308 mddev->layout = sb->layout; in super_90_validate()
1309 mddev->raid_disks = sb->raid_disks; in super_90_validate()
1310 mddev->dev_sectors = ((sector_t)sb->size) * 2; in super_90_validate()
1311 mddev->events = ev1; in super_90_validate()
1312 mddev->bitmap_info.offset = 0; in super_90_validate()
1313 mddev->bitmap_info.space = 0; in super_90_validate()
1315 mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; in super_90_validate()
1316 mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9); in super_90_validate()
1317 mddev->reshape_backwards = 0; in super_90_validate()
1319 if (mddev->minor_version >= 91) { in super_90_validate()
1320 mddev->reshape_position = sb->reshape_position; in super_90_validate()
1321 mddev->delta_disks = sb->delta_disks; in super_90_validate()
1322 mddev->new_level = sb->new_level; in super_90_validate()
1323 mddev->new_layout = sb->new_layout; in super_90_validate()
1324 mddev->new_chunk_sectors = sb->new_chunk >> 9; in super_90_validate()
1325 if (mddev->delta_disks < 0) in super_90_validate()
1326 mddev->reshape_backwards = 1; in super_90_validate()
1328 mddev->reshape_position = MaxSector; in super_90_validate()
1329 mddev->delta_disks = 0; in super_90_validate()
1330 mddev->new_level = mddev->level; in super_90_validate()
1331 mddev->new_layout = mddev->layout; in super_90_validate()
1332 mddev->new_chunk_sectors = mddev->chunk_sectors; in super_90_validate()
1334 if (mddev->level == 0) in super_90_validate()
1335 mddev->layout = -1; in super_90_validate()
1338 mddev->recovery_cp = MaxSector; in super_90_validate()
1342 mddev->recovery_cp = sb->recovery_cp; in super_90_validate()
1344 mddev->recovery_cp = 0; in super_90_validate()
1347 memcpy(mddev->uuid+0, &sb->set_uuid0, 4); in super_90_validate()
1348 memcpy(mddev->uuid+4, &sb->set_uuid1, 4); in super_90_validate()
1349 memcpy(mddev->uuid+8, &sb->set_uuid2, 4); in super_90_validate()
1350 memcpy(mddev->uuid+12,&sb->set_uuid3, 4); in super_90_validate()
1352 mddev->max_disks = MD_SB_DISKS; in super_90_validate()
1355 mddev->bitmap_info.file == NULL) { in super_90_validate()
1356 mddev->bitmap_info.offset = in super_90_validate()
1357 mddev->bitmap_info.default_offset; in super_90_validate()
1358 mddev->bitmap_info.space = in super_90_validate()
1359 mddev->bitmap_info.default_space; in super_90_validate()
1362 } else if (mddev->pers == NULL) { in super_90_validate()
1368 if (ev1 < mddev->events) in super_90_validate()
1370 } else if (mddev->bitmap) { in super_90_validate()
1374 if (ev1 < mddev->bitmap->events_cleared) in super_90_validate()
1376 if (ev1 < mddev->events) in super_90_validate()
1379 if (ev1 < mddev->events) in super_90_validate()
1384 if (mddev->level != LEVEL_MULTIPATH) { in super_90_validate()
1398 if (mddev->minor_version >= 91) { in super_90_validate()
1415 static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev) in super_90_sync() argument
1419 int next_spare = mddev->raid_disks; in super_90_sync()
1441 sb->major_version = mddev->major_version; in super_90_sync()
1442 sb->patch_version = mddev->patch_version; in super_90_sync()
1444 memcpy(&sb->set_uuid0, mddev->uuid+0, 4); in super_90_sync()
1445 memcpy(&sb->set_uuid1, mddev->uuid+4, 4); in super_90_sync()
1446 memcpy(&sb->set_uuid2, mddev->uuid+8, 4); in super_90_sync()
1447 memcpy(&sb->set_uuid3, mddev->uuid+12,4); in super_90_sync()
1449 sb->ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX); in super_90_sync()
1450 sb->level = mddev->level; in super_90_sync()
1451 sb->size = mddev->dev_sectors / 2; in super_90_sync()
1452 sb->raid_disks = mddev->raid_disks; in super_90_sync()
1453 sb->md_minor = mddev->md_minor; in super_90_sync()
1455 sb->utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX); in super_90_sync()
1457 sb->events_hi = (mddev->events>>32); in super_90_sync()
1458 sb->events_lo = (u32)mddev->events; in super_90_sync()
1460 if (mddev->reshape_position == MaxSector) in super_90_sync()
1464 sb->reshape_position = mddev->reshape_position; in super_90_sync()
1465 sb->new_level = mddev->new_level; in super_90_sync()
1466 sb->delta_disks = mddev->delta_disks; in super_90_sync()
1467 sb->new_layout = mddev->new_layout; in super_90_sync()
1468 sb->new_chunk = mddev->new_chunk_sectors << 9; in super_90_sync()
1470 mddev->minor_version = sb->minor_version; in super_90_sync()
1471 if (mddev->in_sync) in super_90_sync()
1473 sb->recovery_cp = mddev->recovery_cp; in super_90_sync()
1474 sb->cp_events_hi = (mddev->events>>32); in super_90_sync()
1475 sb->cp_events_lo = (u32)mddev->events; in super_90_sync()
1476 if (mddev->recovery_cp == MaxSector) in super_90_sync()
1481 sb->layout = mddev->layout; in super_90_sync()
1482 sb->chunk_size = mddev->chunk_sectors << 9; in super_90_sync()
1484 if (mddev->bitmap && mddev->bitmap_info.file == NULL) in super_90_sync()
1488 rdev_for_each(rdev2, mddev) { in super_90_sync()
1536 for (i=0 ; i < mddev->raid_disks ; i++) { in super_90_sync()
1562 if (num_sectors && num_sectors < rdev->mddev->dev_sectors) in super_90_rdev_size_change()
1564 if (rdev->mddev->bitmap_info.offset) in super_90_rdev_size_change()
1572 if ((u64)num_sectors >= (2ULL << 32) && rdev->mddev->level >= 1) in super_90_rdev_size_change()
1575 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, in super_90_rdev_size_change()
1577 } while (md_super_wait(rdev->mddev) < 0); in super_90_rdev_size_change()
1801 static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) in super_1_validate() argument
1812 if (mddev->raid_disks == 0) { in super_1_validate()
1813 mddev->major_version = 1; in super_1_validate()
1814 mddev->patch_version = 0; in super_1_validate()
1815 mddev->external = 0; in super_1_validate()
1816 mddev->chunk_sectors = le32_to_cpu(sb->chunksize); in super_1_validate()
1817 mddev->ctime = le64_to_cpu(sb->ctime); in super_1_validate()
1818 mddev->utime = le64_to_cpu(sb->utime); in super_1_validate()
1819 mddev->level = le32_to_cpu(sb->level); in super_1_validate()
1820 mddev->clevel[0] = 0; in super_1_validate()
1821 mddev->layout = le32_to_cpu(sb->layout); in super_1_validate()
1822 mddev->raid_disks = le32_to_cpu(sb->raid_disks); in super_1_validate()
1823 mddev->dev_sectors = le64_to_cpu(sb->size); in super_1_validate()
1824 mddev->events = ev1; in super_1_validate()
1825 mddev->bitmap_info.offset = 0; in super_1_validate()
1826 mddev->bitmap_info.space = 0; in super_1_validate()
1830 mddev->bitmap_info.default_offset = 1024 >> 9; in super_1_validate()
1831 mddev->bitmap_info.default_space = (4096-1024) >> 9; in super_1_validate()
1832 mddev->reshape_backwards = 0; in super_1_validate()
1834 mddev->recovery_cp = le64_to_cpu(sb->resync_offset); in super_1_validate()
1835 memcpy(mddev->uuid, sb->set_uuid, 16); in super_1_validate()
1837 mddev->max_disks = (4096-256)/2; in super_1_validate()
1840 mddev->bitmap_info.file == NULL) { in super_1_validate()
1841 mddev->bitmap_info.offset = in super_1_validate()
1848 if (mddev->minor_version > 0) in super_1_validate()
1849 mddev->bitmap_info.space = 0; in super_1_validate()
1850 else if (mddev->bitmap_info.offset > 0) in super_1_validate()
1851 mddev->bitmap_info.space = in super_1_validate()
1852 8 - mddev->bitmap_info.offset; in super_1_validate()
1854 mddev->bitmap_info.space = in super_1_validate()
1855 -mddev->bitmap_info.offset; in super_1_validate()
1859 mddev->reshape_position = le64_to_cpu(sb->reshape_position); in super_1_validate()
1860 mddev->delta_disks = le32_to_cpu(sb->delta_disks); in super_1_validate()
1861 mddev->new_level = le32_to_cpu(sb->new_level); in super_1_validate()
1862 mddev->new_layout = le32_to_cpu(sb->new_layout); in super_1_validate()
1863 mddev->new_chunk_sectors = le32_to_cpu(sb->new_chunk); in super_1_validate()
1864 if (mddev->delta_disks < 0 || in super_1_validate()
1865 (mddev->delta_disks == 0 && in super_1_validate()
1868 mddev->reshape_backwards = 1; in super_1_validate()
1870 mddev->reshape_position = MaxSector; in super_1_validate()
1871 mddev->delta_disks = 0; in super_1_validate()
1872 mddev->new_level = mddev->level; in super_1_validate()
1873 mddev->new_layout = mddev->layout; in super_1_validate()
1874 mddev->new_chunk_sectors = mddev->chunk_sectors; in super_1_validate()
1877 if (mddev->level == 0 && in super_1_validate()
1879 mddev->layout = -1; in super_1_validate()
1882 set_bit(MD_HAS_JOURNAL, &mddev->flags); in super_1_validate()
1893 set_bit(MD_HAS_PPL, &mddev->flags); in super_1_validate()
1895 } else if (mddev->pers == NULL) { in super_1_validate()
1903 if (ev1 < mddev->events) in super_1_validate()
1905 } else if (mddev->bitmap) { in super_1_validate()
1909 if (ev1 < mddev->bitmap->events_cleared) in super_1_validate()
1911 if (ev1 < mddev->events) in super_1_validate()
1914 if (ev1 < mddev->events) in super_1_validate()
1918 if (mddev->level != LEVEL_MULTIPATH) { in super_1_validate()
1956 &mddev->recovery)) in super_1_validate()
1974 static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev) in super_1_sync() argument
1988 sb->utime = cpu_to_le64((__u64)mddev->utime); in super_1_sync()
1989 sb->events = cpu_to_le64(mddev->events); in super_1_sync()
1990 if (mddev->in_sync) in super_1_sync()
1991 sb->resync_offset = cpu_to_le64(mddev->recovery_cp); in super_1_sync()
1992 else if (test_bit(MD_JOURNAL_CLEAN, &mddev->flags)) in super_1_sync()
1999 sb->raid_disks = cpu_to_le32(mddev->raid_disks); in super_1_sync()
2000 sb->size = cpu_to_le64(mddev->dev_sectors); in super_1_sync()
2001 sb->chunksize = cpu_to_le32(mddev->chunk_sectors); in super_1_sync()
2002 sb->level = cpu_to_le32(mddev->level); in super_1_sync()
2003 sb->layout = cpu_to_le32(mddev->layout); in super_1_sync()
2016 if (mddev->bitmap && mddev->bitmap_info.file == NULL) { in super_1_sync()
2017 sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset); in super_1_sync()
2027 if (rdev->saved_raid_disk >= 0 && mddev->bitmap) in super_1_sync()
2038 if (mddev->reshape_position != MaxSector) { in super_1_sync()
2040 sb->reshape_position = cpu_to_le64(mddev->reshape_position); in super_1_sync()
2041 sb->new_layout = cpu_to_le32(mddev->new_layout); in super_1_sync()
2042 sb->delta_disks = cpu_to_le32(mddev->delta_disks); in super_1_sync()
2043 sb->new_level = cpu_to_le32(mddev->new_level); in super_1_sync()
2044 sb->new_chunk = cpu_to_le32(mddev->new_chunk_sectors); in super_1_sync()
2045 if (mddev->delta_disks == 0 && in super_1_sync()
2046 mddev->reshape_backwards) in super_1_sync()
2057 if (mddev_is_clustered(mddev)) in super_1_sync()
2064 md_error(mddev, rdev); in super_1_sync()
2095 rdev_for_each(rdev2, mddev) in super_1_sync()
2112 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) in super_1_sync()
2115 if (test_bit(MD_HAS_PPL, &mddev->flags)) { in super_1_sync()
2116 if (test_bit(MD_HAS_MULTIPLE_PPLS, &mddev->flags)) in super_1_sync()
2125 rdev_for_each(rdev2, mddev) { in super_1_sync()
2165 if (num_sectors && num_sectors < rdev->mddev->dev_sectors) in super_1_rdev_size_change()
2175 } else if (rdev->mddev->bitmap_info.offset) { in super_1_rdev_size_change()
2202 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, in super_1_rdev_size_change()
2204 } while (md_super_wait(rdev->mddev) < 0); in super_1_rdev_size_change()
2220 if (rdev->mddev->minor_version == 0) in super_1_allow_new_offset()
2231 bitmap = rdev->mddev->bitmap; in super_1_allow_new_offset()
2232 if (bitmap && !rdev->mddev->bitmap_info.file && in super_1_allow_new_offset()
2233 rdev->sb_start + rdev->mddev->bitmap_info.offset + in super_1_allow_new_offset()
2263 static void sync_super(struct mddev *mddev, struct md_rdev *rdev) in sync_super() argument
2265 if (mddev->sync_super) { in sync_super()
2266 mddev->sync_super(mddev, rdev); in sync_super()
2270 BUG_ON(mddev->major_version >= ARRAY_SIZE(super_types)); in sync_super()
2272 super_types[mddev->major_version].sync_super(mddev, rdev); in sync_super()
2275 static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2) in match_mddev_units()
2309 int md_integrity_register(struct mddev *mddev) in md_integrity_register() argument
2313 if (list_empty(&mddev->disks)) in md_integrity_register()
2315 if (!mddev->gendisk || blk_get_integrity(mddev->gendisk)) in md_integrity_register()
2317 rdev_for_each(rdev, mddev) { in md_integrity_register()
2339 blk_integrity_register(mddev->gendisk, in md_integrity_register()
2342 pr_debug("md: data integrity enabled on %s\n", mdname(mddev)); in md_integrity_register()
2343 if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE) || in md_integrity_register()
2344 (mddev->level != 1 && mddev->level != 10 && in md_integrity_register()
2345 bioset_integrity_create(&mddev->io_acct_set, BIO_POOL_SIZE))) { in md_integrity_register()
2353 mdname(mddev)); in md_integrity_register()
2364 int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev) in md_integrity_add_rdev() argument
2369 if (!mddev->gendisk) in md_integrity_add_rdev()
2372 bi_mddev = blk_get_integrity(mddev->gendisk); in md_integrity_add_rdev()
2377 if (blk_integrity_compare(mddev->gendisk, rdev->bdev->bd_disk) != 0) { in md_integrity_add_rdev()
2379 mdname(mddev), bdevname(rdev->bdev, name)); in md_integrity_add_rdev()
2393 static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev) in bind_rdev_to_array() argument
2399 if (find_rdev(mddev, rdev->bdev->bd_dev)) in bind_rdev_to_array()
2402 if (rdev_read_only(rdev) && mddev->pers) in bind_rdev_to_array()
2408 (mddev->dev_sectors == 0 || rdev->sectors < mddev->dev_sectors)) { in bind_rdev_to_array()
2409 if (mddev->pers) { in bind_rdev_to_array()
2414 if (mddev->level > 0) in bind_rdev_to_array()
2417 mddev->dev_sectors = rdev->sectors; in bind_rdev_to_array()
2427 if (mddev->pers) in bind_rdev_to_array()
2428 choice = mddev->raid_disks; in bind_rdev_to_array()
2429 while (md_find_rdev_nr_rcu(mddev, choice)) in bind_rdev_to_array()
2433 if (md_find_rdev_nr_rcu(mddev, rdev->desc_nr)) { in bind_rdev_to_array()
2440 mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { in bind_rdev_to_array()
2442 mdname(mddev), mddev->max_disks); in bind_rdev_to_array()
2448 rdev->mddev = mddev; in bind_rdev_to_array()
2451 if (mddev->raid_disks) in bind_rdev_to_array()
2452 mddev_create_serial_pool(mddev, rdev, false); in bind_rdev_to_array()
2454 if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b))) in bind_rdev_to_array()
2465 list_add_rcu(&rdev->same_set, &mddev->disks); in bind_rdev_to_array()
2466 bd_link_disk_holder(rdev->bdev, mddev->gendisk); in bind_rdev_to_array()
2469 mddev->recovery_disabled++; in bind_rdev_to_array()
2475 b, mdname(mddev)); in bind_rdev_to_array()
2490 bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk); in unbind_rdev_from_array()
2493 mddev_destroy_serial_pool(rdev->mddev, rdev, false); in unbind_rdev_from_array()
2494 rdev->mddev = NULL; in unbind_rdev_from_array()
2564 static void export_array(struct mddev *mddev) in export_array() argument
2568 while (!list_empty(&mddev->disks)) { in export_array()
2569 rdev = list_first_entry(&mddev->disks, struct md_rdev, in export_array()
2573 mddev->raid_disks = 0; in export_array()
2574 mddev->major_version = 0; in export_array()
2577 static bool set_in_sync(struct mddev *mddev) in set_in_sync() argument
2579 lockdep_assert_held(&mddev->lock); in set_in_sync()
2580 if (!mddev->in_sync) { in set_in_sync()
2581 mddev->sync_checkers++; in set_in_sync()
2582 spin_unlock(&mddev->lock); in set_in_sync()
2583 percpu_ref_switch_to_atomic_sync(&mddev->writes_pending); in set_in_sync()
2584 spin_lock(&mddev->lock); in set_in_sync()
2585 if (!mddev->in_sync && in set_in_sync()
2586 percpu_ref_is_zero(&mddev->writes_pending)) { in set_in_sync()
2587 mddev->in_sync = 1; in set_in_sync()
2593 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in set_in_sync()
2594 sysfs_notify_dirent_safe(mddev->sysfs_state); in set_in_sync()
2596 if (--mddev->sync_checkers == 0) in set_in_sync()
2597 percpu_ref_switch_to_percpu(&mddev->writes_pending); in set_in_sync()
2599 if (mddev->safemode == 1) in set_in_sync()
2600 mddev->safemode = 0; in set_in_sync()
2601 return mddev->in_sync; in set_in_sync()
2604 static void sync_sbs(struct mddev *mddev, int nospares) in sync_sbs() argument
2613 rdev_for_each(rdev, mddev) { in sync_sbs()
2614 if (rdev->sb_events == mddev->events || in sync_sbs()
2617 rdev->sb_events+1 == mddev->events)) { in sync_sbs()
2621 sync_super(mddev, rdev); in sync_sbs()
2627 static bool does_sb_need_changing(struct mddev *mddev) in does_sb_need_changing() argument
2634 rdev_for_each(rdev, mddev) in does_sb_need_changing()
2644 rdev_for_each(rdev, mddev) { in does_sb_need_changing()
2656 if ((mddev->dev_sectors != le64_to_cpu(sb->size)) || in does_sb_need_changing()
2657 (mddev->reshape_position != le64_to_cpu(sb->reshape_position)) || in does_sb_need_changing()
2658 (mddev->layout != le32_to_cpu(sb->layout)) || in does_sb_need_changing()
2659 (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) || in does_sb_need_changing()
2660 (mddev->chunk_sectors != le32_to_cpu(sb->chunksize))) in does_sb_need_changing()
2666 void md_update_sb(struct mddev *mddev, int force_change) in md_update_sb() argument
2674 if (mddev->ro) { in md_update_sb()
2676 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_update_sb()
2681 if (mddev_is_clustered(mddev)) { in md_update_sb()
2682 if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) in md_update_sb()
2684 if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags)) in md_update_sb()
2686 ret = md_cluster_ops->metadata_update_start(mddev); in md_update_sb()
2688 if (!does_sb_need_changing(mddev)) { in md_update_sb()
2690 md_cluster_ops->metadata_update_cancel(mddev); in md_update_sb()
2691 bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING), in md_update_sb()
2704 rdev_for_each(rdev, mddev) { in md_update_sb()
2706 mddev->delta_disks >= 0 && in md_update_sb()
2707 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in md_update_sb()
2708 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery) && in md_update_sb()
2709 !test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_update_sb()
2712 mddev->curr_resync_completed > rdev->recovery_offset) in md_update_sb()
2713 rdev->recovery_offset = mddev->curr_resync_completed; in md_update_sb()
2716 if (!mddev->persistent) { in md_update_sb()
2717 clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_update_sb()
2718 clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_update_sb()
2719 if (!mddev->external) { in md_update_sb()
2720 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_update_sb()
2721 rdev_for_each(rdev, mddev) { in md_update_sb()
2725 md_error(mddev, rdev); in md_update_sb()
2732 wake_up(&mddev->sb_wait); in md_update_sb()
2736 spin_lock(&mddev->lock); in md_update_sb()
2738 mddev->utime = ktime_get_real_seconds(); in md_update_sb()
2740 if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) in md_update_sb()
2742 if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags)) in md_update_sb()
2750 if (mddev->degraded) in md_update_sb()
2762 sync_req = mddev->in_sync; in md_update_sb()
2767 && (mddev->in_sync && mddev->recovery_cp == MaxSector) in md_update_sb()
2768 && mddev->can_decrease_events in md_update_sb()
2769 && mddev->events != 1) { in md_update_sb()
2770 mddev->events--; in md_update_sb()
2771 mddev->can_decrease_events = 0; in md_update_sb()
2774 mddev->events ++; in md_update_sb()
2775 mddev->can_decrease_events = nospares; in md_update_sb()
2783 WARN_ON(mddev->events == 0); in md_update_sb()
2785 rdev_for_each(rdev, mddev) { in md_update_sb()
2792 sync_sbs(mddev, nospares); in md_update_sb()
2793 spin_unlock(&mddev->lock); in md_update_sb()
2796 mdname(mddev), mddev->in_sync); in md_update_sb()
2798 if (mddev->queue) in md_update_sb()
2799 blk_add_trace_msg(mddev->queue, "md md_update_sb"); in md_update_sb()
2801 md_bitmap_update_sb(mddev->bitmap); in md_update_sb()
2802 rdev_for_each(rdev, mddev) { in md_update_sb()
2809 md_super_write(mddev,rdev, in md_update_sb()
2815 rdev->sb_events = mddev->events; in md_update_sb()
2817 md_super_write(mddev, rdev, in md_update_sb()
2828 if (mddev->level == LEVEL_MULTIPATH) in md_update_sb()
2832 if (md_super_wait(mddev) < 0) in md_update_sb()
2836 if (mddev_is_clustered(mddev) && ret == 0) in md_update_sb()
2837 md_cluster_ops->metadata_update_finish(mddev); in md_update_sb()
2839 if (mddev->in_sync != sync_req || in md_update_sb()
2840 !bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING), in md_update_sb()
2844 wake_up(&mddev->sb_wait); in md_update_sb()
2845 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in md_update_sb()
2846 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_update_sb()
2848 rdev_for_each(rdev, mddev) { in md_update_sb()
2862 struct mddev *mddev = rdev->mddev; in add_bound_rdev() local
2866 if (!mddev->pers->hot_remove_disk || add_journal) { in add_bound_rdev()
2871 super_types[mddev->major_version]. in add_bound_rdev()
2872 validate_super(mddev, rdev); in add_bound_rdev()
2874 mddev_suspend(mddev); in add_bound_rdev()
2875 err = mddev->pers->hot_add_disk(mddev, rdev); in add_bound_rdev()
2877 mddev_resume(mddev); in add_bound_rdev()
2885 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in add_bound_rdev()
2886 if (mddev->degraded) in add_bound_rdev()
2887 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in add_bound_rdev()
2888 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in add_bound_rdev()
2889 md_new_event(mddev); in add_bound_rdev()
2890 md_wakeup_thread(mddev->thread); in add_bound_rdev()
2980 if (cmd_match(buf, "faulty") && rdev->mddev->pers) { in state_store()
2981 md_error(rdev->mddev, rdev); in state_store()
2987 if (rdev->mddev->pers) { in state_store()
2989 remove_and_add_spares(rdev->mddev, rdev); in state_store()
2994 struct mddev *mddev = rdev->mddev; in state_store() local
2996 if (mddev_is_clustered(mddev)) in state_store()
2997 err = md_cluster_ops->remove_disk(mddev, rdev); in state_store()
3001 if (mddev->pers) { in state_store()
3002 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in state_store()
3003 md_wakeup_thread(mddev->thread); in state_store()
3005 md_new_event(mddev); in state_store()
3010 mddev_create_serial_pool(rdev->mddev, rdev, false); in state_store()
3013 mddev_destroy_serial_pool(rdev->mddev, rdev, false); in state_store()
3026 md_error(rdev->mddev, rdev); in state_store()
3031 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in state_store()
3032 md_wakeup_thread(rdev->mddev->thread); in state_store()
3046 if (rdev->mddev->pers == NULL) { in state_store()
3067 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in state_store()
3068 md_wakeup_thread(rdev->mddev->thread); in state_store()
3081 if (rdev->mddev->pers) in state_store()
3089 if (rdev->mddev->pers) in state_store()
3096 if (!rdev->mddev->pers) in state_store()
3106 if (!mddev_is_clustered(rdev->mddev) || in state_store()
3113 } else if (cmd_match(buf, "external_bbl") && (rdev->mddev->external)) { in state_store()
3117 } else if (cmd_match(buf, "-external_bbl") && (rdev->mddev->external)) { in state_store()
3175 if (rdev->mddev->pers && slot == -1) { in slot_store()
3186 if (rdev->mddev->pers->hot_remove_disk == NULL) in slot_store()
3189 remove_and_add_spares(rdev->mddev, rdev); in slot_store()
3192 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in slot_store()
3193 md_wakeup_thread(rdev->mddev->thread); in slot_store()
3194 } else if (rdev->mddev->pers) { in slot_store()
3203 if (test_bit(MD_RECOVERY_RUNNING, &rdev->mddev->recovery)) in slot_store()
3206 if (rdev->mddev->pers->hot_add_disk == NULL) in slot_store()
3209 if (slot >= rdev->mddev->raid_disks && in slot_store()
3210 slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks) in slot_store()
3220 err = rdev->mddev->pers->hot_add_disk(rdev->mddev, rdev); in slot_store()
3227 sysfs_link_rdev(rdev->mddev, rdev); in slot_store()
3230 if (slot >= rdev->mddev->raid_disks && in slot_store()
3231 slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks) in slot_store()
3258 if (rdev->mddev->pers && rdev->raid_disk >= 0) in offset_store()
3260 if (rdev->sectors && rdev->mddev->external) in offset_store()
3282 struct mddev *mddev = rdev->mddev; in new_offset_store() local
3287 if (mddev->sync_thread || in new_offset_store()
3288 test_bit(MD_RECOVERY_RUNNING,&mddev->recovery)) in new_offset_store()
3296 + mddev->dev_sectors > rdev->sectors) in new_offset_store()
3305 mddev->reshape_backwards) in new_offset_store()
3312 !mddev->reshape_backwards) in new_offset_store()
3315 if (mddev->pers && mddev->persistent && in new_offset_store()
3316 !super_types[mddev->major_version] in new_offset_store()
3321 mddev->reshape_backwards = 1; in new_offset_store()
3323 mddev->reshape_backwards = 0; in new_offset_store()
3368 struct mddev *my_mddev = rdev->mddev; in rdev_size_store()
3402 struct mddev *mddev; in rdev_size_store() local
3407 for_each_mddev(mddev, tmp) { in rdev_size_store()
3410 rdev_for_each(rdev2, mddev) in rdev_size_store()
3420 mddev_put(mddev); in rdev_size_store()
3462 if (rdev->mddev->pers && in recovery_start_store()
3530 if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) && in ppl_sector_store()
3534 if (rdev->mddev->persistent) { in ppl_sector_store()
3535 if (rdev->mddev->major_version == 0) in ppl_sector_store()
3543 } else if (!rdev->mddev->external) { in ppl_sector_store()
3567 if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) && in ppl_size_store()
3571 if (rdev->mddev->persistent) { in ppl_size_store()
3572 if (rdev->mddev->major_version == 0) in ppl_size_store()
3576 } else if (!rdev->mddev->external) { in ppl_size_store()
3608 if (!rdev->mddev) in rdev_attr_show()
3620 struct mddev *mddev = rdev->mddev; in rdev_attr_store() local
3626 rv = mddev ? mddev_lock(mddev) : -ENODEV; in rdev_attr_store()
3628 if (rdev->mddev == NULL) in rdev_attr_store()
3632 mddev_unlock(mddev); in rdev_attr_store()
3750 static int analyze_sbs(struct mddev *mddev) in analyze_sbs() argument
3757 rdev_for_each_safe(rdev, tmp, mddev) in analyze_sbs()
3758 switch (super_types[mddev->major_version]. in analyze_sbs()
3759 load_super(rdev, freshest, mddev->minor_version)) { in analyze_sbs()
3777 super_types[mddev->major_version]. in analyze_sbs()
3778 validate_super(mddev, freshest); in analyze_sbs()
3781 rdev_for_each_safe(rdev, tmp, mddev) { in analyze_sbs()
3782 if (mddev->max_disks && in analyze_sbs()
3783 (rdev->desc_nr >= mddev->max_disks || in analyze_sbs()
3784 i > mddev->max_disks)) { in analyze_sbs()
3786 mdname(mddev), bdevname(rdev->bdev, b), in analyze_sbs()
3787 mddev->max_disks); in analyze_sbs()
3792 if (super_types[mddev->major_version]. in analyze_sbs()
3793 validate_super(mddev, rdev)) { in analyze_sbs()
3800 if (mddev->level == LEVEL_MULTIPATH) { in analyze_sbs()
3805 (mddev->raid_disks - min(0, mddev->delta_disks)) && in analyze_sbs()
3852 safe_delay_show(struct mddev *mddev, char *page) in safe_delay_show() argument
3854 int msec = (mddev->safemode_delay*1000)/HZ; in safe_delay_show()
3858 safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len) in safe_delay_store() argument
3862 if (mddev_is_clustered(mddev)) { in safe_delay_store()
3870 mddev->safemode_delay = 0; in safe_delay_store()
3872 unsigned long old_delay = mddev->safemode_delay; in safe_delay_store()
3877 mddev->safemode_delay = new_delay; in safe_delay_store()
3879 mod_timer(&mddev->safemode_timer, jiffies+1); in safe_delay_store()
3887 level_show(struct mddev *mddev, char *page) in level_show() argument
3891 spin_lock(&mddev->lock); in level_show()
3892 p = mddev->pers; in level_show()
3895 else if (mddev->clevel[0]) in level_show()
3896 ret = sprintf(page, "%s\n", mddev->clevel); in level_show()
3897 else if (mddev->level != LEVEL_NONE) in level_show()
3898 ret = sprintf(page, "%d\n", mddev->level); in level_show()
3901 spin_unlock(&mddev->lock); in level_show()
3906 level_store(struct mddev *mddev, const char *buf, size_t len) in level_store() argument
3919 rv = mddev_lock(mddev); in level_store()
3923 if (mddev->pers == NULL) { in level_store()
3924 strncpy(mddev->clevel, buf, slen); in level_store()
3925 if (mddev->clevel[slen-1] == '\n') in level_store()
3927 mddev->clevel[slen] = 0; in level_store()
3928 mddev->level = LEVEL_NONE; in level_store()
3933 if (mddev->ro) in level_store()
3943 if (mddev->sync_thread || in level_store()
3944 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in level_store()
3945 mddev->reshape_position != MaxSector || in level_store()
3946 mddev->sysfs_active) in level_store()
3950 if (!mddev->pers->quiesce) { in level_store()
3952 mdname(mddev), mddev->pers->name); in level_store()
3976 if (pers == mddev->pers) { in level_store()
3985 mdname(mddev), clevel); in level_store()
3990 rdev_for_each(rdev, mddev) in level_store()
3996 priv = pers->takeover(mddev); in level_store()
3998 mddev->new_level = mddev->level; in level_store()
3999 mddev->new_layout = mddev->layout; in level_store()
4000 mddev->new_chunk_sectors = mddev->chunk_sectors; in level_store()
4001 mddev->raid_disks -= mddev->delta_disks; in level_store()
4002 mddev->delta_disks = 0; in level_store()
4003 mddev->reshape_backwards = 0; in level_store()
4006 mdname(mddev), clevel); in level_store()
4012 mddev_suspend(mddev); in level_store()
4013 mddev_detach(mddev); in level_store()
4015 spin_lock(&mddev->lock); in level_store()
4016 oldpers = mddev->pers; in level_store()
4017 oldpriv = mddev->private; in level_store()
4018 mddev->pers = pers; in level_store()
4019 mddev->private = priv; in level_store()
4020 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); in level_store()
4021 mddev->level = mddev->new_level; in level_store()
4022 mddev->layout = mddev->new_layout; in level_store()
4023 mddev->chunk_sectors = mddev->new_chunk_sectors; in level_store()
4024 mddev->delta_disks = 0; in level_store()
4025 mddev->reshape_backwards = 0; in level_store()
4026 mddev->degraded = 0; in level_store()
4027 spin_unlock(&mddev->lock); in level_store()
4030 mddev->external) { in level_store()
4038 mddev->in_sync = 0; in level_store()
4039 mddev->safemode_delay = 0; in level_store()
4040 mddev->safemode = 0; in level_store()
4043 oldpers->free(mddev, oldpriv); in level_store()
4048 if (sysfs_create_group(&mddev->kobj, &md_redundancy_group)) in level_store()
4050 mdname(mddev)); in level_store()
4051 mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action"); in level_store()
4052 mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); in level_store()
4053 mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); in level_store()
4058 if (mddev->to_remove == NULL) in level_store()
4059 mddev->to_remove = &md_redundancy_group; in level_store()
4064 rdev_for_each(rdev, mddev) { in level_store()
4067 if (rdev->new_raid_disk >= mddev->raid_disks) in level_store()
4071 sysfs_unlink_rdev(mddev, rdev); in level_store()
4073 rdev_for_each(rdev, mddev) { in level_store()
4082 if (sysfs_link_rdev(mddev, rdev)) in level_store()
4084 rdev->raid_disk, mdname(mddev)); in level_store()
4092 mddev->in_sync = 1; in level_store()
4093 del_timer_sync(&mddev->safemode_timer); in level_store()
4095 blk_set_stacking_limits(&mddev->queue->limits); in level_store()
4096 pers->run(mddev); in level_store()
4097 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in level_store()
4098 mddev_resume(mddev); in level_store()
4099 if (!mddev->thread) in level_store()
4100 md_update_sb(mddev, 1); in level_store()
4101 sysfs_notify_dirent_safe(mddev->sysfs_level); in level_store()
4102 md_new_event(mddev); in level_store()
4105 mddev_unlock(mddev); in level_store()
4113 layout_show(struct mddev *mddev, char *page) in layout_show() argument
4116 if (mddev->reshape_position != MaxSector && in layout_show()
4117 mddev->layout != mddev->new_layout) in layout_show()
4119 mddev->new_layout, mddev->layout); in layout_show()
4120 return sprintf(page, "%d\n", mddev->layout); in layout_show()
4124 layout_store(struct mddev *mddev, const char *buf, size_t len) in layout_store() argument
4132 err = mddev_lock(mddev); in layout_store()
4136 if (mddev->pers) { in layout_store()
4137 if (mddev->pers->check_reshape == NULL) in layout_store()
4139 else if (mddev->ro) in layout_store()
4142 mddev->new_layout = n; in layout_store()
4143 err = mddev->pers->check_reshape(mddev); in layout_store()
4145 mddev->new_layout = mddev->layout; in layout_store()
4148 mddev->new_layout = n; in layout_store()
4149 if (mddev->reshape_position == MaxSector) in layout_store()
4150 mddev->layout = n; in layout_store()
4152 mddev_unlock(mddev); in layout_store()
4159 raid_disks_show(struct mddev *mddev, char *page) in raid_disks_show() argument
4161 if (mddev->raid_disks == 0) in raid_disks_show()
4163 if (mddev->reshape_position != MaxSector && in raid_disks_show()
4164 mddev->delta_disks != 0) in raid_disks_show()
4165 return sprintf(page, "%d (%d)\n", mddev->raid_disks, in raid_disks_show()
4166 mddev->raid_disks - mddev->delta_disks); in raid_disks_show()
4167 return sprintf(page, "%d\n", mddev->raid_disks); in raid_disks_show()
4170 static int update_raid_disks(struct mddev *mddev, int raid_disks);
4173 raid_disks_store(struct mddev *mddev, const char *buf, size_t len) in raid_disks_store() argument
4182 err = mddev_lock(mddev); in raid_disks_store()
4185 if (mddev->pers) in raid_disks_store()
4186 err = update_raid_disks(mddev, n); in raid_disks_store()
4187 else if (mddev->reshape_position != MaxSector) { in raid_disks_store()
4189 int olddisks = mddev->raid_disks - mddev->delta_disks; in raid_disks_store()
4192 rdev_for_each(rdev, mddev) { in raid_disks_store()
4201 mddev->delta_disks = n - olddisks; in raid_disks_store()
4202 mddev->raid_disks = n; in raid_disks_store()
4203 mddev->reshape_backwards = (mddev->delta_disks < 0); in raid_disks_store()
4205 mddev->raid_disks = n; in raid_disks_store()
4207 mddev_unlock(mddev); in raid_disks_store()
4214 uuid_show(struct mddev *mddev, char *page) in uuid_show() argument
4216 return sprintf(page, "%pU\n", mddev->uuid); in uuid_show()
4222 chunk_size_show(struct mddev *mddev, char *page) in chunk_size_show() argument
4224 if (mddev->reshape_position != MaxSector && in chunk_size_show()
4225 mddev->chunk_sectors != mddev->new_chunk_sectors) in chunk_size_show()
4227 mddev->new_chunk_sectors << 9, in chunk_size_show()
4228 mddev->chunk_sectors << 9); in chunk_size_show()
4229 return sprintf(page, "%d\n", mddev->chunk_sectors << 9); in chunk_size_show()
4233 chunk_size_store(struct mddev *mddev, const char *buf, size_t len) in chunk_size_store() argument
4242 err = mddev_lock(mddev); in chunk_size_store()
4245 if (mddev->pers) { in chunk_size_store()
4246 if (mddev->pers->check_reshape == NULL) in chunk_size_store()
4248 else if (mddev->ro) in chunk_size_store()
4251 mddev->new_chunk_sectors = n >> 9; in chunk_size_store()
4252 err = mddev->pers->check_reshape(mddev); in chunk_size_store()
4254 mddev->new_chunk_sectors = mddev->chunk_sectors; in chunk_size_store()
4257 mddev->new_chunk_sectors = n >> 9; in chunk_size_store()
4258 if (mddev->reshape_position == MaxSector) in chunk_size_store()
4259 mddev->chunk_sectors = n >> 9; in chunk_size_store()
4261 mddev_unlock(mddev); in chunk_size_store()
4268 resync_start_show(struct mddev *mddev, char *page) in resync_start_show() argument
4270 if (mddev->recovery_cp == MaxSector) in resync_start_show()
4272 return sprintf(page, "%llu\n", (unsigned long long)mddev->recovery_cp); in resync_start_show()
4276 resync_start_store(struct mddev *mddev, const char *buf, size_t len) in resync_start_store() argument
4291 err = mddev_lock(mddev); in resync_start_store()
4294 if (mddev->pers && !test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) in resync_start_store()
4298 mddev->recovery_cp = n; in resync_start_store()
4299 if (mddev->pers) in resync_start_store()
4300 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in resync_start_store()
4302 mddev_unlock(mddev); in resync_start_store()
4366 array_state_show(struct mddev *mddev, char *page) in array_state_show() argument
4370 if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags)) { in array_state_show()
4371 switch(mddev->ro) { in array_state_show()
4379 spin_lock(&mddev->lock); in array_state_show()
4380 if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) in array_state_show()
4382 else if (mddev->in_sync) in array_state_show()
4384 else if (mddev->safemode) in array_state_show()
4388 spin_unlock(&mddev->lock); in array_state_show()
4391 if (test_bit(MD_BROKEN, &mddev->flags) && st == clean) in array_state_show()
4394 if (list_empty(&mddev->disks) && in array_state_show()
4395 mddev->raid_disks == 0 && in array_state_show()
4396 mddev->dev_sectors == 0) in array_state_show()
4404 static int do_md_stop(struct mddev *mddev, int ro, struct block_device *bdev);
4405 static int md_set_readonly(struct mddev *mddev, struct block_device *bdev);
4406 static int restart_array(struct mddev *mddev);
4409 array_state_store(struct mddev *mddev, const char *buf, size_t len) in array_state_store() argument
4414 if (mddev->pers && (st == active || st == clean) && mddev->ro != 1) { in array_state_store()
4418 spin_lock(&mddev->lock); in array_state_store()
4420 restart_array(mddev); in array_state_store()
4421 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in array_state_store()
4422 md_wakeup_thread(mddev->thread); in array_state_store()
4423 wake_up(&mddev->sb_wait); in array_state_store()
4425 restart_array(mddev); in array_state_store()
4426 if (!set_in_sync(mddev)) in array_state_store()
4430 sysfs_notify_dirent_safe(mddev->sysfs_state); in array_state_store()
4431 spin_unlock(&mddev->lock); in array_state_store()
4434 err = mddev_lock(mddev); in array_state_store()
4443 err = do_md_stop(mddev, 0, NULL); in array_state_store()
4447 if (mddev->pers) in array_state_store()
4448 err = do_md_stop(mddev, 2, NULL); in array_state_store()
4455 if (mddev->pers) in array_state_store()
4456 err = md_set_readonly(mddev, NULL); in array_state_store()
4458 mddev->ro = 1; in array_state_store()
4459 set_disk_ro(mddev->gendisk, 1); in array_state_store()
4460 err = do_md_run(mddev); in array_state_store()
4464 if (mddev->pers) { in array_state_store()
4465 if (mddev->ro == 0) in array_state_store()
4466 err = md_set_readonly(mddev, NULL); in array_state_store()
4467 else if (mddev->ro == 1) in array_state_store()
4468 err = restart_array(mddev); in array_state_store()
4470 mddev->ro = 2; in array_state_store()
4471 set_disk_ro(mddev->gendisk, 0); in array_state_store()
4474 mddev->ro = 2; in array_state_store()
4475 err = do_md_run(mddev); in array_state_store()
4479 if (mddev->pers) { in array_state_store()
4480 err = restart_array(mddev); in array_state_store()
4483 spin_lock(&mddev->lock); in array_state_store()
4484 if (!set_in_sync(mddev)) in array_state_store()
4486 spin_unlock(&mddev->lock); in array_state_store()
4491 if (mddev->pers) { in array_state_store()
4492 err = restart_array(mddev); in array_state_store()
4495 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in array_state_store()
4496 wake_up(&mddev->sb_wait); in array_state_store()
4499 mddev->ro = 0; in array_state_store()
4500 set_disk_ro(mddev->gendisk, 0); in array_state_store()
4501 err = do_md_run(mddev); in array_state_store()
4512 if (mddev->hold_active == UNTIL_IOCTL) in array_state_store()
4513 mddev->hold_active = 0; in array_state_store()
4514 sysfs_notify_dirent_safe(mddev->sysfs_state); in array_state_store()
4516 mddev_unlock(mddev); in array_state_store()
4523 max_corrected_read_errors_show(struct mddev *mddev, char *page) { in max_corrected_read_errors_show() argument
4525 atomic_read(&mddev->max_corr_read_errors)); in max_corrected_read_errors_show()
4529 max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len) in max_corrected_read_errors_store() argument
4537 atomic_set(&mddev->max_corr_read_errors, n); in max_corrected_read_errors_store()
4546 null_show(struct mddev *mddev, char *page) in null_show() argument
4552 static void flush_rdev_wq(struct mddev *mddev) in flush_rdev_wq() argument
4557 rdev_for_each_rcu(rdev, mddev) in flush_rdev_wq()
4566 new_dev_store(struct mddev *mddev, const char *buf, size_t len) in new_dev_store() argument
4592 flush_rdev_wq(mddev); in new_dev_store()
4593 err = mddev_lock(mddev); in new_dev_store()
4596 if (mddev->persistent) { in new_dev_store()
4597 rdev = md_import_device(dev, mddev->major_version, in new_dev_store()
4598 mddev->minor_version); in new_dev_store()
4599 if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) { in new_dev_store()
4601 = list_entry(mddev->disks.next, in new_dev_store()
4603 err = super_types[mddev->major_version] in new_dev_store()
4604 .load_super(rdev, rdev0, mddev->minor_version); in new_dev_store()
4608 } else if (mddev->external) in new_dev_store()
4614 mddev_unlock(mddev); in new_dev_store()
4617 err = bind_rdev_to_array(rdev, mddev); in new_dev_store()
4621 mddev_unlock(mddev); in new_dev_store()
4623 md_new_event(mddev); in new_dev_store()
4631 bitmap_store(struct mddev *mddev, const char *buf, size_t len) in bitmap_store() argument
4637 err = mddev_lock(mddev); in bitmap_store()
4640 if (!mddev->bitmap) in bitmap_store()
4652 md_bitmap_dirty_bits(mddev->bitmap, chunk, end_chunk); in bitmap_store()
4655 md_bitmap_unplug(mddev->bitmap); /* flush the bits to disk */ in bitmap_store()
4657 mddev_unlock(mddev); in bitmap_store()
4665 size_show(struct mddev *mddev, char *page) in size_show() argument
4668 (unsigned long long)mddev->dev_sectors / 2); in size_show()
4671 static int update_size(struct mddev *mddev, sector_t num_sectors);
4674 size_store(struct mddev *mddev, const char *buf, size_t len) in size_store() argument
4685 err = mddev_lock(mddev); in size_store()
4688 if (mddev->pers) { in size_store()
4689 err = update_size(mddev, sectors); in size_store()
4691 md_update_sb(mddev, 1); in size_store()
4693 if (mddev->dev_sectors == 0 || in size_store()
4694 mddev->dev_sectors > sectors) in size_store()
4695 mddev->dev_sectors = sectors; in size_store()
4699 mddev_unlock(mddev); in size_store()
4713 metadata_show(struct mddev *mddev, char *page) in metadata_show() argument
4715 if (mddev->persistent) in metadata_show()
4717 mddev->major_version, mddev->minor_version); in metadata_show()
4718 else if (mddev->external) in metadata_show()
4719 return sprintf(page, "external:%s\n", mddev->metadata_type); in metadata_show()
4725 metadata_store(struct mddev *mddev, const char *buf, size_t len) in metadata_store() argument
4735 err = mddev_lock(mddev); in metadata_store()
4739 if (mddev->external && strncmp(buf, "external:", 9) == 0) in metadata_store()
4741 else if (!list_empty(&mddev->disks)) in metadata_store()
4746 mddev->persistent = 0; in metadata_store()
4747 mddev->external = 0; in metadata_store()
4748 mddev->major_version = 0; in metadata_store()
4749 mddev->minor_version = 90; in metadata_store()
4754 if (namelen >= sizeof(mddev->metadata_type)) in metadata_store()
4755 namelen = sizeof(mddev->metadata_type)-1; in metadata_store()
4756 strncpy(mddev->metadata_type, buf+9, namelen); in metadata_store()
4757 mddev->metadata_type[namelen] = 0; in metadata_store()
4758 if (namelen && mddev->metadata_type[namelen-1] == '\n') in metadata_store()
4759 mddev->metadata_type[--namelen] = 0; in metadata_store()
4760 mddev->persistent = 0; in metadata_store()
4761 mddev->external = 1; in metadata_store()
4762 mddev->major_version = 0; in metadata_store()
4763 mddev->minor_version = 90; in metadata_store()
4777 mddev->major_version = major; in metadata_store()
4778 mddev->minor_version = minor; in metadata_store()
4779 mddev->persistent = 1; in metadata_store()
4780 mddev->external = 0; in metadata_store()
4783 mddev_unlock(mddev); in metadata_store()
4791 action_show(struct mddev *mddev, char *page) in action_show() argument
4794 unsigned long recovery = mddev->recovery; in action_show()
4798 (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &recovery))) { in action_show()
4810 else if (mddev->reshape_position != MaxSector) in action_show()
4817 action_store(struct mddev *mddev, const char *page, size_t len) in action_store() argument
4819 if (!mddev->pers || !mddev->pers->sync_request) in action_store()
4825 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4827 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4828 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in action_store()
4829 mddev_lock(mddev) == 0) { in action_store()
4830 if (work_pending(&mddev->del_work)) in action_store()
4832 if (mddev->sync_thread) { in action_store()
4833 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in action_store()
4834 md_reap_sync_thread(mddev); in action_store()
4836 mddev_unlock(mddev); in action_store()
4838 } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in action_store()
4841 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4843 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4844 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in action_store()
4847 if (mddev->pers->start_reshape == NULL) in action_store()
4849 err = mddev_lock(mddev); in action_store()
4851 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in action_store()
4854 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4855 err = mddev->pers->start_reshape(mddev); in action_store()
4857 mddev_unlock(mddev); in action_store()
4861 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in action_store()
4864 set_bit(MD_RECOVERY_CHECK, &mddev->recovery); in action_store()
4867 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4868 set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in action_store()
4869 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); in action_store()
4871 if (mddev->ro == 2) { in action_store()
4875 mddev->ro = 0; in action_store()
4876 md_wakeup_thread(mddev->sync_thread); in action_store()
4878 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in action_store()
4879 md_wakeup_thread(mddev->thread); in action_store()
4880 sysfs_notify_dirent_safe(mddev->sysfs_action); in action_store()
4888 last_sync_action_show(struct mddev *mddev, char *page) in last_sync_action_show() argument
4890 return sprintf(page, "%s\n", mddev->last_sync_action); in last_sync_action_show()
4896 mismatch_cnt_show(struct mddev *mddev, char *page) in mismatch_cnt_show() argument
4900 atomic64_read(&mddev->resync_mismatches)); in mismatch_cnt_show()
4906 sync_min_show(struct mddev *mddev, char *page) in sync_min_show() argument
4908 return sprintf(page, "%d (%s)\n", speed_min(mddev), in sync_min_show()
4909 mddev->sync_speed_min ? "local": "system"); in sync_min_show()
4913 sync_min_store(struct mddev *mddev, const char *buf, size_t len) in sync_min_store() argument
4927 mddev->sync_speed_min = min; in sync_min_store()
4935 sync_max_show(struct mddev *mddev, char *page) in sync_max_show() argument
4937 return sprintf(page, "%d (%s)\n", speed_max(mddev), in sync_max_show()
4938 mddev->sync_speed_max ? "local": "system"); in sync_max_show()
4942 sync_max_store(struct mddev *mddev, const char *buf, size_t len) in sync_max_store() argument
4956 mddev->sync_speed_max = max; in sync_max_store()
4964 degraded_show(struct mddev *mddev, char *page) in degraded_show() argument
4966 return sprintf(page, "%d\n", mddev->degraded); in degraded_show()
4971 sync_force_parallel_show(struct mddev *mddev, char *page) in sync_force_parallel_show() argument
4973 return sprintf(page, "%d\n", mddev->parallel_resync); in sync_force_parallel_show()
4977 sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len) in sync_force_parallel_store() argument
4987 mddev->parallel_resync = n; in sync_force_parallel_store()
4989 if (mddev->sync_thread) in sync_force_parallel_store()
5001 sync_speed_show(struct mddev *mddev, char *page) in sync_speed_show() argument
5004 if (mddev->curr_resync == 0) in sync_speed_show()
5006 resync = mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active); in sync_speed_show()
5007 dt = (jiffies - mddev->resync_mark) / HZ; in sync_speed_show()
5009 db = resync - mddev->resync_mark_cnt; in sync_speed_show()
5016 sync_completed_show(struct mddev *mddev, char *page) in sync_completed_show() argument
5020 if (!test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in sync_completed_show()
5023 if (mddev->curr_resync == 1 || in sync_completed_show()
5024 mddev->curr_resync == 2) in sync_completed_show()
5027 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in sync_completed_show()
5028 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in sync_completed_show()
5029 max_sectors = mddev->resync_max_sectors; in sync_completed_show()
5031 max_sectors = mddev->dev_sectors; in sync_completed_show()
5033 resync = mddev->curr_resync_completed; in sync_completed_show()
5041 min_sync_show(struct mddev *mddev, char *page) in min_sync_show() argument
5044 (unsigned long long)mddev->resync_min); in min_sync_show()
5047 min_sync_store(struct mddev *mddev, const char *buf, size_t len) in min_sync_store() argument
5055 spin_lock(&mddev->lock); in min_sync_store()
5057 if (min > mddev->resync_max) in min_sync_store()
5061 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in min_sync_store()
5065 mddev->resync_min = round_down(min, 8); in min_sync_store()
5069 spin_unlock(&mddev->lock); in min_sync_store()
5077 max_sync_show(struct mddev *mddev, char *page) in max_sync_show() argument
5079 if (mddev->resync_max == MaxSector) in max_sync_show()
5083 (unsigned long long)mddev->resync_max); in max_sync_show()
5086 max_sync_store(struct mddev *mddev, const char *buf, size_t len) in max_sync_store() argument
5089 spin_lock(&mddev->lock); in max_sync_store()
5091 mddev->resync_max = MaxSector; in max_sync_store()
5099 if (max < mddev->resync_min) in max_sync_store()
5103 if (max < mddev->resync_max && in max_sync_store()
5104 mddev->ro == 0 && in max_sync_store()
5105 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in max_sync_store()
5109 chunk = mddev->chunk_sectors; in max_sync_store()
5117 mddev->resync_max = max; in max_sync_store()
5119 wake_up(&mddev->recovery_wait); in max_sync_store()
5122 spin_unlock(&mddev->lock); in max_sync_store()
5130 suspend_lo_show(struct mddev *mddev, char *page) in suspend_lo_show() argument
5132 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo); in suspend_lo_show()
5136 suspend_lo_store(struct mddev *mddev, const char *buf, size_t len) in suspend_lo_store() argument
5147 err = mddev_lock(mddev); in suspend_lo_store()
5151 if (mddev->pers == NULL || in suspend_lo_store()
5152 mddev->pers->quiesce == NULL) in suspend_lo_store()
5154 mddev_suspend(mddev); in suspend_lo_store()
5155 mddev->suspend_lo = new; in suspend_lo_store()
5156 mddev_resume(mddev); in suspend_lo_store()
5160 mddev_unlock(mddev); in suspend_lo_store()
5167 suspend_hi_show(struct mddev *mddev, char *page) in suspend_hi_show() argument
5169 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi); in suspend_hi_show()
5173 suspend_hi_store(struct mddev *mddev, const char *buf, size_t len) in suspend_hi_store() argument
5184 err = mddev_lock(mddev); in suspend_hi_store()
5188 if (mddev->pers == NULL) in suspend_hi_store()
5191 mddev_suspend(mddev); in suspend_hi_store()
5192 mddev->suspend_hi = new; in suspend_hi_store()
5193 mddev_resume(mddev); in suspend_hi_store()
5197 mddev_unlock(mddev); in suspend_hi_store()
5204 reshape_position_show(struct mddev *mddev, char *page) in reshape_position_show() argument
5206 if (mddev->reshape_position != MaxSector) in reshape_position_show()
5208 (unsigned long long)mddev->reshape_position); in reshape_position_show()
5214 reshape_position_store(struct mddev *mddev, const char *buf, size_t len) in reshape_position_store() argument
5225 err = mddev_lock(mddev); in reshape_position_store()
5229 if (mddev->pers) in reshape_position_store()
5231 mddev->reshape_position = new; in reshape_position_store()
5232 mddev->delta_disks = 0; in reshape_position_store()
5233 mddev->reshape_backwards = 0; in reshape_position_store()
5234 mddev->new_level = mddev->level; in reshape_position_store()
5235 mddev->new_layout = mddev->layout; in reshape_position_store()
5236 mddev->new_chunk_sectors = mddev->chunk_sectors; in reshape_position_store()
5237 rdev_for_each(rdev, mddev) in reshape_position_store()
5241 mddev_unlock(mddev); in reshape_position_store()
5250 reshape_direction_show(struct mddev *mddev, char *page) in reshape_direction_show() argument
5253 mddev->reshape_backwards ? "backwards" : "forwards"); in reshape_direction_show()
5257 reshape_direction_store(struct mddev *mddev, const char *buf, size_t len) in reshape_direction_store() argument
5268 if (mddev->reshape_backwards == backwards) in reshape_direction_store()
5271 err = mddev_lock(mddev); in reshape_direction_store()
5275 if (mddev->delta_disks) in reshape_direction_store()
5277 else if (mddev->persistent && in reshape_direction_store()
5278 mddev->major_version == 0) in reshape_direction_store()
5281 mddev->reshape_backwards = backwards; in reshape_direction_store()
5282 mddev_unlock(mddev); in reshape_direction_store()
5291 array_size_show(struct mddev *mddev, char *page) in array_size_show() argument
5293 if (mddev->external_size) in array_size_show()
5295 (unsigned long long)mddev->array_sectors/2); in array_size_show()
5301 array_size_store(struct mddev *mddev, const char *buf, size_t len) in array_size_store() argument
5306 err = mddev_lock(mddev); in array_size_store()
5311 if (mddev_is_clustered(mddev)) { in array_size_store()
5312 mddev_unlock(mddev); in array_size_store()
5317 if (mddev->pers) in array_size_store()
5318 sectors = mddev->pers->size(mddev, 0, 0); in array_size_store()
5320 sectors = mddev->array_sectors; in array_size_store()
5322 mddev->external_size = 0; in array_size_store()
5326 else if (mddev->pers && mddev->pers->size(mddev, 0, 0) < sectors) in array_size_store()
5329 mddev->external_size = 1; in array_size_store()
5333 mddev->array_sectors = sectors; in array_size_store()
5334 if (mddev->pers) in array_size_store()
5335 set_capacity_and_notify(mddev->gendisk, in array_size_store()
5336 mddev->array_sectors); in array_size_store()
5338 mddev_unlock(mddev); in array_size_store()
5347 consistency_policy_show(struct mddev *mddev, char *page) in consistency_policy_show() argument
5351 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) { in consistency_policy_show()
5353 } else if (test_bit(MD_HAS_PPL, &mddev->flags)) { in consistency_policy_show()
5355 } else if (mddev->bitmap) { in consistency_policy_show()
5357 } else if (mddev->pers) { in consistency_policy_show()
5358 if (mddev->pers->sync_request) in consistency_policy_show()
5370 consistency_policy_store(struct mddev *mddev, const char *buf, size_t len) in consistency_policy_store() argument
5374 if (mddev->pers) { in consistency_policy_store()
5375 if (mddev->pers->change_consistency_policy) in consistency_policy_store()
5376 err = mddev->pers->change_consistency_policy(mddev, buf); in consistency_policy_store()
5379 } else if (mddev->external && strncmp(buf, "ppl", 3) == 0) { in consistency_policy_store()
5380 set_bit(MD_HAS_PPL, &mddev->flags); in consistency_policy_store()
5392 static ssize_t fail_last_dev_show(struct mddev *mddev, char *page) in fail_last_dev_show() argument
5394 return sprintf(page, "%d\n", mddev->fail_last_dev); in fail_last_dev_show()
5402 fail_last_dev_store(struct mddev *mddev, const char *buf, size_t len) in fail_last_dev_store() argument
5411 if (value != mddev->fail_last_dev) in fail_last_dev_store()
5412 mddev->fail_last_dev = value; in fail_last_dev_store()
5420 static ssize_t serialize_policy_show(struct mddev *mddev, char *page) in serialize_policy_show() argument
5422 if (mddev->pers == NULL || (mddev->pers->level != 1)) in serialize_policy_show()
5425 return sprintf(page, "%d\n", mddev->serialize_policy); in serialize_policy_show()
5433 serialize_policy_store(struct mddev *mddev, const char *buf, size_t len) in serialize_policy_store() argument
5442 if (value == mddev->serialize_policy) in serialize_policy_store()
5445 err = mddev_lock(mddev); in serialize_policy_store()
5448 if (mddev->pers == NULL || (mddev->pers->level != 1)) { in serialize_policy_store()
5454 mddev_suspend(mddev); in serialize_policy_store()
5456 mddev_create_serial_pool(mddev, NULL, true); in serialize_policy_store()
5458 mddev_destroy_serial_pool(mddev, NULL, true); in serialize_policy_store()
5459 mddev->serialize_policy = value; in serialize_policy_store()
5460 mddev_resume(mddev); in serialize_policy_store()
5462 mddev_unlock(mddev); in serialize_policy_store()
5519 struct mddev *mddev = container_of(kobj, struct mddev, kobj); in md_attr_show() local
5525 if (list_empty(&mddev->all_mddevs)) { in md_attr_show()
5529 mddev_get(mddev); in md_attr_show()
5532 rv = entry->show(mddev, page); in md_attr_show()
5533 mddev_put(mddev); in md_attr_show()
5542 struct mddev *mddev = container_of(kobj, struct mddev, kobj); in md_attr_store() local
5550 if (list_empty(&mddev->all_mddevs)) { in md_attr_store()
5554 mddev_get(mddev); in md_attr_store()
5556 rv = entry->store(mddev, page, length); in md_attr_store()
5557 mddev_put(mddev); in md_attr_store()
5563 struct mddev *mddev = container_of(ko, struct mddev, kobj); in md_free() local
5565 if (mddev->sysfs_state) in md_free()
5566 sysfs_put(mddev->sysfs_state); in md_free()
5567 if (mddev->sysfs_level) in md_free()
5568 sysfs_put(mddev->sysfs_level); in md_free()
5570 if (mddev->gendisk) { in md_free()
5571 del_gendisk(mddev->gendisk); in md_free()
5572 blk_cleanup_disk(mddev->gendisk); in md_free()
5574 percpu_ref_exit(&mddev->writes_pending); in md_free()
5576 bioset_exit(&mddev->bio_set); in md_free()
5577 bioset_exit(&mddev->sync_set); in md_free()
5578 if (mddev->level != 1 && mddev->level != 10) in md_free()
5579 bioset_exit(&mddev->io_acct_set); in md_free()
5580 kfree(mddev); in md_free()
5597 struct mddev *mddev = container_of(ws, struct mddev, del_work); in mddev_delayed_delete() local
5599 sysfs_remove_group(&mddev->kobj, &md_bitmap_group); in mddev_delayed_delete()
5600 kobject_del(&mddev->kobj); in mddev_delayed_delete()
5601 kobject_put(&mddev->kobj); in mddev_delayed_delete()
5606 int mddev_init_writes_pending(struct mddev *mddev) in mddev_init_writes_pending() argument
5608 if (mddev->writes_pending.percpu_count_ptr) in mddev_init_writes_pending()
5610 if (percpu_ref_init(&mddev->writes_pending, no_op, in mddev_init_writes_pending()
5614 percpu_ref_put(&mddev->writes_pending); in mddev_init_writes_pending()
5631 struct mddev *mddev; in md_alloc() local
5645 mddev = mddev_alloc(dev); in md_alloc()
5646 if (IS_ERR(mddev)) { in md_alloc()
5648 return PTR_ERR(mddev); in md_alloc()
5651 partitioned = (MAJOR(mddev->unit) != MD_MAJOR); in md_alloc()
5653 unit = MINOR(mddev->unit) >> shift; in md_alloc()
5658 struct mddev *mddev2; in md_alloc()
5674 mddev->hold_active = UNTIL_STOP; in md_alloc()
5681 disk->major = MAJOR(mddev->unit); in md_alloc()
5691 disk->private_data = mddev; in md_alloc()
5693 mddev->queue = disk->queue; in md_alloc()
5694 blk_set_stacking_limits(&mddev->queue->limits); in md_alloc()
5695 blk_queue_write_cache(mddev->queue, true, true); in md_alloc()
5702 mddev->gendisk = disk; in md_alloc()
5705 error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md"); in md_alloc()
5714 if (mddev->kobj.sd && in md_alloc()
5715 sysfs_create_group(&mddev->kobj, &md_bitmap_group)) in md_alloc()
5719 if (!error && mddev->kobj.sd) { in md_alloc()
5720 kobject_uevent(&mddev->kobj, KOBJ_ADD); in md_alloc()
5721 mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state"); in md_alloc()
5722 mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level"); in md_alloc()
5724 mddev_put(mddev); in md_alloc()
5767 struct mddev *mddev = from_timer(mddev, t, safemode_timer); in md_safemode_timeout() local
5769 mddev->safemode = 1; in md_safemode_timeout()
5770 if (mddev->external) in md_safemode_timeout()
5771 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_safemode_timeout()
5773 md_wakeup_thread(mddev->thread); in md_safemode_timeout()
5778 int md_run(struct mddev *mddev) in md_run() argument
5784 if (list_empty(&mddev->disks)) in md_run()
5788 if (mddev->pers) in md_run()
5791 if (mddev->sysfs_active) in md_run()
5797 if (!mddev->raid_disks) { in md_run()
5798 if (!mddev->persistent) in md_run()
5800 err = analyze_sbs(mddev); in md_run()
5805 if (mddev->level != LEVEL_NONE) in md_run()
5806 request_module("md-level-%d", mddev->level); in md_run()
5807 else if (mddev->clevel[0]) in md_run()
5808 request_module("md-%s", mddev->clevel); in md_run()
5815 mddev->has_superblocks = false; in md_run()
5816 rdev_for_each(rdev, mddev) { in md_run()
5821 if (mddev->ro != 1 && rdev_read_only(rdev)) { in md_run()
5822 mddev->ro = 1; in md_run()
5823 if (mddev->gendisk) in md_run()
5824 set_disk_ro(mddev->gendisk, 1); in md_run()
5828 mddev->has_superblocks = true; in md_run()
5837 if (mddev->dev_sectors && in md_run()
5838 rdev->data_offset + mddev->dev_sectors in md_run()
5841 mdname(mddev)); in md_run()
5848 mdname(mddev)); in md_run()
5855 if (!bioset_initialized(&mddev->bio_set)) { in md_run()
5856 err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); in md_run()
5860 if (!bioset_initialized(&mddev->sync_set)) { in md_run()
5861 err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); in md_run()
5865 if (mddev->level != 1 && mddev->level != 10 && in md_run()
5866 !bioset_initialized(&mddev->io_acct_set)) { in md_run()
5867 err = bioset_init(&mddev->io_acct_set, BIO_POOL_SIZE, in md_run()
5874 pers = find_pers(mddev->level, mddev->clevel); in md_run()
5877 if (mddev->level != LEVEL_NONE) in md_run()
5879 mddev->level); in md_run()
5882 mddev->clevel); in md_run()
5887 if (mddev->level != pers->level) { in md_run()
5888 mddev->level = pers->level; in md_run()
5889 mddev->new_level = pers->level; in md_run()
5891 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); in md_run()
5893 if (mddev->reshape_position != MaxSector && in md_run()
5909 rdev_for_each(rdev, mddev) in md_run()
5910 rdev_for_each(rdev2, mddev) { in md_run()
5915 mdname(mddev), in md_run()
5926 mddev->recovery = 0; in md_run()
5928 mddev->resync_max_sectors = mddev->dev_sectors; in md_run()
5930 mddev->ok_start_degraded = start_dirty_degraded; in md_run()
5932 if (start_readonly && mddev->ro == 0) in md_run()
5933 mddev->ro = 2; /* read-only, but switch on first write */ in md_run()
5935 err = pers->run(mddev); in md_run()
5938 else if (pers->size(mddev, 0, 0) < mddev->array_sectors) { in md_run()
5939 WARN_ONCE(!mddev->external_size, in md_run()
5943 (unsigned long long)mddev->array_sectors / 2, in md_run()
5944 (unsigned long long)pers->size(mddev, 0, 0) / 2); in md_run()
5948 (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { in md_run()
5951 bitmap = md_bitmap_create(mddev, -1); in md_run()
5955 mdname(mddev), err); in md_run()
5957 mddev->bitmap = bitmap; in md_run()
5963 if (mddev->bitmap_info.max_write_behind > 0) { in md_run()
5966 rdev_for_each(rdev, mddev) { in md_run()
5971 if (create_pool && mddev->serial_info_pool == NULL) { in md_run()
5972 mddev->serial_info_pool = in md_run()
5975 if (!mddev->serial_info_pool) { in md_run()
5982 if (mddev->queue) { in md_run()
5985 rdev_for_each(rdev, mddev) { in md_run()
5992 if (mddev->degraded) in md_run()
5995 blk_queue_flag_set(QUEUE_FLAG_NONROT, mddev->queue); in md_run()
5997 blk_queue_flag_clear(QUEUE_FLAG_NONROT, mddev->queue); in md_run()
5998 blk_queue_flag_set(QUEUE_FLAG_IO_STAT, mddev->queue); in md_run()
6001 if (mddev->kobj.sd && in md_run()
6002 sysfs_create_group(&mddev->kobj, &md_redundancy_group)) in md_run()
6004 mdname(mddev)); in md_run()
6005 mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action"); in md_run()
6006 mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); in md_run()
6007 mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); in md_run()
6008 } else if (mddev->ro == 2) /* auto-readonly not meaningful */ in md_run()
6009 mddev->ro = 0; in md_run()
6011 atomic_set(&mddev->max_corr_read_errors, in md_run()
6013 mddev->safemode = 0; in md_run()
6014 if (mddev_is_clustered(mddev)) in md_run()
6015 mddev->safemode_delay = 0; in md_run()
6017 mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY; in md_run()
6018 mddev->in_sync = 1; in md_run()
6020 spin_lock(&mddev->lock); in md_run()
6021 mddev->pers = pers; in md_run()
6022 spin_unlock(&mddev->lock); in md_run()
6023 rdev_for_each(rdev, mddev) in md_run()
6025 sysfs_link_rdev(mddev, rdev); /* failure here is OK */ in md_run()
6027 if (mddev->degraded && !mddev->ro) in md_run()
6031 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_run()
6032 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_run()
6034 if (mddev->sb_flags) in md_run()
6035 md_update_sb(mddev, 0); in md_run()
6037 md_new_event(mddev); in md_run()
6041 mddev_detach(mddev); in md_run()
6042 if (mddev->private) in md_run()
6043 pers->free(mddev, mddev->private); in md_run()
6044 mddev->private = NULL; in md_run()
6046 md_bitmap_destroy(mddev); in md_run()
6048 if (mddev->level != 1 && mddev->level != 10) in md_run()
6049 bioset_exit(&mddev->io_acct_set); in md_run()
6051 bioset_exit(&mddev->sync_set); in md_run()
6053 bioset_exit(&mddev->bio_set); in md_run()
6058 int do_md_run(struct mddev *mddev) in do_md_run() argument
6062 set_bit(MD_NOT_READY, &mddev->flags); in do_md_run()
6063 err = md_run(mddev); in do_md_run()
6066 err = md_bitmap_load(mddev); in do_md_run()
6068 md_bitmap_destroy(mddev); in do_md_run()
6072 if (mddev_is_clustered(mddev)) in do_md_run()
6073 md_allow_write(mddev); in do_md_run()
6076 md_start(mddev); in do_md_run()
6078 md_wakeup_thread(mddev->thread); in do_md_run()
6079 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ in do_md_run()
6081 set_capacity_and_notify(mddev->gendisk, mddev->array_sectors); in do_md_run()
6082 clear_bit(MD_NOT_READY, &mddev->flags); in do_md_run()
6083 mddev->changed = 1; in do_md_run()
6084 kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); in do_md_run()
6085 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_run()
6086 sysfs_notify_dirent_safe(mddev->sysfs_action); in do_md_run()
6087 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in do_md_run()
6089 clear_bit(MD_NOT_READY, &mddev->flags); in do_md_run()
6093 int md_start(struct mddev *mddev) in md_start() argument
6097 if (mddev->pers->start) { in md_start()
6098 set_bit(MD_RECOVERY_WAIT, &mddev->recovery); in md_start()
6099 md_wakeup_thread(mddev->thread); in md_start()
6100 ret = mddev->pers->start(mddev); in md_start()
6101 clear_bit(MD_RECOVERY_WAIT, &mddev->recovery); in md_start()
6102 md_wakeup_thread(mddev->sync_thread); in md_start()
6108 static int restart_array(struct mddev *mddev) in restart_array() argument
6110 struct gendisk *disk = mddev->gendisk; in restart_array()
6116 if (list_empty(&mddev->disks)) in restart_array()
6118 if (!mddev->pers) in restart_array()
6120 if (!mddev->ro) in restart_array()
6124 rdev_for_each_rcu(rdev, mddev) { in restart_array()
6132 if (test_bit(MD_HAS_JOURNAL, &mddev->flags) && !has_journal) in restart_array()
6138 mddev->safemode = 0; in restart_array()
6139 mddev->ro = 0; in restart_array()
6141 pr_debug("md: %s switched to read-write mode.\n", mdname(mddev)); in restart_array()
6143 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in restart_array()
6144 md_wakeup_thread(mddev->thread); in restart_array()
6145 md_wakeup_thread(mddev->sync_thread); in restart_array()
6146 sysfs_notify_dirent_safe(mddev->sysfs_state); in restart_array()
6150 static void md_clean(struct mddev *mddev) in md_clean() argument
6152 mddev->array_sectors = 0; in md_clean()
6153 mddev->external_size = 0; in md_clean()
6154 mddev->dev_sectors = 0; in md_clean()
6155 mddev->raid_disks = 0; in md_clean()
6156 mddev->recovery_cp = 0; in md_clean()
6157 mddev->resync_min = 0; in md_clean()
6158 mddev->resync_max = MaxSector; in md_clean()
6159 mddev->reshape_position = MaxSector; in md_clean()
6160 mddev->external = 0; in md_clean()
6161 mddev->persistent = 0; in md_clean()
6162 mddev->level = LEVEL_NONE; in md_clean()
6163 mddev->clevel[0] = 0; in md_clean()
6164 mddev->flags = 0; in md_clean()
6165 mddev->sb_flags = 0; in md_clean()
6166 mddev->ro = 0; in md_clean()
6167 mddev->metadata_type[0] = 0; in md_clean()
6168 mddev->chunk_sectors = 0; in md_clean()
6169 mddev->ctime = mddev->utime = 0; in md_clean()
6170 mddev->layout = 0; in md_clean()
6171 mddev->max_disks = 0; in md_clean()
6172 mddev->events = 0; in md_clean()
6173 mddev->can_decrease_events = 0; in md_clean()
6174 mddev->delta_disks = 0; in md_clean()
6175 mddev->reshape_backwards = 0; in md_clean()
6176 mddev->new_level = LEVEL_NONE; in md_clean()
6177 mddev->new_layout = 0; in md_clean()
6178 mddev->new_chunk_sectors = 0; in md_clean()
6179 mddev->curr_resync = 0; in md_clean()
6180 atomic64_set(&mddev->resync_mismatches, 0); in md_clean()
6181 mddev->suspend_lo = mddev->suspend_hi = 0; in md_clean()
6182 mddev->sync_speed_min = mddev->sync_speed_max = 0; in md_clean()
6183 mddev->recovery = 0; in md_clean()
6184 mddev->in_sync = 0; in md_clean()
6185 mddev->changed = 0; in md_clean()
6186 mddev->degraded = 0; in md_clean()
6187 mddev->safemode = 0; in md_clean()
6188 mddev->private = NULL; in md_clean()
6189 mddev->cluster_info = NULL; in md_clean()
6190 mddev->bitmap_info.offset = 0; in md_clean()
6191 mddev->bitmap_info.default_offset = 0; in md_clean()
6192 mddev->bitmap_info.default_space = 0; in md_clean()
6193 mddev->bitmap_info.chunksize = 0; in md_clean()
6194 mddev->bitmap_info.daemon_sleep = 0; in md_clean()
6195 mddev->bitmap_info.max_write_behind = 0; in md_clean()
6196 mddev->bitmap_info.nodes = 0; in md_clean()
6199 static void __md_stop_writes(struct mddev *mddev) in __md_stop_writes() argument
6201 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in __md_stop_writes()
6202 if (work_pending(&mddev->del_work)) in __md_stop_writes()
6204 if (mddev->sync_thread) { in __md_stop_writes()
6205 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in __md_stop_writes()
6206 md_reap_sync_thread(mddev); in __md_stop_writes()
6209 del_timer_sync(&mddev->safemode_timer); in __md_stop_writes()
6211 if (mddev->pers && mddev->pers->quiesce) { in __md_stop_writes()
6212 mddev->pers->quiesce(mddev, 1); in __md_stop_writes()
6213 mddev->pers->quiesce(mddev, 0); in __md_stop_writes()
6215 md_bitmap_flush(mddev); in __md_stop_writes()
6217 if (mddev->ro == 0 && in __md_stop_writes()
6218 ((!mddev->in_sync && !mddev_is_clustered(mddev)) || in __md_stop_writes()
6219 mddev->sb_flags)) { in __md_stop_writes()
6221 if (!mddev_is_clustered(mddev)) in __md_stop_writes()
6222 mddev->in_sync = 1; in __md_stop_writes()
6223 md_update_sb(mddev, 1); in __md_stop_writes()
6226 mddev->serialize_policy = 0; in __md_stop_writes()
6227 mddev_destroy_serial_pool(mddev, NULL, true); in __md_stop_writes()
6230 void md_stop_writes(struct mddev *mddev) in md_stop_writes() argument
6232 mddev_lock_nointr(mddev); in md_stop_writes()
6233 __md_stop_writes(mddev); in md_stop_writes()
6234 mddev_unlock(mddev); in md_stop_writes()
6238 static void mddev_detach(struct mddev *mddev) in mddev_detach() argument
6240 md_bitmap_wait_behind_writes(mddev); in mddev_detach()
6241 if (mddev->pers && mddev->pers->quiesce && !mddev->suspended) { in mddev_detach()
6242 mddev->pers->quiesce(mddev, 1); in mddev_detach()
6243 mddev->pers->quiesce(mddev, 0); in mddev_detach()
6245 md_unregister_thread(&mddev->thread); in mddev_detach()
6246 if (mddev->queue) in mddev_detach()
6247 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ in mddev_detach()
6250 static void __md_stop(struct mddev *mddev) in __md_stop() argument
6252 struct md_personality *pers = mddev->pers; in __md_stop()
6253 md_bitmap_destroy(mddev); in __md_stop()
6254 mddev_detach(mddev); in __md_stop()
6256 if (mddev->event_work.func) in __md_stop()
6258 spin_lock(&mddev->lock); in __md_stop()
6259 mddev->pers = NULL; in __md_stop()
6260 spin_unlock(&mddev->lock); in __md_stop()
6261 pers->free(mddev, mddev->private); in __md_stop()
6262 mddev->private = NULL; in __md_stop()
6263 if (pers->sync_request && mddev->to_remove == NULL) in __md_stop()
6264 mddev->to_remove = &md_redundancy_group; in __md_stop()
6266 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in __md_stop()
6269 void md_stop(struct mddev *mddev) in md_stop() argument
6274 __md_stop(mddev); in md_stop()
6275 bioset_exit(&mddev->bio_set); in md_stop()
6276 bioset_exit(&mddev->sync_set); in md_stop()
6277 if (mddev->level != 1 && mddev->level != 10) in md_stop()
6278 bioset_exit(&mddev->io_acct_set); in md_stop()
6283 static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) in md_set_readonly() argument
6288 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { in md_set_readonly()
6290 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
6291 md_wakeup_thread(mddev->thread); in md_set_readonly()
6293 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in md_set_readonly()
6294 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_set_readonly()
6295 if (mddev->sync_thread) in md_set_readonly()
6298 wake_up_process(mddev->sync_thread->tsk); in md_set_readonly()
6300 if (mddev->external && test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) in md_set_readonly()
6302 mddev_unlock(mddev); in md_set_readonly()
6304 &mddev->recovery)); in md_set_readonly()
6305 wait_event(mddev->sb_wait, in md_set_readonly()
6306 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_set_readonly()
6307 mddev_lock_nointr(mddev); in md_set_readonly()
6309 mutex_lock(&mddev->open_mutex); in md_set_readonly()
6310 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || in md_set_readonly()
6311 mddev->sync_thread || in md_set_readonly()
6312 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { in md_set_readonly()
6313 pr_warn("md: %s still in use.\n",mdname(mddev)); in md_set_readonly()
6315 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
6316 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_set_readonly()
6317 md_wakeup_thread(mddev->thread); in md_set_readonly()
6322 if (mddev->pers) { in md_set_readonly()
6323 __md_stop_writes(mddev); in md_set_readonly()
6326 if (mddev->ro==1) in md_set_readonly()
6328 mddev->ro = 1; in md_set_readonly()
6329 set_disk_ro(mddev->gendisk, 1); in md_set_readonly()
6330 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
6331 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_set_readonly()
6332 md_wakeup_thread(mddev->thread); in md_set_readonly()
6333 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_set_readonly()
6337 mutex_unlock(&mddev->open_mutex); in md_set_readonly()
6345 static int do_md_stop(struct mddev *mddev, int mode, in do_md_stop() argument
6348 struct gendisk *disk = mddev->gendisk; in do_md_stop()
6352 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { in do_md_stop()
6354 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in do_md_stop()
6355 md_wakeup_thread(mddev->thread); in do_md_stop()
6357 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in do_md_stop()
6358 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in do_md_stop()
6359 if (mddev->sync_thread) in do_md_stop()
6362 wake_up_process(mddev->sync_thread->tsk); in do_md_stop()
6364 mddev_unlock(mddev); in do_md_stop()
6365 wait_event(resync_wait, (mddev->sync_thread == NULL && in do_md_stop()
6367 &mddev->recovery))); in do_md_stop()
6368 mddev_lock_nointr(mddev); in do_md_stop()
6370 mutex_lock(&mddev->open_mutex); in do_md_stop()
6371 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || in do_md_stop()
6372 mddev->sysfs_active || in do_md_stop()
6373 mddev->sync_thread || in do_md_stop()
6374 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { in do_md_stop()
6375 pr_warn("md: %s still in use.\n",mdname(mddev)); in do_md_stop()
6376 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6378 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in do_md_stop()
6379 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in do_md_stop()
6380 md_wakeup_thread(mddev->thread); in do_md_stop()
6384 if (mddev->pers) { in do_md_stop()
6385 if (mddev->ro) in do_md_stop()
6388 __md_stop_writes(mddev); in do_md_stop()
6389 __md_stop(mddev); in do_md_stop()
6392 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_stop()
6394 rdev_for_each(rdev, mddev) in do_md_stop()
6396 sysfs_unlink_rdev(mddev, rdev); in do_md_stop()
6399 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6400 mddev->changed = 1; in do_md_stop()
6402 if (mddev->ro) in do_md_stop()
6403 mddev->ro = 0; in do_md_stop()
6405 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6410 pr_info("md: %s stopped.\n", mdname(mddev)); in do_md_stop()
6412 if (mddev->bitmap_info.file) { in do_md_stop()
6413 struct file *f = mddev->bitmap_info.file; in do_md_stop()
6414 spin_lock(&mddev->lock); in do_md_stop()
6415 mddev->bitmap_info.file = NULL; in do_md_stop()
6416 spin_unlock(&mddev->lock); in do_md_stop()
6419 mddev->bitmap_info.offset = 0; in do_md_stop()
6421 export_array(mddev); in do_md_stop()
6423 md_clean(mddev); in do_md_stop()
6424 if (mddev->hold_active == UNTIL_STOP) in do_md_stop()
6425 mddev->hold_active = 0; in do_md_stop()
6427 md_new_event(mddev); in do_md_stop()
6428 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_stop()
6433 static void autorun_array(struct mddev *mddev) in autorun_array() argument
6438 if (list_empty(&mddev->disks)) in autorun_array()
6443 rdev_for_each(rdev, mddev) { in autorun_array()
6449 err = do_md_run(mddev); in autorun_array()
6452 do_md_stop(mddev, 0, NULL); in autorun_array()
6471 struct mddev *mddev; in autorun_devices() local
6510 mddev = mddev_find(dev); in autorun_devices()
6511 if (!mddev) in autorun_devices()
6514 if (mddev_lock(mddev)) in autorun_devices()
6515 pr_warn("md: %s locked, cannot run\n", mdname(mddev)); in autorun_devices()
6516 else if (mddev->raid_disks || mddev->major_version in autorun_devices()
6517 || !list_empty(&mddev->disks)) { in autorun_devices()
6519 mdname(mddev), bdevname(rdev0->bdev,b)); in autorun_devices()
6520 mddev_unlock(mddev); in autorun_devices()
6522 pr_debug("md: created %s\n", mdname(mddev)); in autorun_devices()
6523 mddev->persistent = 1; in autorun_devices()
6526 if (bind_rdev_to_array(rdev, mddev)) in autorun_devices()
6529 autorun_array(mddev); in autorun_devices()
6530 mddev_unlock(mddev); in autorun_devices()
6539 mddev_put(mddev); in autorun_devices()
6559 static int get_array_info(struct mddev *mddev, void __user *arg) in get_array_info() argument
6567 rdev_for_each_rcu(rdev, mddev) { in get_array_info()
6584 info.major_version = mddev->major_version; in get_array_info()
6585 info.minor_version = mddev->minor_version; in get_array_info()
6587 info.ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX); in get_array_info()
6588 info.level = mddev->level; in get_array_info()
6589 info.size = mddev->dev_sectors / 2; in get_array_info()
6590 if (info.size != mddev->dev_sectors / 2) /* overflow */ in get_array_info()
6593 info.raid_disks = mddev->raid_disks; in get_array_info()
6594 info.md_minor = mddev->md_minor; in get_array_info()
6595 info.not_persistent= !mddev->persistent; in get_array_info()
6597 info.utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX); in get_array_info()
6599 if (mddev->in_sync) in get_array_info()
6601 if (mddev->bitmap && mddev->bitmap_info.offset) in get_array_info()
6603 if (mddev_is_clustered(mddev)) in get_array_info()
6610 info.layout = mddev->layout; in get_array_info()
6611 info.chunk_size = mddev->chunk_sectors << 9; in get_array_info()
6619 static int get_bitmap_file(struct mddev *mddev, void __user * arg) in get_bitmap_file() argument
6630 spin_lock(&mddev->lock); in get_bitmap_file()
6632 if (mddev->bitmap_info.file) { in get_bitmap_file()
6633 ptr = file_path(mddev->bitmap_info.file, file->pathname, in get_bitmap_file()
6641 spin_unlock(&mddev->lock); in get_bitmap_file()
6651 static int get_disk_info(struct mddev *mddev, void __user * arg) in get_disk_info() argument
6660 rdev = md_find_rdev_nr_rcu(mddev, info.number); in get_disk_info()
6691 int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info) in md_add_new_disk() argument
6697 if (mddev_is_clustered(mddev) && in md_add_new_disk()
6700 mdname(mddev)); in md_add_new_disk()
6707 if (!mddev->raid_disks) { in md_add_new_disk()
6710 rdev = md_import_device(dev, mddev->major_version, mddev->minor_version); in md_add_new_disk()
6716 if (!list_empty(&mddev->disks)) { in md_add_new_disk()
6718 = list_entry(mddev->disks.next, in md_add_new_disk()
6720 err = super_types[mddev->major_version] in md_add_new_disk()
6721 .load_super(rdev, rdev0, mddev->minor_version); in md_add_new_disk()
6730 err = bind_rdev_to_array(rdev, mddev); in md_add_new_disk()
6741 if (mddev->pers) { in md_add_new_disk()
6743 if (!mddev->pers->hot_add_disk) { in md_add_new_disk()
6745 mdname(mddev)); in md_add_new_disk()
6748 if (mddev->persistent) in md_add_new_disk()
6749 rdev = md_import_device(dev, mddev->major_version, in md_add_new_disk()
6750 mddev->minor_version); in md_add_new_disk()
6759 if (!mddev->persistent) { in md_add_new_disk()
6761 info->raid_disk < mddev->raid_disks) { in md_add_new_disk()
6769 super_types[mddev->major_version]. in md_add_new_disk()
6770 validate_super(mddev, rdev); in md_add_new_disk()
6795 rdev_for_each(rdev2, mddev) { in md_add_new_disk()
6801 if (has_journal || mddev->bitmap) { in md_add_new_disk()
6810 if (mddev_is_clustered(mddev)) { in md_add_new_disk()
6815 err = md_cluster_ops->add_new_disk(mddev, rdev); in md_add_new_disk()
6824 err = bind_rdev_to_array(rdev, mddev); in md_add_new_disk()
6829 if (mddev_is_clustered(mddev)) { in md_add_new_disk()
6832 err = md_cluster_ops->new_disk_ack(mddev, in md_add_new_disk()
6839 md_cluster_ops->add_new_disk_cancel(mddev); in md_add_new_disk()
6853 if (mddev->major_version != 0) { in md_add_new_disk()
6854 pr_warn("%s: ADD_NEW_DISK not supported\n", mdname(mddev)); in md_add_new_disk()
6867 if (info->raid_disk < mddev->raid_disks) in md_add_new_disk()
6872 if (rdev->raid_disk < mddev->raid_disks) in md_add_new_disk()
6881 if (!mddev->persistent) { in md_add_new_disk()
6888 err = bind_rdev_to_array(rdev, mddev); in md_add_new_disk()
6898 static int hot_remove_disk(struct mddev *mddev, dev_t dev) in hot_remove_disk() argument
6903 if (!mddev->pers) in hot_remove_disk()
6906 rdev = find_rdev(mddev, dev); in hot_remove_disk()
6914 remove_and_add_spares(mddev, rdev); in hot_remove_disk()
6920 if (mddev_is_clustered(mddev)) { in hot_remove_disk()
6921 if (md_cluster_ops->remove_disk(mddev, rdev)) in hot_remove_disk()
6926 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in hot_remove_disk()
6927 if (mddev->thread) in hot_remove_disk()
6928 md_wakeup_thread(mddev->thread); in hot_remove_disk()
6930 md_update_sb(mddev, 1); in hot_remove_disk()
6931 md_new_event(mddev); in hot_remove_disk()
6936 bdevname(rdev->bdev,b), mdname(mddev)); in hot_remove_disk()
6940 static int hot_add_disk(struct mddev *mddev, dev_t dev) in hot_add_disk() argument
6946 if (!mddev->pers) in hot_add_disk()
6949 if (mddev->major_version != 0) { in hot_add_disk()
6951 mdname(mddev)); in hot_add_disk()
6954 if (!mddev->pers->hot_add_disk) { in hot_add_disk()
6956 mdname(mddev)); in hot_add_disk()
6967 if (mddev->persistent) in hot_add_disk()
6976 bdevname(rdev->bdev,b), mdname(mddev)); in hot_add_disk()
6984 err = bind_rdev_to_array(rdev, mddev); in hot_add_disk()
6995 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in hot_add_disk()
6996 if (!mddev->thread) in hot_add_disk()
6997 md_update_sb(mddev, 1); in hot_add_disk()
7002 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in hot_add_disk()
7003 md_wakeup_thread(mddev->thread); in hot_add_disk()
7004 md_new_event(mddev); in hot_add_disk()
7012 static int set_bitmap_file(struct mddev *mddev, int fd) in set_bitmap_file() argument
7016 if (mddev->pers) { in set_bitmap_file()
7017 if (!mddev->pers->quiesce || !mddev->thread) in set_bitmap_file()
7019 if (mddev->recovery || mddev->sync_thread) in set_bitmap_file()
7028 if (mddev->bitmap || mddev->bitmap_info.file) in set_bitmap_file()
7034 mdname(mddev)); in set_bitmap_file()
7041 mdname(mddev)); in set_bitmap_file()
7045 mdname(mddev)); in set_bitmap_file()
7049 mdname(mddev)); in set_bitmap_file()
7056 mddev->bitmap_info.file = f; in set_bitmap_file()
7057 mddev->bitmap_info.offset = 0; /* file overrides offset */ in set_bitmap_file()
7058 } else if (mddev->bitmap == NULL) in set_bitmap_file()
7061 if (mddev->pers) { in set_bitmap_file()
7065 bitmap = md_bitmap_create(mddev, -1); in set_bitmap_file()
7066 mddev_suspend(mddev); in set_bitmap_file()
7068 mddev->bitmap = bitmap; in set_bitmap_file()
7069 err = md_bitmap_load(mddev); in set_bitmap_file()
7073 md_bitmap_destroy(mddev); in set_bitmap_file()
7076 mddev_resume(mddev); in set_bitmap_file()
7078 mddev_suspend(mddev); in set_bitmap_file()
7079 md_bitmap_destroy(mddev); in set_bitmap_file()
7080 mddev_resume(mddev); in set_bitmap_file()
7084 struct file *f = mddev->bitmap_info.file; in set_bitmap_file()
7086 spin_lock(&mddev->lock); in set_bitmap_file()
7087 mddev->bitmap_info.file = NULL; in set_bitmap_file()
7088 spin_unlock(&mddev->lock); in set_bitmap_file()
7109 int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info) in md_set_array_info() argument
7121 mddev->major_version = info->major_version; in md_set_array_info()
7122 mddev->minor_version = info->minor_version; in md_set_array_info()
7123 mddev->patch_version = info->patch_version; in md_set_array_info()
7124 mddev->persistent = !info->not_persistent; in md_set_array_info()
7128 mddev->ctime = ktime_get_real_seconds(); in md_set_array_info()
7131 mddev->major_version = MD_MAJOR_VERSION; in md_set_array_info()
7132 mddev->minor_version = MD_MINOR_VERSION; in md_set_array_info()
7133 mddev->patch_version = MD_PATCHLEVEL_VERSION; in md_set_array_info()
7134 mddev->ctime = ktime_get_real_seconds(); in md_set_array_info()
7136 mddev->level = info->level; in md_set_array_info()
7137 mddev->clevel[0] = 0; in md_set_array_info()
7138 mddev->dev_sectors = 2 * (sector_t)info->size; in md_set_array_info()
7139 mddev->raid_disks = info->raid_disks; in md_set_array_info()
7144 mddev->recovery_cp = MaxSector; in md_set_array_info()
7146 mddev->recovery_cp = 0; in md_set_array_info()
7147 mddev->persistent = ! info->not_persistent; in md_set_array_info()
7148 mddev->external = 0; in md_set_array_info()
7150 mddev->layout = info->layout; in md_set_array_info()
7151 if (mddev->level == 0) in md_set_array_info()
7153 mddev->layout = -1; in md_set_array_info()
7154 mddev->chunk_sectors = info->chunk_size >> 9; in md_set_array_info()
7156 if (mddev->persistent) { in md_set_array_info()
7157 mddev->max_disks = MD_SB_DISKS; in md_set_array_info()
7158 mddev->flags = 0; in md_set_array_info()
7159 mddev->sb_flags = 0; in md_set_array_info()
7161 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_set_array_info()
7163 mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; in md_set_array_info()
7164 mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9); in md_set_array_info()
7165 mddev->bitmap_info.offset = 0; in md_set_array_info()
7167 mddev->reshape_position = MaxSector; in md_set_array_info()
7172 get_random_bytes(mddev->uuid, 16); in md_set_array_info()
7174 mddev->new_level = mddev->level; in md_set_array_info()
7175 mddev->new_chunk_sectors = mddev->chunk_sectors; in md_set_array_info()
7176 mddev->new_layout = mddev->layout; in md_set_array_info()
7177 mddev->delta_disks = 0; in md_set_array_info()
7178 mddev->reshape_backwards = 0; in md_set_array_info()
7183 void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors) in md_set_array_sectors() argument
7185 lockdep_assert_held(&mddev->reconfig_mutex); in md_set_array_sectors()
7187 if (mddev->external_size) in md_set_array_sectors()
7190 mddev->array_sectors = array_sectors; in md_set_array_sectors()
7194 static int update_size(struct mddev *mddev, sector_t num_sectors) in update_size() argument
7199 sector_t old_dev_sectors = mddev->dev_sectors; in update_size()
7201 if (mddev->pers->resize == NULL) in update_size()
7212 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in update_size()
7213 mddev->sync_thread) in update_size()
7215 if (mddev->ro) in update_size()
7218 rdev_for_each(rdev, mddev) { in update_size()
7226 rv = mddev->pers->resize(mddev, num_sectors); in update_size()
7228 if (mddev_is_clustered(mddev)) in update_size()
7229 md_cluster_ops->update_size(mddev, old_dev_sectors); in update_size()
7230 else if (mddev->queue) { in update_size()
7231 set_capacity_and_notify(mddev->gendisk, in update_size()
7232 mddev->array_sectors); in update_size()
7238 static int update_raid_disks(struct mddev *mddev, int raid_disks) in update_raid_disks() argument
7243 if (mddev->pers->check_reshape == NULL) in update_raid_disks()
7245 if (mddev->ro) in update_raid_disks()
7248 (mddev->max_disks && raid_disks >= mddev->max_disks)) in update_raid_disks()
7250 if (mddev->sync_thread || in update_raid_disks()
7251 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in update_raid_disks()
7252 test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) || in update_raid_disks()
7253 mddev->reshape_position != MaxSector) in update_raid_disks()
7256 rdev_for_each(rdev, mddev) { in update_raid_disks()
7257 if (mddev->raid_disks < raid_disks && in update_raid_disks()
7260 if (mddev->raid_disks > raid_disks && in update_raid_disks()
7265 mddev->delta_disks = raid_disks - mddev->raid_disks; in update_raid_disks()
7266 if (mddev->delta_disks < 0) in update_raid_disks()
7267 mddev->reshape_backwards = 1; in update_raid_disks()
7268 else if (mddev->delta_disks > 0) in update_raid_disks()
7269 mddev->reshape_backwards = 0; in update_raid_disks()
7271 rv = mddev->pers->check_reshape(mddev); in update_raid_disks()
7273 mddev->delta_disks = 0; in update_raid_disks()
7274 mddev->reshape_backwards = 0; in update_raid_disks()
7287 static int update_array_info(struct mddev *mddev, mdu_array_info_t *info) in update_array_info() argument
7294 if (mddev->bitmap && mddev->bitmap_info.offset) in update_array_info()
7297 if (mddev->major_version != info->major_version || in update_array_info()
7298 mddev->minor_version != info->minor_version || in update_array_info()
7300 mddev->ctime != info->ctime || in update_array_info()
7301 mddev->level != info->level || in update_array_info()
7303 mddev->persistent != !info->not_persistent || in update_array_info()
7304 mddev->chunk_sectors != info->chunk_size >> 9 || in update_array_info()
7310 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) in update_array_info()
7312 if (mddev->raid_disks != info->raid_disks) in update_array_info()
7314 if (mddev->layout != info->layout) in update_array_info()
7323 if (mddev->layout != info->layout) { in update_array_info()
7328 if (mddev->pers->check_reshape == NULL) in update_array_info()
7331 mddev->new_layout = info->layout; in update_array_info()
7332 rv = mddev->pers->check_reshape(mddev); in update_array_info()
7334 mddev->new_layout = mddev->layout; in update_array_info()
7338 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) in update_array_info()
7339 rv = update_size(mddev, (sector_t)info->size * 2); in update_array_info()
7341 if (mddev->raid_disks != info->raid_disks) in update_array_info()
7342 rv = update_raid_disks(mddev, info->raid_disks); in update_array_info()
7345 if (mddev->pers->quiesce == NULL || mddev->thread == NULL) { in update_array_info()
7349 if (mddev->recovery || mddev->sync_thread) { in update_array_info()
7356 if (mddev->bitmap) { in update_array_info()
7360 if (mddev->bitmap_info.default_offset == 0) { in update_array_info()
7364 mddev->bitmap_info.offset = in update_array_info()
7365 mddev->bitmap_info.default_offset; in update_array_info()
7366 mddev->bitmap_info.space = in update_array_info()
7367 mddev->bitmap_info.default_space; in update_array_info()
7368 bitmap = md_bitmap_create(mddev, -1); in update_array_info()
7369 mddev_suspend(mddev); in update_array_info()
7371 mddev->bitmap = bitmap; in update_array_info()
7372 rv = md_bitmap_load(mddev); in update_array_info()
7376 md_bitmap_destroy(mddev); in update_array_info()
7377 mddev_resume(mddev); in update_array_info()
7380 if (!mddev->bitmap) { in update_array_info()
7384 if (mddev->bitmap->storage.file) { in update_array_info()
7388 if (mddev->bitmap_info.nodes) { in update_array_info()
7390 if (md_cluster_ops->lock_all_bitmaps(mddev) <= 0) { in update_array_info()
7393 md_cluster_ops->unlock_all_bitmaps(mddev); in update_array_info()
7397 mddev->bitmap_info.nodes = 0; in update_array_info()
7398 md_cluster_ops->leave(mddev); in update_array_info()
7400 mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY; in update_array_info()
7402 mddev_suspend(mddev); in update_array_info()
7403 md_bitmap_destroy(mddev); in update_array_info()
7404 mddev_resume(mddev); in update_array_info()
7405 mddev->bitmap_info.offset = 0; in update_array_info()
7408 md_update_sb(mddev, 1); in update_array_info()
7414 static int set_disk_faulty(struct mddev *mddev, dev_t dev) in set_disk_faulty() argument
7419 if (mddev->pers == NULL) in set_disk_faulty()
7423 rdev = md_find_rdev_rcu(mddev, dev); in set_disk_faulty()
7427 md_error(mddev, rdev); in set_disk_faulty()
7443 struct mddev *mddev = bdev->bd_disk->private_data; in md_getgeo() local
7447 geo->cylinders = mddev->array_sectors / 8; in md_getgeo()
7480 struct mddev *mddev = NULL; in md_ioctl() local
7511 mddev = bdev->bd_disk->private_data; in md_ioctl()
7513 if (!mddev) { in md_ioctl()
7521 if (!mddev->raid_disks && !mddev->external) in md_ioctl()
7524 err = get_array_info(mddev, argp); in md_ioctl()
7528 if (!mddev->raid_disks && !mddev->external) in md_ioctl()
7531 err = get_disk_info(mddev, argp); in md_ioctl()
7535 err = set_disk_faulty(mddev, new_decode_dev(arg)); in md_ioctl()
7539 err = get_bitmap_file(mddev, argp); in md_ioctl()
7545 flush_rdev_wq(mddev); in md_ioctl()
7549 wait_event_interruptible_timeout(mddev->sb_wait, in md_ioctl()
7551 &mddev->recovery), in md_ioctl()
7557 mutex_lock(&mddev->open_mutex); in md_ioctl()
7558 if (mddev->pers && atomic_read(&mddev->openers) > 1) { in md_ioctl()
7559 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7563 if (test_and_set_bit(MD_CLOSING, &mddev->flags)) { in md_ioctl()
7564 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7569 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7572 err = mddev_lock(mddev); in md_ioctl()
7587 if (mddev->pers) { in md_ioctl()
7588 err = update_array_info(mddev, &info); in md_ioctl()
7595 if (!list_empty(&mddev->disks)) { in md_ioctl()
7596 pr_warn("md: array %s already has disks!\n", mdname(mddev)); in md_ioctl()
7600 if (mddev->raid_disks) { in md_ioctl()
7601 pr_warn("md: array %s already initialised!\n", mdname(mddev)); in md_ioctl()
7605 err = md_set_array_info(mddev, &info); in md_ioctl()
7618 if ((!mddev->raid_disks && !mddev->external) in md_ioctl()
7631 err = restart_array(mddev); in md_ioctl()
7635 err = do_md_stop(mddev, 0, bdev); in md_ioctl()
7639 err = md_set_readonly(mddev, bdev); in md_ioctl()
7643 err = hot_remove_disk(mddev, new_decode_dev(arg)); in md_ioctl()
7651 if (mddev->pers) { in md_ioctl()
7659 err = md_add_new_disk(mddev, &info); in md_ioctl()
7669 if (mddev->ro && mddev->pers) { in md_ioctl()
7670 if (mddev->ro == 2) { in md_ioctl()
7671 mddev->ro = 0; in md_ioctl()
7672 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_ioctl()
7673 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_ioctl()
7678 if (test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) { in md_ioctl()
7679 mddev_unlock(mddev); in md_ioctl()
7680 wait_event(mddev->sb_wait, in md_ioctl()
7681 !test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags) && in md_ioctl()
7682 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_ioctl()
7683 mddev_lock_nointr(mddev); in md_ioctl()
7698 err = md_add_new_disk(mddev, &info); in md_ioctl()
7703 if (mddev_is_clustered(mddev)) in md_ioctl()
7704 md_cluster_ops->new_disk_ack(mddev, false); in md_ioctl()
7710 err = hot_add_disk(mddev, new_decode_dev(arg)); in md_ioctl()
7714 err = do_md_run(mddev); in md_ioctl()
7718 err = set_bitmap_file(mddev, (int)arg); in md_ioctl()
7727 if (mddev->hold_active == UNTIL_IOCTL && in md_ioctl()
7729 mddev->hold_active = 0; in md_ioctl()
7730 mddev_unlock(mddev); in md_ioctl()
7733 clear_bit(MD_CLOSING, &mddev->flags); in md_ioctl()
7758 struct mddev *mddev = bdev->bd_disk->private_data; in md_set_read_only() local
7761 err = mddev_lock(mddev); in md_set_read_only()
7765 if (!mddev->raid_disks && !mddev->external) { in md_set_read_only()
7774 if (!ro && mddev->ro == 1 && mddev->pers) { in md_set_read_only()
7775 err = restart_array(mddev); in md_set_read_only()
7778 mddev->ro = 2; in md_set_read_only()
7782 mddev_unlock(mddev); in md_set_read_only()
7792 struct mddev *mddev = mddev_find(bdev->bd_dev); in md_open() local
7795 if (!mddev) in md_open()
7798 if (mddev->gendisk != bdev->bd_disk) { in md_open()
7802 mddev_put(mddev); in md_open()
7804 if (work_pending(&mddev->del_work)) in md_open()
7808 BUG_ON(mddev != bdev->bd_disk->private_data); in md_open()
7810 if ((err = mutex_lock_interruptible(&mddev->open_mutex))) in md_open()
7813 if (test_bit(MD_CLOSING, &mddev->flags)) { in md_open()
7814 mutex_unlock(&mddev->open_mutex); in md_open()
7820 atomic_inc(&mddev->openers); in md_open()
7821 mutex_unlock(&mddev->open_mutex); in md_open()
7826 mddev_put(mddev); in md_open()
7832 struct mddev *mddev = disk->private_data; in md_release() local
7834 BUG_ON(!mddev); in md_release()
7835 atomic_dec(&mddev->openers); in md_release()
7836 mddev_put(mddev); in md_release()
7841 struct mddev *mddev = disk->private_data; in md_check_events() local
7844 if (mddev->changed) in md_check_events()
7846 mddev->changed = 0; in md_check_events()
7919 struct mddev *mddev, const char *name) in md_register_thread() argument
7930 thread->mddev = mddev; in md_register_thread()
7934 mdname(thread->mddev), in md_register_thread()
7962 void md_error(struct mddev *mddev, struct md_rdev *rdev) in md_error() argument
7967 if (!mddev->pers || !mddev->pers->error_handler) in md_error()
7969 mddev->pers->error_handler(mddev,rdev); in md_error()
7970 if (mddev->degraded) in md_error()
7971 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_error()
7973 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_error()
7974 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_error()
7975 md_wakeup_thread(mddev->thread); in md_error()
7976 if (mddev->event_work.func) in md_error()
7977 queue_work(md_misc_wq, &mddev->event_work); in md_error()
7978 md_new_event(mddev); in md_error()
8003 static int status_resync(struct seq_file *seq, struct mddev *mddev) in status_resync() argument
8011 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in status_resync()
8012 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in status_resync()
8013 max_sectors = mddev->resync_max_sectors; in status_resync()
8015 max_sectors = mddev->dev_sectors; in status_resync()
8017 resync = mddev->curr_resync; in status_resync()
8019 if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) in status_resync()
8025 resync -= atomic_read(&mddev->recovery_active); in status_resync()
8028 if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery)) { in status_resync()
8031 rdev_for_each(rdev, mddev) in status_resync()
8039 if (mddev->reshape_position != MaxSector) in status_resync()
8045 if (mddev->recovery_cp < MaxSector) { in status_resync()
8082 (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)? in status_resync()
8084 (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)? in status_resync()
8086 (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ? in status_resync()
8109 dt = ((jiffies - mddev->resync_mark) / HZ); in status_resync()
8112 curr_mark_cnt = mddev->curr_mark_cnt; in status_resync()
8113 recovery_active = atomic_read(&mddev->recovery_active); in status_resync()
8114 resync_mark_cnt = mddev->resync_mark_cnt; in status_resync()
8135 struct mddev *mddev; in md_seq_start() local
8150 mddev = list_entry(tmp, struct mddev, all_mddevs); in md_seq_start()
8151 mddev_get(mddev); in md_seq_start()
8153 return mddev; in md_seq_start()
8164 struct mddev *next_mddev, *mddev = v; in md_seq_next() local
8174 tmp = mddev->all_mddevs.next; in md_seq_next()
8176 next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs)); in md_seq_next()
8184 mddev_put(mddev); in md_seq_next()
8191 struct mddev *mddev = v; in md_seq_stop() local
8193 if (mddev && v != (void*)1 && v != (void*)2) in md_seq_stop()
8194 mddev_put(mddev); in md_seq_stop()
8199 struct mddev *mddev = v; in md_seq_show() local
8220 spin_lock(&mddev->lock); in md_seq_show()
8221 if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) { in md_seq_show()
8222 seq_printf(seq, "%s : %sactive", mdname(mddev), in md_seq_show()
8223 mddev->pers ? "" : "in"); in md_seq_show()
8224 if (mddev->pers) { in md_seq_show()
8225 if (mddev->ro==1) in md_seq_show()
8227 if (mddev->ro==2) in md_seq_show()
8229 seq_printf(seq, " %s", mddev->pers->name); in md_seq_show()
8234 rdev_for_each_rcu(rdev, mddev) { in md_seq_show()
8254 if (!list_empty(&mddev->disks)) { in md_seq_show()
8255 if (mddev->pers) in md_seq_show()
8258 mddev->array_sectors / 2); in md_seq_show()
8263 if (mddev->persistent) { in md_seq_show()
8264 if (mddev->major_version != 0 || in md_seq_show()
8265 mddev->minor_version != 90) { in md_seq_show()
8267 mddev->major_version, in md_seq_show()
8268 mddev->minor_version); in md_seq_show()
8270 } else if (mddev->external) in md_seq_show()
8272 mddev->metadata_type); in md_seq_show()
8276 if (mddev->pers) { in md_seq_show()
8277 mddev->pers->status(seq, mddev); in md_seq_show()
8279 if (mddev->pers->sync_request) { in md_seq_show()
8280 if (status_resync(seq, mddev)) in md_seq_show()
8286 md_bitmap_status(seq, mddev->bitmap); in md_seq_show()
8290 spin_unlock(&mddev->lock); in md_seq_show()
8388 int md_setup_cluster(struct mddev *mddev, int nodes) in md_setup_cluster() argument
8402 ret = md_cluster_ops->join(mddev, nodes); in md_setup_cluster()
8404 mddev->safemode_delay = 0; in md_setup_cluster()
8408 void md_cluster_stop(struct mddev *mddev) in md_cluster_stop() argument
8412 md_cluster_ops->leave(mddev); in md_cluster_stop()
8416 static int is_mddev_idle(struct mddev *mddev, int init) in is_mddev_idle() argument
8424 rdev_for_each_rcu(rdev, mddev) { in is_mddev_idle()
8459 void md_done_sync(struct mddev *mddev, int blocks, int ok) in md_done_sync() argument
8462 atomic_sub(blocks, &mddev->recovery_active); in md_done_sync()
8463 wake_up(&mddev->recovery_wait); in md_done_sync()
8465 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_done_sync()
8466 set_bit(MD_RECOVERY_ERROR, &mddev->recovery); in md_done_sync()
8467 md_wakeup_thread(mddev->thread); in md_done_sync()
8480 bool md_write_start(struct mddev *mddev, struct bio *bi) in md_write_start() argument
8487 BUG_ON(mddev->ro == 1); in md_write_start()
8488 if (mddev->ro == 2) { in md_write_start()
8490 mddev->ro = 0; in md_write_start()
8491 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_write_start()
8492 md_wakeup_thread(mddev->thread); in md_write_start()
8493 md_wakeup_thread(mddev->sync_thread); in md_write_start()
8497 percpu_ref_get(&mddev->writes_pending); in md_write_start()
8499 if (mddev->safemode == 1) in md_write_start()
8500 mddev->safemode = 0; in md_write_start()
8502 if (mddev->in_sync || mddev->sync_checkers) { in md_write_start()
8503 spin_lock(&mddev->lock); in md_write_start()
8504 if (mddev->in_sync) { in md_write_start()
8505 mddev->in_sync = 0; in md_write_start()
8506 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_write_start()
8507 set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_write_start()
8508 md_wakeup_thread(mddev->thread); in md_write_start()
8511 spin_unlock(&mddev->lock); in md_write_start()
8515 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_write_start()
8516 if (!mddev->has_superblocks) in md_write_start()
8518 wait_event(mddev->sb_wait, in md_write_start()
8519 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags) || in md_write_start()
8520 mddev->suspended); in md_write_start()
8521 if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in md_write_start()
8522 percpu_ref_put(&mddev->writes_pending); in md_write_start()
8537 void md_write_inc(struct mddev *mddev, struct bio *bi) in md_write_inc() argument
8541 WARN_ON_ONCE(mddev->in_sync || mddev->ro); in md_write_inc()
8542 percpu_ref_get(&mddev->writes_pending); in md_write_inc()
8546 void md_write_end(struct mddev *mddev) in md_write_end() argument
8548 percpu_ref_put(&mddev->writes_pending); in md_write_end()
8550 if (mddev->safemode == 2) in md_write_end()
8551 md_wakeup_thread(mddev->thread); in md_write_end()
8552 else if (mddev->safemode_delay) in md_write_end()
8556 mod_timer(&mddev->safemode_timer, in md_write_end()
8557 roundup(jiffies, mddev->safemode_delay) + in md_write_end()
8558 mddev->safemode_delay); in md_write_end()
8564 void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, in md_submit_discard_bio() argument
8575 if (mddev->gendisk) in md_submit_discard_bio()
8577 disk_devt(mddev->gendisk), in md_submit_discard_bio()
8599 void md_account_bio(struct mddev *mddev, struct bio **bio) in md_account_bio() argument
8607 clone = bio_clone_fast(*bio, GFP_NOIO, &mddev->io_acct_set); in md_account_bio()
8624 void md_allow_write(struct mddev *mddev) in md_allow_write() argument
8626 if (!mddev->pers) in md_allow_write()
8628 if (mddev->ro) in md_allow_write()
8630 if (!mddev->pers->sync_request) in md_allow_write()
8633 spin_lock(&mddev->lock); in md_allow_write()
8634 if (mddev->in_sync) { in md_allow_write()
8635 mddev->in_sync = 0; in md_allow_write()
8636 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_allow_write()
8637 set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_allow_write()
8638 if (mddev->safemode_delay && in md_allow_write()
8639 mddev->safemode == 0) in md_allow_write()
8640 mddev->safemode = 1; in md_allow_write()
8641 spin_unlock(&mddev->lock); in md_allow_write()
8642 md_update_sb(mddev, 0); in md_allow_write()
8643 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_allow_write()
8645 wait_event(mddev->sb_wait, in md_allow_write()
8646 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_allow_write()
8648 spin_unlock(&mddev->lock); in md_allow_write()
8657 struct mddev *mddev = thread->mddev; in md_do_sync() local
8658 struct mddev *mddev2; in md_do_sync()
8674 if (test_bit(MD_RECOVERY_DONE, &mddev->recovery) || in md_do_sync()
8675 test_bit(MD_RECOVERY_WAIT, &mddev->recovery)) in md_do_sync()
8677 if (mddev->ro) {/* never try to sync a read-only array */ in md_do_sync()
8678 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_do_sync()
8682 if (mddev_is_clustered(mddev)) { in md_do_sync()
8683 ret = md_cluster_ops->resync_start(mddev); in md_do_sync()
8687 set_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags); in md_do_sync()
8688 if (!(test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in md_do_sync()
8689 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) || in md_do_sync()
8690 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) in md_do_sync()
8691 && ((unsigned long long)mddev->curr_resync_completed in md_do_sync()
8692 < (unsigned long long)mddev->resync_max_sectors)) in md_do_sync()
8696 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8697 if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) { in md_do_sync()
8700 } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { in md_do_sync()
8705 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in md_do_sync()
8710 mddev->last_sync_action = action ?: desc; in md_do_sync()
8730 mddev->curr_resync = 2; in md_do_sync()
8733 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8736 if (mddev2 == mddev) in md_do_sync()
8738 if (!mddev->parallel_resync in md_do_sync()
8740 && match_mddev_units(mddev, mddev2)) { in md_do_sync()
8742 if (mddev < mddev2 && mddev->curr_resync == 2) { in md_do_sync()
8744 mddev->curr_resync = 1; in md_do_sync()
8747 if (mddev > mddev2 && mddev->curr_resync == 1) in md_do_sync()
8757 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8758 mddev2->curr_resync >= mddev->curr_resync) { in md_do_sync()
8762 desc, mdname(mddev), in md_do_sync()
8775 } while (mddev->curr_resync < 2); in md_do_sync()
8778 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8782 max_sectors = mddev->resync_max_sectors; in md_do_sync()
8783 atomic64_set(&mddev->resync_mismatches, 0); in md_do_sync()
8785 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
8786 j = mddev->resync_min; in md_do_sync()
8787 else if (!mddev->bitmap) in md_do_sync()
8788 j = mddev->recovery_cp; in md_do_sync()
8790 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) { in md_do_sync()
8791 max_sectors = mddev->resync_max_sectors; in md_do_sync()
8797 if (mddev_is_clustered(mddev) && in md_do_sync()
8798 mddev->reshape_position != MaxSector) in md_do_sync()
8799 j = mddev->reshape_position; in md_do_sync()
8802 max_sectors = mddev->dev_sectors; in md_do_sync()
8805 rdev_for_each_rcu(rdev, mddev) in md_do_sync()
8822 if (mddev->bitmap) { in md_do_sync()
8823 mddev->pers->quiesce(mddev, 1); in md_do_sync()
8824 mddev->pers->quiesce(mddev, 0); in md_do_sync()
8828 pr_info("md: %s of RAID array %s\n", desc, mdname(mddev)); in md_do_sync()
8829 pr_debug("md: minimum _guaranteed_ speed: %d KB/sec/disk.\n", speed_min(mddev)); in md_do_sync()
8831 speed_max(mddev), desc); in md_do_sync()
8833 is_mddev_idle(mddev, 1); /* this initializes IO event counters */ in md_do_sync()
8841 mddev->resync_mark = mark[last_mark]; in md_do_sync()
8842 mddev->resync_mark_cnt = mark_cnt[last_mark]; in md_do_sync()
8851 atomic_set(&mddev->recovery_active, 0); in md_do_sync()
8856 desc, mdname(mddev)); in md_do_sync()
8857 mddev->curr_resync = j; in md_do_sync()
8859 mddev->curr_resync = 3; /* no longer delayed */ in md_do_sync()
8860 mddev->curr_resync_completed = j; in md_do_sync()
8861 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_do_sync()
8862 md_new_event(mddev); in md_do_sync()
8871 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8872 ((mddev->curr_resync > mddev->curr_resync_completed && in md_do_sync()
8873 (mddev->curr_resync - mddev->curr_resync_completed) in md_do_sync()
8876 (j - mddev->curr_resync_completed)*2 in md_do_sync()
8877 >= mddev->resync_max - mddev->curr_resync_completed || in md_do_sync()
8878 mddev->curr_resync_completed > mddev->resync_max in md_do_sync()
8881 wait_event(mddev->recovery_wait, in md_do_sync()
8882 atomic_read(&mddev->recovery_active) == 0); in md_do_sync()
8883 mddev->curr_resync_completed = j; in md_do_sync()
8884 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && in md_do_sync()
8885 j > mddev->recovery_cp) in md_do_sync()
8886 mddev->recovery_cp = j; in md_do_sync()
8888 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_do_sync()
8889 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_do_sync()
8892 while (j >= mddev->resync_max && in md_do_sync()
8893 !test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
8899 wait_event_interruptible(mddev->recovery_wait, in md_do_sync()
8900 mddev->resync_max > j in md_do_sync()
8902 &mddev->recovery)); in md_do_sync()
8905 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8908 sectors = mddev->pers->sync_request(mddev, j, &skipped); in md_do_sync()
8910 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_do_sync()
8916 atomic_add(sectors, &mddev->recovery_active); in md_do_sync()
8919 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8927 mddev->curr_resync = j; in md_do_sync()
8928 mddev->curr_mark_cnt = io_sectors; in md_do_sync()
8933 md_new_event(mddev); in md_do_sync()
8944 mddev->resync_mark = mark[next]; in md_do_sync()
8945 mddev->resync_mark_cnt = mark_cnt[next]; in md_do_sync()
8947 mark_cnt[next] = io_sectors - atomic_read(&mddev->recovery_active); in md_do_sync()
8951 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8964 recovery_done = io_sectors - atomic_read(&mddev->recovery_active); in md_do_sync()
8965 currspeed = ((unsigned long)(recovery_done - mddev->resync_mark_cnt))/2 in md_do_sync()
8966 /((jiffies-mddev->resync_mark)/HZ +1) +1; in md_do_sync()
8968 if (currspeed > speed_min(mddev)) { in md_do_sync()
8969 if (currspeed > speed_max(mddev)) { in md_do_sync()
8973 if (!is_mddev_idle(mddev, 0)) { in md_do_sync()
8978 wait_event(mddev->recovery_wait, in md_do_sync()
8979 !atomic_read(&mddev->recovery_active)); in md_do_sync()
8983 pr_info("md: %s: %s %s.\n",mdname(mddev), desc, in md_do_sync()
8984 test_bit(MD_RECOVERY_INTR, &mddev->recovery) in md_do_sync()
8990 wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); in md_do_sync()
8992 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8993 !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8994 mddev->curr_resync > 3) { in md_do_sync()
8995 mddev->curr_resync_completed = mddev->curr_resync; in md_do_sync()
8996 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_do_sync()
8998 mddev->pers->sync_request(mddev, max_sectors, &skipped); in md_do_sync()
9000 if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) && in md_do_sync()
9001 mddev->curr_resync > 3) { in md_do_sync()
9002 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
9003 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
9004 if (mddev->curr_resync >= mddev->recovery_cp) { in md_do_sync()
9006 desc, mdname(mddev)); in md_do_sync()
9008 &mddev->recovery)) in md_do_sync()
9009 mddev->recovery_cp = in md_do_sync()
9010 mddev->curr_resync_completed; in md_do_sync()
9012 mddev->recovery_cp = in md_do_sync()
9013 mddev->curr_resync; in md_do_sync()
9016 mddev->recovery_cp = MaxSector; in md_do_sync()
9018 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
9019 mddev->curr_resync = MaxSector; in md_do_sync()
9020 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
9021 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) { in md_do_sync()
9023 rdev_for_each_rcu(rdev, mddev) in md_do_sync()
9025 mddev->delta_disks >= 0 && in md_do_sync()
9029 rdev->recovery_offset < mddev->curr_resync) in md_do_sync()
9030 rdev->recovery_offset = mddev->curr_resync; in md_do_sync()
9039 set_mask_bits(&mddev->sb_flags, 0, in md_do_sync()
9042 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
9043 !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
9044 mddev->delta_disks > 0 && in md_do_sync()
9045 mddev->pers->finish_reshape && in md_do_sync()
9046 mddev->pers->size && in md_do_sync()
9047 mddev->queue) { in md_do_sync()
9048 mddev_lock_nointr(mddev); in md_do_sync()
9049 md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0)); in md_do_sync()
9050 mddev_unlock(mddev); in md_do_sync()
9051 if (!mddev_is_clustered(mddev)) in md_do_sync()
9052 set_capacity_and_notify(mddev->gendisk, in md_do_sync()
9053 mddev->array_sectors); in md_do_sync()
9056 spin_lock(&mddev->lock); in md_do_sync()
9057 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
9059 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
9060 mddev->resync_min = 0; in md_do_sync()
9061 mddev->resync_max = MaxSector; in md_do_sync()
9062 } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
9063 mddev->resync_min = mddev->curr_resync_completed; in md_do_sync()
9064 set_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_do_sync()
9065 mddev->curr_resync = 0; in md_do_sync()
9066 spin_unlock(&mddev->lock); in md_do_sync()
9069 md_wakeup_thread(mddev->thread); in md_do_sync()
9074 static int remove_and_add_spares(struct mddev *mddev, in remove_and_add_spares() argument
9082 if (this && test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in remove_and_add_spares()
9086 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
9104 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
9112 if (mddev->pers->hot_remove_disk( in remove_and_add_spares()
9113 mddev, rdev) == 0) { in remove_and_add_spares()
9114 sysfs_unlink_rdev(mddev, rdev); in remove_and_add_spares()
9124 if (removed && mddev->kobj.sd) in remove_and_add_spares()
9125 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in remove_and_add_spares()
9130 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
9145 if (mddev->ro && in remove_and_add_spares()
9152 if (mddev->pers->hot_add_disk(mddev, rdev) == 0) { in remove_and_add_spares()
9154 sysfs_link_rdev(mddev, rdev); in remove_and_add_spares()
9157 md_new_event(mddev); in remove_and_add_spares()
9158 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in remove_and_add_spares()
9163 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in remove_and_add_spares()
9169 struct mddev *mddev = container_of(ws, struct mddev, del_work); in md_start_sync() local
9171 mddev->sync_thread = md_register_thread(md_do_sync, in md_start_sync()
9172 mddev, in md_start_sync()
9174 if (!mddev->sync_thread) { in md_start_sync()
9176 mdname(mddev)); in md_start_sync()
9178 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_start_sync()
9179 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_start_sync()
9180 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_start_sync()
9181 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_start_sync()
9182 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_start_sync()
9185 &mddev->recovery)) in md_start_sync()
9186 if (mddev->sysfs_action) in md_start_sync()
9187 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_start_sync()
9189 md_wakeup_thread(mddev->sync_thread); in md_start_sync()
9190 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_start_sync()
9191 md_new_event(mddev); in md_start_sync()
9216 void md_check_recovery(struct mddev *mddev) in md_check_recovery() argument
9218 if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags) && mddev->sb_flags) { in md_check_recovery()
9222 set_bit(MD_UPDATING_SB, &mddev->flags); in md_check_recovery()
9224 if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags)) in md_check_recovery()
9225 md_update_sb(mddev, 0); in md_check_recovery()
9226 clear_bit_unlock(MD_UPDATING_SB, &mddev->flags); in md_check_recovery()
9227 wake_up(&mddev->sb_wait); in md_check_recovery()
9230 if (mddev->suspended) in md_check_recovery()
9233 if (mddev->bitmap) in md_check_recovery()
9234 md_bitmap_daemon_work(mddev); in md_check_recovery()
9237 if (mddev->pers->sync_request && !mddev->external) { in md_check_recovery()
9239 mdname(mddev)); in md_check_recovery()
9240 mddev->safemode = 2; in md_check_recovery()
9245 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) in md_check_recovery()
9248 (mddev->sb_flags & ~ (1<<MD_SB_CHANGE_PENDING)) || in md_check_recovery()
9249 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || in md_check_recovery()
9250 test_bit(MD_RECOVERY_DONE, &mddev->recovery) || in md_check_recovery()
9251 (mddev->external == 0 && mddev->safemode == 1) || in md_check_recovery()
9252 (mddev->safemode == 2 in md_check_recovery()
9253 && !mddev->in_sync && mddev->recovery_cp == MaxSector) in md_check_recovery()
9257 if (mddev_trylock(mddev)) { in md_check_recovery()
9259 bool try_set_sync = mddev->safemode != 0; in md_check_recovery()
9261 if (!mddev->external && mddev->safemode == 1) in md_check_recovery()
9262 mddev->safemode = 0; in md_check_recovery()
9264 if (mddev->ro) { in md_check_recovery()
9266 if (!mddev->external && mddev->in_sync) in md_check_recovery()
9272 rdev_for_each(rdev, mddev) in md_check_recovery()
9281 remove_and_add_spares(mddev, NULL); in md_check_recovery()
9285 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_check_recovery()
9286 md_reap_sync_thread(mddev); in md_check_recovery()
9287 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9288 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_check_recovery()
9289 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_check_recovery()
9293 if (mddev_is_clustered(mddev)) { in md_check_recovery()
9298 rdev_for_each_safe(rdev, tmp, mddev) { in md_check_recovery()
9305 if (try_set_sync && !mddev->external && !mddev->in_sync) { in md_check_recovery()
9306 spin_lock(&mddev->lock); in md_check_recovery()
9307 set_in_sync(mddev); in md_check_recovery()
9308 spin_unlock(&mddev->lock); in md_check_recovery()
9311 if (mddev->sb_flags) in md_check_recovery()
9312 md_update_sb(mddev, 0); in md_check_recovery()
9314 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in md_check_recovery()
9315 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) { in md_check_recovery()
9317 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_check_recovery()
9320 if (mddev->sync_thread) { in md_check_recovery()
9321 md_reap_sync_thread(mddev); in md_check_recovery()
9327 mddev->curr_resync_completed = 0; in md_check_recovery()
9328 spin_lock(&mddev->lock); in md_check_recovery()
9329 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_check_recovery()
9330 spin_unlock(&mddev->lock); in md_check_recovery()
9334 clear_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_check_recovery()
9335 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_check_recovery()
9337 if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || in md_check_recovery()
9338 test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) in md_check_recovery()
9347 if (mddev->reshape_position != MaxSector) { in md_check_recovery()
9348 if (mddev->pers->check_reshape == NULL || in md_check_recovery()
9349 mddev->pers->check_reshape(mddev) != 0) in md_check_recovery()
9352 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_check_recovery()
9353 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9354 } else if ((spares = remove_and_add_spares(mddev, NULL))) { in md_check_recovery()
9355 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_check_recovery()
9356 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_check_recovery()
9357 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_check_recovery()
9358 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9359 } else if (mddev->recovery_cp < MaxSector) { in md_check_recovery()
9360 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_check_recovery()
9361 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9362 } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) in md_check_recovery()
9366 if (mddev->pers->sync_request) { in md_check_recovery()
9372 md_bitmap_write_all(mddev->bitmap); in md_check_recovery()
9374 INIT_WORK(&mddev->del_work, md_start_sync); in md_check_recovery()
9375 queue_work(md_misc_wq, &mddev->del_work); in md_check_recovery()
9379 if (!mddev->sync_thread) { in md_check_recovery()
9380 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_check_recovery()
9383 &mddev->recovery)) in md_check_recovery()
9384 if (mddev->sysfs_action) in md_check_recovery()
9385 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_check_recovery()
9388 wake_up(&mddev->sb_wait); in md_check_recovery()
9389 mddev_unlock(mddev); in md_check_recovery()
9394 void md_reap_sync_thread(struct mddev *mddev) in md_reap_sync_thread() argument
9397 sector_t old_dev_sectors = mddev->dev_sectors; in md_reap_sync_thread()
9401 md_unregister_thread(&mddev->sync_thread); in md_reap_sync_thread()
9402 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_reap_sync_thread()
9403 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && in md_reap_sync_thread()
9404 mddev->degraded != mddev->raid_disks) { in md_reap_sync_thread()
9407 if (mddev->pers->spare_active(mddev)) { in md_reap_sync_thread()
9408 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in md_reap_sync_thread()
9409 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_reap_sync_thread()
9412 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_reap_sync_thread()
9413 mddev->pers->finish_reshape) { in md_reap_sync_thread()
9414 mddev->pers->finish_reshape(mddev); in md_reap_sync_thread()
9415 if (mddev_is_clustered(mddev)) in md_reap_sync_thread()
9422 if (!mddev->degraded) in md_reap_sync_thread()
9423 rdev_for_each(rdev, mddev) in md_reap_sync_thread()
9426 md_update_sb(mddev, 1); in md_reap_sync_thread()
9430 if (test_and_clear_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags)) in md_reap_sync_thread()
9431 md_cluster_ops->resync_finish(mddev); in md_reap_sync_thread()
9432 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_reap_sync_thread()
9433 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_reap_sync_thread()
9434 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_reap_sync_thread()
9435 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_reap_sync_thread()
9436 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_reap_sync_thread()
9437 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_reap_sync_thread()
9443 if (mddev_is_clustered(mddev) && is_reshaped in md_reap_sync_thread()
9444 && !test_bit(MD_CLOSING, &mddev->flags)) in md_reap_sync_thread()
9445 md_cluster_ops->update_size(mddev, old_dev_sectors); in md_reap_sync_thread()
9448 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_reap_sync_thread()
9449 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_reap_sync_thread()
9450 md_new_event(mddev); in md_reap_sync_thread()
9451 if (mddev->event_work.func) in md_reap_sync_thread()
9452 queue_work(md_misc_wq, &mddev->event_work); in md_reap_sync_thread()
9456 void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev) in md_wait_for_blocked_rdev() argument
9463 rdev_dec_pending(rdev, mddev); in md_wait_for_blocked_rdev()
9467 void md_finish_reshape(struct mddev *mddev) in md_finish_reshape() argument
9472 rdev_for_each(rdev, mddev) { in md_finish_reshape()
9488 struct mddev *mddev = rdev->mddev; in rdev_set_badblocks() local
9500 set_mask_bits(&mddev->sb_flags, 0, in rdev_set_badblocks()
9502 md_wakeup_thread(rdev->mddev->thread); in rdev_set_badblocks()
9528 struct mddev *mddev; in md_notify_reboot() local
9531 for_each_mddev(mddev, tmp) { in md_notify_reboot()
9532 if (mddev_trylock(mddev)) { in md_notify_reboot()
9533 if (mddev->pers) in md_notify_reboot()
9534 __md_stop_writes(mddev); in md_notify_reboot()
9535 if (mddev->persistent) in md_notify_reboot()
9536 mddev->safemode = 2; in md_notify_reboot()
9537 mddev_unlock(mddev); in md_notify_reboot()
9609 static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev) in check_sb_changes() argument
9620 if (mddev->dev_sectors != le64_to_cpu(sb->size)) { in check_sb_changes()
9621 ret = mddev->pers->resize(mddev, le64_to_cpu(sb->size)); in check_sb_changes()
9625 md_bitmap_update_sb(mddev->bitmap); in check_sb_changes()
9629 rdev_for_each_safe(rdev2, tmp, mddev) { in check_sb_changes()
9654 ret = remove_and_add_spares(mddev, rdev2); in check_sb_changes()
9659 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in check_sb_changes()
9660 md_wakeup_thread(mddev->thread); in check_sb_changes()
9668 md_error(mddev, rdev2); in check_sb_changes()
9674 if (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) { in check_sb_changes()
9675 ret = update_raid_disks(mddev, le32_to_cpu(sb->raid_disks)); in check_sb_changes()
9684 if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) && in check_sb_changes()
9690 mddev->reshape_position = le64_to_cpu(sb->reshape_position); in check_sb_changes()
9691 if (mddev->pers->update_reshape_pos) in check_sb_changes()
9692 mddev->pers->update_reshape_pos(mddev); in check_sb_changes()
9693 if (mddev->pers->start_reshape) in check_sb_changes()
9694 mddev->pers->start_reshape(mddev); in check_sb_changes()
9695 } else if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) && in check_sb_changes()
9696 mddev->reshape_position != MaxSector && in check_sb_changes()
9699 mddev->reshape_position = MaxSector; in check_sb_changes()
9700 if (mddev->pers->update_reshape_pos) in check_sb_changes()
9701 mddev->pers->update_reshape_pos(mddev); in check_sb_changes()
9705 mddev->events = le64_to_cpu(sb->events); in check_sb_changes()
9708 static int read_rdev(struct mddev *mddev, struct md_rdev *rdev) in read_rdev() argument
9722 err = super_types[mddev->major_version]. in read_rdev()
9723 load_super(rdev, NULL, mddev->minor_version); in read_rdev()
9748 mddev->pers->spare_active(mddev)) in read_rdev()
9749 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in read_rdev()
9755 void md_reload_sb(struct mddev *mddev, int nr) in md_reload_sb() argument
9761 rdev_for_each_rcu(rdev, mddev) { in md_reload_sb()
9771 err = read_rdev(mddev, rdev); in md_reload_sb()
9775 check_sb_changes(mddev, rdev); in md_reload_sb()
9778 rdev_for_each_rcu(rdev, mddev) { in md_reload_sb()
9780 read_rdev(mddev, rdev); in md_reload_sb()
9856 struct mddev *mddev; in md_exit() local
9877 for_each_mddev(mddev, tmp) { in md_exit()
9878 export_array(mddev); in md_exit()
9879 mddev->ctime = 0; in md_exit()
9880 mddev->hold_active = 0; in md_exit()