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()
344 struct mddev *mddev) in bio_alloc_mddev() argument
346 if (!mddev || !bioset_initialized(&mddev->bio_set)) in bio_alloc_mddev()
349 return bio_alloc_bioset(gfp_mask, nr_iovecs, &mddev->bio_set); in bio_alloc_mddev()
353 static struct bio *md_bio_alloc_sync(struct mddev *mddev) in md_bio_alloc_sync() argument
355 if (!mddev || !bioset_initialized(&mddev->sync_set)) in md_bio_alloc_sync()
358 return bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set); in md_bio_alloc_sync()
373 void md_new_event(struct mddev *mddev) in md_new_event() argument
400 mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\
403 _mddev = list_entry(_tmp, struct mddev, all_mddevs); \
416 static bool is_suspended(struct mddev *mddev, struct bio *bio) in is_suspended() argument
418 if (mddev->suspended) in is_suspended()
422 if (mddev->suspend_lo >= mddev->suspend_hi) in is_suspended()
424 if (bio->bi_iter.bi_sector >= mddev->suspend_hi) in is_suspended()
426 if (bio_end_sector(bio) < mddev->suspend_lo) in is_suspended()
431 void md_handle_request(struct mddev *mddev, struct bio *bio) in md_handle_request() argument
435 if (is_suspended(mddev, bio)) { in md_handle_request()
438 prepare_to_wait(&mddev->sb_wait, &__wait, in md_handle_request()
440 if (!is_suspended(mddev, bio)) in md_handle_request()
446 finish_wait(&mddev->sb_wait, &__wait); in md_handle_request()
448 atomic_inc(&mddev->active_io); in md_handle_request()
451 if (!mddev->pers->make_request(mddev, bio)) { in md_handle_request()
452 atomic_dec(&mddev->active_io); in md_handle_request()
453 wake_up(&mddev->sb_wait); in md_handle_request()
457 if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) in md_handle_request()
458 wake_up(&mddev->sb_wait); in md_handle_request()
463 struct mddev *mddev; member
473 struct mddev *mddev = md_io->mddev; in md_end_io() local
480 mempool_free(md_io, &mddev->md_io_pool); in md_end_io()
489 struct mddev *mddev = bio->bi_disk->private_data; in md_submit_bio() local
491 if (mddev == NULL || mddev->pers == NULL) { in md_submit_bio()
496 if (unlikely(test_bit(MD_BROKEN, &mddev->flags)) && (rw == WRITE)) { in md_submit_bio()
503 if (mddev->ro == 1 && unlikely(rw == WRITE)) { in md_submit_bio()
513 md_io = mempool_alloc(&mddev->md_io_pool, GFP_NOIO); in md_submit_bio()
514 md_io->mddev = mddev; in md_submit_bio()
521 md_io->start_time = part_start_io_acct(mddev->gendisk, in md_submit_bio()
528 md_handle_request(mddev, bio); in md_submit_bio()
539 void mddev_suspend(struct mddev *mddev) in mddev_suspend() argument
541 WARN_ON_ONCE(mddev->thread && current == mddev->thread->tsk); in mddev_suspend()
542 lockdep_assert_held(&mddev->reconfig_mutex); in mddev_suspend()
543 if (mddev->suspended++) in mddev_suspend()
546 wake_up(&mddev->sb_wait); in mddev_suspend()
547 set_bit(MD_ALLOW_SB_UPDATE, &mddev->flags); in mddev_suspend()
549 wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); in mddev_suspend()
550 mddev->pers->quiesce(mddev, 1); in mddev_suspend()
551 clear_bit_unlock(MD_ALLOW_SB_UPDATE, &mddev->flags); in mddev_suspend()
552 wait_event(mddev->sb_wait, !test_bit(MD_UPDATING_SB, &mddev->flags)); in mddev_suspend()
554 del_timer_sync(&mddev->safemode_timer); in mddev_suspend()
556 mddev->noio_flag = memalloc_noio_save(); in mddev_suspend()
560 void mddev_resume(struct mddev *mddev) in mddev_resume() argument
563 memalloc_noio_restore(mddev->noio_flag); in mddev_resume()
564 lockdep_assert_held(&mddev->reconfig_mutex); in mddev_resume()
565 if (--mddev->suspended) in mddev_resume()
567 wake_up(&mddev->sb_wait); in mddev_resume()
568 mddev->pers->quiesce(mddev, 0); in mddev_resume()
570 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in mddev_resume()
571 md_wakeup_thread(mddev->thread); in mddev_resume()
572 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ in mddev_resume()
583 struct mddev *mddev = rdev->mddev; in md_end_flush() local
585 rdev_dec_pending(rdev, mddev); in md_end_flush()
587 if (atomic_dec_and_test(&mddev->flush_pending)) { in md_end_flush()
589 queue_work(md_wq, &mddev->flush_work); in md_end_flush()
598 struct mddev *mddev = container_of(ws, struct mddev, flush_work); in submit_flushes() local
601 mddev->start_flush = ktime_get_boottime(); in submit_flushes()
602 INIT_WORK(&mddev->flush_work, md_submit_flush_data); in submit_flushes()
603 atomic_set(&mddev->flush_pending, 1); in submit_flushes()
605 rdev_for_each_rcu(rdev, mddev) in submit_flushes()
616 bi = bio_alloc_mddev(GFP_NOIO, 0, mddev); in submit_flushes()
621 atomic_inc(&mddev->flush_pending); in submit_flushes()
624 rdev_dec_pending(rdev, mddev); in submit_flushes()
627 if (atomic_dec_and_test(&mddev->flush_pending)) in submit_flushes()
628 queue_work(md_wq, &mddev->flush_work); in submit_flushes()
633 struct mddev *mddev = container_of(ws, struct mddev, flush_work); in md_submit_flush_data() local
634 struct bio *bio = mddev->flush_bio; in md_submit_flush_data()
642 mddev->last_flush = mddev->start_flush; in md_submit_flush_data()
643 mddev->flush_bio = NULL; in md_submit_flush_data()
644 wake_up(&mddev->sb_wait); in md_submit_flush_data()
651 md_handle_request(mddev, bio); in md_submit_flush_data()
661 bool md_flush_request(struct mddev *mddev, struct bio *bio) in md_flush_request() argument
664 spin_lock_irq(&mddev->lock); in md_flush_request()
665 wait_event_lock_irq(mddev->sb_wait, in md_flush_request()
666 !mddev->flush_bio || in md_flush_request()
667 ktime_after(mddev->last_flush, start), in md_flush_request()
668 mddev->lock); in md_flush_request()
669 if (!ktime_after(mddev->last_flush, start)) { in md_flush_request()
670 WARN_ON(mddev->flush_bio); in md_flush_request()
671 mddev->flush_bio = bio; in md_flush_request()
674 spin_unlock_irq(&mddev->lock); in md_flush_request()
677 INIT_WORK(&mddev->flush_work, submit_flushes); in md_flush_request()
678 queue_work(md_wq, &mddev->flush_work); in md_flush_request()
693 static inline struct mddev *mddev_get(struct mddev *mddev) in mddev_get() argument
695 atomic_inc(&mddev->active); in mddev_get()
696 return mddev; in mddev_get()
701 static void mddev_put(struct mddev *mddev) in mddev_put() argument
703 if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock)) in mddev_put()
705 if (!mddev->raid_disks && list_empty(&mddev->disks) && in mddev_put()
706 mddev->ctime == 0 && !mddev->hold_active) { in mddev_put()
709 list_del_init(&mddev->all_mddevs); in mddev_put()
716 INIT_WORK(&mddev->del_work, mddev_delayed_delete); in mddev_put()
717 queue_work(md_misc_wq, &mddev->del_work); in mddev_put()
724 void mddev_init(struct mddev *mddev) in mddev_init() argument
726 kobject_init(&mddev->kobj, &md_ktype); in mddev_init()
727 mutex_init(&mddev->open_mutex); in mddev_init()
728 mutex_init(&mddev->reconfig_mutex); in mddev_init()
729 mutex_init(&mddev->bitmap_info.mutex); in mddev_init()
730 INIT_LIST_HEAD(&mddev->disks); in mddev_init()
731 INIT_LIST_HEAD(&mddev->all_mddevs); in mddev_init()
732 timer_setup(&mddev->safemode_timer, md_safemode_timeout, 0); in mddev_init()
733 atomic_set(&mddev->active, 1); in mddev_init()
734 atomic_set(&mddev->openers, 0); in mddev_init()
735 atomic_set(&mddev->active_io, 0); in mddev_init()
736 spin_lock_init(&mddev->lock); in mddev_init()
737 atomic_set(&mddev->flush_pending, 0); in mddev_init()
738 init_waitqueue_head(&mddev->sb_wait); in mddev_init()
739 init_waitqueue_head(&mddev->recovery_wait); in mddev_init()
740 mddev->reshape_position = MaxSector; in mddev_init()
741 mddev->reshape_backwards = 0; in mddev_init()
742 mddev->last_sync_action = "none"; in mddev_init()
743 mddev->resync_min = 0; in mddev_init()
744 mddev->resync_max = MaxSector; in mddev_init()
745 mddev->level = LEVEL_NONE; in mddev_init()
749 static struct mddev *mddev_find(dev_t unit) in mddev_find()
751 struct mddev *mddev, *new = NULL; in mddev_find() local
760 list_for_each_entry(mddev, &all_mddevs, all_mddevs) in mddev_find()
761 if (mddev->unit == unit) { in mddev_find()
762 mddev_get(mddev); in mddev_find()
765 return mddev; in mddev_find()
793 list_for_each_entry(mddev, &all_mddevs, all_mddevs) in mddev_find()
794 if (mddev->unit == dev) { in mddev_find()
825 void mddev_unlock(struct mddev *mddev) in mddev_unlock() argument
827 if (mddev->to_remove) { in mddev_unlock()
840 struct attribute_group *to_remove = mddev->to_remove; in mddev_unlock()
841 mddev->to_remove = NULL; in mddev_unlock()
842 mddev->sysfs_active = 1; in mddev_unlock()
843 mutex_unlock(&mddev->reconfig_mutex); in mddev_unlock()
845 if (mddev->kobj.sd) { in mddev_unlock()
847 sysfs_remove_group(&mddev->kobj, to_remove); in mddev_unlock()
848 if (mddev->pers == NULL || in mddev_unlock()
849 mddev->pers->sync_request == NULL) { in mddev_unlock()
850 sysfs_remove_group(&mddev->kobj, &md_redundancy_group); in mddev_unlock()
851 if (mddev->sysfs_action) in mddev_unlock()
852 sysfs_put(mddev->sysfs_action); in mddev_unlock()
853 if (mddev->sysfs_completed) in mddev_unlock()
854 sysfs_put(mddev->sysfs_completed); in mddev_unlock()
855 if (mddev->sysfs_degraded) in mddev_unlock()
856 sysfs_put(mddev->sysfs_degraded); in mddev_unlock()
857 mddev->sysfs_action = NULL; in mddev_unlock()
858 mddev->sysfs_completed = NULL; in mddev_unlock()
859 mddev->sysfs_degraded = NULL; in mddev_unlock()
862 mddev->sysfs_active = 0; in mddev_unlock()
864 mutex_unlock(&mddev->reconfig_mutex); in mddev_unlock()
870 md_wakeup_thread(mddev->thread); in mddev_unlock()
871 wake_up(&mddev->sb_wait); in mddev_unlock()
876 struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr) in md_find_rdev_nr_rcu() argument
880 rdev_for_each_rcu(rdev, mddev) in md_find_rdev_nr_rcu()
888 static struct md_rdev *find_rdev(struct mddev *mddev, dev_t dev) in find_rdev() argument
892 rdev_for_each(rdev, mddev) in find_rdev()
899 struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev) in md_find_rdev_rcu() argument
903 rdev_for_each_rcu(rdev, mddev) in md_find_rdev_rcu()
958 struct mddev *mddev = rdev->mddev; in super_written() local
963 md_error(mddev, rdev); in super_written()
966 set_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags); in super_written()
972 if (atomic_dec_and_test(&mddev->pending_writes)) in super_written()
973 wake_up(&mddev->sb_wait); in super_written()
974 rdev_dec_pending(rdev, mddev); in super_written()
978 void md_super_write(struct mddev *mddev, struct md_rdev *rdev, in md_super_write() argument
996 bio = md_bio_alloc_sync(mddev); in md_super_write()
1006 if (test_bit(MD_FAILFAST_SUPPORTED, &mddev->flags) && in md_super_write()
1012 atomic_inc(&mddev->pending_writes); in md_super_write()
1016 int md_super_wait(struct mddev *mddev) in md_super_wait() argument
1019 wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0); in md_super_wait()
1020 if (test_and_clear_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags)) in md_super_wait()
1028 struct bio *bio = md_bio_alloc_sync(rdev->mddev); in sync_page_io()
1038 else if (rdev->mddev->reshape_position != MaxSector && in sync_page_io()
1039 (rdev->mddev->reshape_backwards == in sync_page_io()
1040 (sector >= rdev->mddev->reshape_position))) in sync_page_io()
1181 int (*validate_super)(struct mddev *mddev,
1183 void (*sync_super)(struct mddev *mddev,
1199 int md_check_no_bitmap(struct mddev *mddev) in md_check_no_bitmap() argument
1201 if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset) in md_check_no_bitmap()
1204 mdname(mddev), mddev->pers->name); in md_check_no_bitmap()
1321 static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) in super_90_validate() argument
1333 if (mddev->raid_disks == 0) { in super_90_validate()
1334 mddev->major_version = 0; in super_90_validate()
1335 mddev->minor_version = sb->minor_version; in super_90_validate()
1336 mddev->patch_version = sb->patch_version; in super_90_validate()
1337 mddev->external = 0; in super_90_validate()
1338 mddev->chunk_sectors = sb->chunk_size >> 9; in super_90_validate()
1339 mddev->ctime = sb->ctime; in super_90_validate()
1340 mddev->utime = sb->utime; in super_90_validate()
1341 mddev->level = sb->level; in super_90_validate()
1342 mddev->clevel[0] = 0; in super_90_validate()
1343 mddev->layout = sb->layout; in super_90_validate()
1344 mddev->raid_disks = sb->raid_disks; in super_90_validate()
1345 mddev->dev_sectors = ((sector_t)sb->size) * 2; in super_90_validate()
1346 mddev->events = ev1; in super_90_validate()
1347 mddev->bitmap_info.offset = 0; in super_90_validate()
1348 mddev->bitmap_info.space = 0; in super_90_validate()
1350 mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; in super_90_validate()
1351 mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9); in super_90_validate()
1352 mddev->reshape_backwards = 0; in super_90_validate()
1354 if (mddev->minor_version >= 91) { in super_90_validate()
1355 mddev->reshape_position = sb->reshape_position; in super_90_validate()
1356 mddev->delta_disks = sb->delta_disks; in super_90_validate()
1357 mddev->new_level = sb->new_level; in super_90_validate()
1358 mddev->new_layout = sb->new_layout; in super_90_validate()
1359 mddev->new_chunk_sectors = sb->new_chunk >> 9; in super_90_validate()
1360 if (mddev->delta_disks < 0) in super_90_validate()
1361 mddev->reshape_backwards = 1; in super_90_validate()
1363 mddev->reshape_position = MaxSector; in super_90_validate()
1364 mddev->delta_disks = 0; in super_90_validate()
1365 mddev->new_level = mddev->level; in super_90_validate()
1366 mddev->new_layout = mddev->layout; in super_90_validate()
1367 mddev->new_chunk_sectors = mddev->chunk_sectors; in super_90_validate()
1369 if (mddev->level == 0) in super_90_validate()
1370 mddev->layout = -1; in super_90_validate()
1373 mddev->recovery_cp = MaxSector; in super_90_validate()
1377 mddev->recovery_cp = sb->recovery_cp; in super_90_validate()
1379 mddev->recovery_cp = 0; in super_90_validate()
1382 memcpy(mddev->uuid+0, &sb->set_uuid0, 4); in super_90_validate()
1383 memcpy(mddev->uuid+4, &sb->set_uuid1, 4); in super_90_validate()
1384 memcpy(mddev->uuid+8, &sb->set_uuid2, 4); in super_90_validate()
1385 memcpy(mddev->uuid+12,&sb->set_uuid3, 4); in super_90_validate()
1387 mddev->max_disks = MD_SB_DISKS; in super_90_validate()
1390 mddev->bitmap_info.file == NULL) { in super_90_validate()
1391 mddev->bitmap_info.offset = in super_90_validate()
1392 mddev->bitmap_info.default_offset; in super_90_validate()
1393 mddev->bitmap_info.space = in super_90_validate()
1394 mddev->bitmap_info.default_space; in super_90_validate()
1397 } else if (mddev->pers == NULL) { in super_90_validate()
1403 if (ev1 < mddev->events) in super_90_validate()
1405 } else if (mddev->bitmap) { in super_90_validate()
1409 if (ev1 < mddev->bitmap->events_cleared) in super_90_validate()
1411 if (ev1 < mddev->events) in super_90_validate()
1414 if (ev1 < mddev->events) in super_90_validate()
1419 if (mddev->level != LEVEL_MULTIPATH) { in super_90_validate()
1433 if (mddev->minor_version >= 91) { in super_90_validate()
1450 static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev) in super_90_sync() argument
1454 int next_spare = mddev->raid_disks; in super_90_sync()
1476 sb->major_version = mddev->major_version; in super_90_sync()
1477 sb->patch_version = mddev->patch_version; in super_90_sync()
1479 memcpy(&sb->set_uuid0, mddev->uuid+0, 4); in super_90_sync()
1480 memcpy(&sb->set_uuid1, mddev->uuid+4, 4); in super_90_sync()
1481 memcpy(&sb->set_uuid2, mddev->uuid+8, 4); in super_90_sync()
1482 memcpy(&sb->set_uuid3, mddev->uuid+12,4); in super_90_sync()
1484 sb->ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX); in super_90_sync()
1485 sb->level = mddev->level; in super_90_sync()
1486 sb->size = mddev->dev_sectors / 2; in super_90_sync()
1487 sb->raid_disks = mddev->raid_disks; in super_90_sync()
1488 sb->md_minor = mddev->md_minor; in super_90_sync()
1490 sb->utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX); in super_90_sync()
1492 sb->events_hi = (mddev->events>>32); in super_90_sync()
1493 sb->events_lo = (u32)mddev->events; in super_90_sync()
1495 if (mddev->reshape_position == MaxSector) in super_90_sync()
1499 sb->reshape_position = mddev->reshape_position; in super_90_sync()
1500 sb->new_level = mddev->new_level; in super_90_sync()
1501 sb->delta_disks = mddev->delta_disks; in super_90_sync()
1502 sb->new_layout = mddev->new_layout; in super_90_sync()
1503 sb->new_chunk = mddev->new_chunk_sectors << 9; in super_90_sync()
1505 mddev->minor_version = sb->minor_version; in super_90_sync()
1506 if (mddev->in_sync) in super_90_sync()
1508 sb->recovery_cp = mddev->recovery_cp; in super_90_sync()
1509 sb->cp_events_hi = (mddev->events>>32); in super_90_sync()
1510 sb->cp_events_lo = (u32)mddev->events; in super_90_sync()
1511 if (mddev->recovery_cp == MaxSector) in super_90_sync()
1516 sb->layout = mddev->layout; in super_90_sync()
1517 sb->chunk_size = mddev->chunk_sectors << 9; in super_90_sync()
1519 if (mddev->bitmap && mddev->bitmap_info.file == NULL) in super_90_sync()
1523 rdev_for_each(rdev2, mddev) { in super_90_sync()
1571 for (i=0 ; i < mddev->raid_disks ; i++) { in super_90_sync()
1597 if (num_sectors && num_sectors < rdev->mddev->dev_sectors) in super_90_rdev_size_change()
1599 if (rdev->mddev->bitmap_info.offset) in super_90_rdev_size_change()
1607 if ((u64)num_sectors >= (2ULL << 32) && rdev->mddev->level >= 1) in super_90_rdev_size_change()
1610 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, in super_90_rdev_size_change()
1612 } while (md_super_wait(rdev->mddev) < 0); in super_90_rdev_size_change()
1836 static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) in super_1_validate() argument
1847 if (mddev->raid_disks == 0) { in super_1_validate()
1848 mddev->major_version = 1; in super_1_validate()
1849 mddev->patch_version = 0; in super_1_validate()
1850 mddev->external = 0; in super_1_validate()
1851 mddev->chunk_sectors = le32_to_cpu(sb->chunksize); in super_1_validate()
1852 mddev->ctime = le64_to_cpu(sb->ctime); in super_1_validate()
1853 mddev->utime = le64_to_cpu(sb->utime); in super_1_validate()
1854 mddev->level = le32_to_cpu(sb->level); in super_1_validate()
1855 mddev->clevel[0] = 0; in super_1_validate()
1856 mddev->layout = le32_to_cpu(sb->layout); in super_1_validate()
1857 mddev->raid_disks = le32_to_cpu(sb->raid_disks); in super_1_validate()
1858 mddev->dev_sectors = le64_to_cpu(sb->size); in super_1_validate()
1859 mddev->events = ev1; in super_1_validate()
1860 mddev->bitmap_info.offset = 0; in super_1_validate()
1861 mddev->bitmap_info.space = 0; in super_1_validate()
1865 mddev->bitmap_info.default_offset = 1024 >> 9; in super_1_validate()
1866 mddev->bitmap_info.default_space = (4096-1024) >> 9; in super_1_validate()
1867 mddev->reshape_backwards = 0; in super_1_validate()
1869 mddev->recovery_cp = le64_to_cpu(sb->resync_offset); in super_1_validate()
1870 memcpy(mddev->uuid, sb->set_uuid, 16); in super_1_validate()
1872 mddev->max_disks = (4096-256)/2; in super_1_validate()
1875 mddev->bitmap_info.file == NULL) { in super_1_validate()
1876 mddev->bitmap_info.offset = in super_1_validate()
1883 if (mddev->minor_version > 0) in super_1_validate()
1884 mddev->bitmap_info.space = 0; in super_1_validate()
1885 else if (mddev->bitmap_info.offset > 0) in super_1_validate()
1886 mddev->bitmap_info.space = in super_1_validate()
1887 8 - mddev->bitmap_info.offset; in super_1_validate()
1889 mddev->bitmap_info.space = in super_1_validate()
1890 -mddev->bitmap_info.offset; in super_1_validate()
1894 mddev->reshape_position = le64_to_cpu(sb->reshape_position); in super_1_validate()
1895 mddev->delta_disks = le32_to_cpu(sb->delta_disks); in super_1_validate()
1896 mddev->new_level = le32_to_cpu(sb->new_level); in super_1_validate()
1897 mddev->new_layout = le32_to_cpu(sb->new_layout); in super_1_validate()
1898 mddev->new_chunk_sectors = le32_to_cpu(sb->new_chunk); in super_1_validate()
1899 if (mddev->delta_disks < 0 || in super_1_validate()
1900 (mddev->delta_disks == 0 && in super_1_validate()
1903 mddev->reshape_backwards = 1; in super_1_validate()
1905 mddev->reshape_position = MaxSector; in super_1_validate()
1906 mddev->delta_disks = 0; in super_1_validate()
1907 mddev->new_level = mddev->level; in super_1_validate()
1908 mddev->new_layout = mddev->layout; in super_1_validate()
1909 mddev->new_chunk_sectors = mddev->chunk_sectors; in super_1_validate()
1912 if (mddev->level == 0 && in super_1_validate()
1914 mddev->layout = -1; in super_1_validate()
1917 set_bit(MD_HAS_JOURNAL, &mddev->flags); in super_1_validate()
1928 set_bit(MD_HAS_PPL, &mddev->flags); in super_1_validate()
1930 } else if (mddev->pers == NULL) { in super_1_validate()
1938 if (ev1 < mddev->events) in super_1_validate()
1940 } else if (mddev->bitmap) { in super_1_validate()
1944 if (ev1 < mddev->bitmap->events_cleared) in super_1_validate()
1946 if (ev1 < mddev->events) in super_1_validate()
1949 if (ev1 < mddev->events) in super_1_validate()
1953 if (mddev->level != LEVEL_MULTIPATH) { in super_1_validate()
1991 &mddev->recovery)) in super_1_validate()
2009 static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev) in super_1_sync() argument
2023 sb->utime = cpu_to_le64((__u64)mddev->utime); in super_1_sync()
2024 sb->events = cpu_to_le64(mddev->events); in super_1_sync()
2025 if (mddev->in_sync) in super_1_sync()
2026 sb->resync_offset = cpu_to_le64(mddev->recovery_cp); in super_1_sync()
2027 else if (test_bit(MD_JOURNAL_CLEAN, &mddev->flags)) in super_1_sync()
2034 sb->raid_disks = cpu_to_le32(mddev->raid_disks); in super_1_sync()
2035 sb->size = cpu_to_le64(mddev->dev_sectors); in super_1_sync()
2036 sb->chunksize = cpu_to_le32(mddev->chunk_sectors); in super_1_sync()
2037 sb->level = cpu_to_le32(mddev->level); in super_1_sync()
2038 sb->layout = cpu_to_le32(mddev->layout); in super_1_sync()
2051 if (mddev->bitmap && mddev->bitmap_info.file == NULL) { in super_1_sync()
2052 sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset); in super_1_sync()
2062 if (rdev->saved_raid_disk >= 0 && mddev->bitmap) in super_1_sync()
2073 if (mddev->reshape_position != MaxSector) { in super_1_sync()
2075 sb->reshape_position = cpu_to_le64(mddev->reshape_position); in super_1_sync()
2076 sb->new_layout = cpu_to_le32(mddev->new_layout); in super_1_sync()
2077 sb->delta_disks = cpu_to_le32(mddev->delta_disks); in super_1_sync()
2078 sb->new_level = cpu_to_le32(mddev->new_level); in super_1_sync()
2079 sb->new_chunk = cpu_to_le32(mddev->new_chunk_sectors); in super_1_sync()
2080 if (mddev->delta_disks == 0 && in super_1_sync()
2081 mddev->reshape_backwards) in super_1_sync()
2092 if (mddev_is_clustered(mddev)) in super_1_sync()
2099 md_error(mddev, rdev); in super_1_sync()
2130 rdev_for_each(rdev2, mddev) in super_1_sync()
2147 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) in super_1_sync()
2150 if (test_bit(MD_HAS_PPL, &mddev->flags)) { in super_1_sync()
2151 if (test_bit(MD_HAS_MULTIPLE_PPLS, &mddev->flags)) in super_1_sync()
2160 rdev_for_each(rdev2, mddev) { in super_1_sync()
2200 if (num_sectors && num_sectors < rdev->mddev->dev_sectors) in super_1_rdev_size_change()
2210 } else if (rdev->mddev->bitmap_info.offset) { in super_1_rdev_size_change()
2237 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, in super_1_rdev_size_change()
2239 } while (md_super_wait(rdev->mddev) < 0); in super_1_rdev_size_change()
2255 if (rdev->mddev->minor_version == 0) in super_1_allow_new_offset()
2266 bitmap = rdev->mddev->bitmap; in super_1_allow_new_offset()
2267 if (bitmap && !rdev->mddev->bitmap_info.file && in super_1_allow_new_offset()
2268 rdev->sb_start + rdev->mddev->bitmap_info.offset + in super_1_allow_new_offset()
2298 static void sync_super(struct mddev *mddev, struct md_rdev *rdev) in sync_super() argument
2300 if (mddev->sync_super) { in sync_super()
2301 mddev->sync_super(mddev, rdev); in sync_super()
2305 BUG_ON(mddev->major_version >= ARRAY_SIZE(super_types)); in sync_super()
2307 super_types[mddev->major_version].sync_super(mddev, rdev); in sync_super()
2310 static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2) in match_mddev_units()
2344 int md_integrity_register(struct mddev *mddev) in md_integrity_register() argument
2348 if (list_empty(&mddev->disks)) in md_integrity_register()
2350 if (!mddev->gendisk || blk_get_integrity(mddev->gendisk)) in md_integrity_register()
2352 rdev_for_each(rdev, mddev) { in md_integrity_register()
2374 blk_integrity_register(mddev->gendisk, in md_integrity_register()
2377 pr_debug("md: data integrity enabled on %s\n", mdname(mddev)); in md_integrity_register()
2378 if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE)) { in md_integrity_register()
2380 mdname(mddev)); in md_integrity_register()
2391 int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev) in md_integrity_add_rdev() argument
2396 if (!mddev->gendisk) in md_integrity_add_rdev()
2399 bi_mddev = blk_get_integrity(mddev->gendisk); in md_integrity_add_rdev()
2404 if (blk_integrity_compare(mddev->gendisk, rdev->bdev->bd_disk) != 0) { in md_integrity_add_rdev()
2406 mdname(mddev), bdevname(rdev->bdev, name)); in md_integrity_add_rdev()
2414 static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev) in bind_rdev_to_array() argument
2421 if (find_rdev(mddev, rdev->bdev->bd_dev)) in bind_rdev_to_array()
2425 mddev->pers) in bind_rdev_to_array()
2431 (mddev->dev_sectors == 0 || rdev->sectors < mddev->dev_sectors)) { in bind_rdev_to_array()
2432 if (mddev->pers) { in bind_rdev_to_array()
2437 if (mddev->level > 0) in bind_rdev_to_array()
2440 mddev->dev_sectors = rdev->sectors; in bind_rdev_to_array()
2450 if (mddev->pers) in bind_rdev_to_array()
2451 choice = mddev->raid_disks; in bind_rdev_to_array()
2452 while (md_find_rdev_nr_rcu(mddev, choice)) in bind_rdev_to_array()
2456 if (md_find_rdev_nr_rcu(mddev, rdev->desc_nr)) { in bind_rdev_to_array()
2463 mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { in bind_rdev_to_array()
2465 mdname(mddev), mddev->max_disks); in bind_rdev_to_array()
2471 rdev->mddev = mddev; in bind_rdev_to_array()
2474 if (mddev->raid_disks) in bind_rdev_to_array()
2475 mddev_create_serial_pool(mddev, rdev, false); in bind_rdev_to_array()
2477 if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b))) in bind_rdev_to_array()
2489 list_add_rcu(&rdev->same_set, &mddev->disks); in bind_rdev_to_array()
2490 bd_link_disk_holder(rdev->bdev, mddev->gendisk); in bind_rdev_to_array()
2493 mddev->recovery_disabled++; in bind_rdev_to_array()
2499 b, mdname(mddev)); in bind_rdev_to_array()
2514 bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk); in unbind_rdev_from_array()
2517 mddev_destroy_serial_pool(rdev->mddev, rdev, false); in unbind_rdev_from_array()
2518 rdev->mddev = NULL; in unbind_rdev_from_array()
2588 static void export_array(struct mddev *mddev) in export_array() argument
2592 while (!list_empty(&mddev->disks)) { in export_array()
2593 rdev = list_first_entry(&mddev->disks, struct md_rdev, in export_array()
2597 mddev->raid_disks = 0; in export_array()
2598 mddev->major_version = 0; in export_array()
2601 static bool set_in_sync(struct mddev *mddev) in set_in_sync() argument
2603 lockdep_assert_held(&mddev->lock); in set_in_sync()
2604 if (!mddev->in_sync) { in set_in_sync()
2605 mddev->sync_checkers++; in set_in_sync()
2606 spin_unlock(&mddev->lock); in set_in_sync()
2607 percpu_ref_switch_to_atomic_sync(&mddev->writes_pending); in set_in_sync()
2608 spin_lock(&mddev->lock); in set_in_sync()
2609 if (!mddev->in_sync && in set_in_sync()
2610 percpu_ref_is_zero(&mddev->writes_pending)) { in set_in_sync()
2611 mddev->in_sync = 1; in set_in_sync()
2617 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in set_in_sync()
2618 sysfs_notify_dirent_safe(mddev->sysfs_state); in set_in_sync()
2620 if (--mddev->sync_checkers == 0) in set_in_sync()
2621 percpu_ref_switch_to_percpu(&mddev->writes_pending); in set_in_sync()
2623 if (mddev->safemode == 1) in set_in_sync()
2624 mddev->safemode = 0; in set_in_sync()
2625 return mddev->in_sync; in set_in_sync()
2628 static void sync_sbs(struct mddev *mddev, int nospares) in sync_sbs() argument
2637 rdev_for_each(rdev, mddev) { in sync_sbs()
2638 if (rdev->sb_events == mddev->events || in sync_sbs()
2641 rdev->sb_events+1 == mddev->events)) { in sync_sbs()
2645 sync_super(mddev, rdev); in sync_sbs()
2651 static bool does_sb_need_changing(struct mddev *mddev) in does_sb_need_changing() argument
2658 rdev_for_each(rdev, mddev) in does_sb_need_changing()
2668 rdev_for_each(rdev, mddev) { in does_sb_need_changing()
2680 if ((mddev->dev_sectors != le64_to_cpu(sb->size)) || in does_sb_need_changing()
2681 (mddev->reshape_position != le64_to_cpu(sb->reshape_position)) || in does_sb_need_changing()
2682 (mddev->layout != le32_to_cpu(sb->layout)) || in does_sb_need_changing()
2683 (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) || in does_sb_need_changing()
2684 (mddev->chunk_sectors != le32_to_cpu(sb->chunksize))) in does_sb_need_changing()
2690 void md_update_sb(struct mddev *mddev, int force_change) in md_update_sb() argument
2698 if (mddev->ro) { in md_update_sb()
2700 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_update_sb()
2705 if (mddev_is_clustered(mddev)) { in md_update_sb()
2706 if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) in md_update_sb()
2708 if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags)) in md_update_sb()
2710 ret = md_cluster_ops->metadata_update_start(mddev); in md_update_sb()
2712 if (!does_sb_need_changing(mddev)) { in md_update_sb()
2714 md_cluster_ops->metadata_update_cancel(mddev); in md_update_sb()
2715 bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING), in md_update_sb()
2728 rdev_for_each(rdev, mddev) { in md_update_sb()
2730 mddev->delta_disks >= 0 && in md_update_sb()
2731 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in md_update_sb()
2732 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery) && in md_update_sb()
2733 !test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_update_sb()
2736 mddev->curr_resync_completed > rdev->recovery_offset) in md_update_sb()
2737 rdev->recovery_offset = mddev->curr_resync_completed; in md_update_sb()
2740 if (!mddev->persistent) { in md_update_sb()
2741 clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_update_sb()
2742 clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_update_sb()
2743 if (!mddev->external) { in md_update_sb()
2744 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_update_sb()
2745 rdev_for_each(rdev, mddev) { in md_update_sb()
2749 md_error(mddev, rdev); in md_update_sb()
2756 wake_up(&mddev->sb_wait); in md_update_sb()
2760 spin_lock(&mddev->lock); in md_update_sb()
2762 mddev->utime = ktime_get_real_seconds(); in md_update_sb()
2764 if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) in md_update_sb()
2766 if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags)) in md_update_sb()
2774 if (mddev->degraded) in md_update_sb()
2786 sync_req = mddev->in_sync; in md_update_sb()
2791 && (mddev->in_sync && mddev->recovery_cp == MaxSector) in md_update_sb()
2792 && mddev->can_decrease_events in md_update_sb()
2793 && mddev->events != 1) { in md_update_sb()
2794 mddev->events--; in md_update_sb()
2795 mddev->can_decrease_events = 0; in md_update_sb()
2798 mddev->events ++; in md_update_sb()
2799 mddev->can_decrease_events = nospares; in md_update_sb()
2807 WARN_ON(mddev->events == 0); in md_update_sb()
2809 rdev_for_each(rdev, mddev) { in md_update_sb()
2816 sync_sbs(mddev, nospares); in md_update_sb()
2817 spin_unlock(&mddev->lock); in md_update_sb()
2820 mdname(mddev), mddev->in_sync); in md_update_sb()
2822 if (mddev->queue) in md_update_sb()
2823 blk_add_trace_msg(mddev->queue, "md md_update_sb"); in md_update_sb()
2825 md_bitmap_update_sb(mddev->bitmap); in md_update_sb()
2826 rdev_for_each(rdev, mddev) { in md_update_sb()
2833 md_super_write(mddev,rdev, in md_update_sb()
2839 rdev->sb_events = mddev->events; in md_update_sb()
2841 md_super_write(mddev, rdev, in md_update_sb()
2852 if (mddev->level == LEVEL_MULTIPATH) in md_update_sb()
2856 if (md_super_wait(mddev) < 0) in md_update_sb()
2860 if (mddev_is_clustered(mddev) && ret == 0) in md_update_sb()
2861 md_cluster_ops->metadata_update_finish(mddev); in md_update_sb()
2863 if (mddev->in_sync != sync_req || in md_update_sb()
2864 !bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING), in md_update_sb()
2868 wake_up(&mddev->sb_wait); in md_update_sb()
2869 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in md_update_sb()
2870 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_update_sb()
2872 rdev_for_each(rdev, mddev) { in md_update_sb()
2886 struct mddev *mddev = rdev->mddev; in add_bound_rdev() local
2890 if (!mddev->pers->hot_remove_disk || add_journal) { in add_bound_rdev()
2895 super_types[mddev->major_version]. in add_bound_rdev()
2896 validate_super(mddev, rdev); in add_bound_rdev()
2898 mddev_suspend(mddev); in add_bound_rdev()
2899 err = mddev->pers->hot_add_disk(mddev, rdev); in add_bound_rdev()
2901 mddev_resume(mddev); in add_bound_rdev()
2909 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in add_bound_rdev()
2910 if (mddev->degraded) in add_bound_rdev()
2911 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in add_bound_rdev()
2912 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in add_bound_rdev()
2913 md_new_event(mddev); in add_bound_rdev()
2914 md_wakeup_thread(mddev->thread); in add_bound_rdev()
3004 if (cmd_match(buf, "faulty") && rdev->mddev->pers) { in state_store()
3005 md_error(rdev->mddev, rdev); in state_store()
3011 if (rdev->mddev->pers) { in state_store()
3013 remove_and_add_spares(rdev->mddev, rdev); in state_store()
3018 struct mddev *mddev = rdev->mddev; in state_store() local
3020 if (mddev_is_clustered(mddev)) in state_store()
3021 err = md_cluster_ops->remove_disk(mddev, rdev); in state_store()
3025 if (mddev->pers) { in state_store()
3026 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in state_store()
3027 md_wakeup_thread(mddev->thread); in state_store()
3029 md_new_event(mddev); in state_store()
3034 mddev_create_serial_pool(rdev->mddev, rdev, false); in state_store()
3037 mddev_destroy_serial_pool(rdev->mddev, rdev, false); in state_store()
3050 md_error(rdev->mddev, rdev); in state_store()
3055 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in state_store()
3056 md_wakeup_thread(rdev->mddev->thread); in state_store()
3070 if (rdev->mddev->pers == NULL) { in state_store()
3091 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in state_store()
3092 md_wakeup_thread(rdev->mddev->thread); in state_store()
3105 if (rdev->mddev->pers) in state_store()
3113 if (rdev->mddev->pers) in state_store()
3120 if (!rdev->mddev->pers) in state_store()
3130 if (!mddev_is_clustered(rdev->mddev) || in state_store()
3137 } else if (cmd_match(buf, "external_bbl") && (rdev->mddev->external)) { in state_store()
3141 } else if (cmd_match(buf, "-external_bbl") && (rdev->mddev->external)) { in state_store()
3199 if (rdev->mddev->pers && slot == -1) { in slot_store()
3210 if (rdev->mddev->pers->hot_remove_disk == NULL) in slot_store()
3213 remove_and_add_spares(rdev->mddev, rdev); in slot_store()
3216 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in slot_store()
3217 md_wakeup_thread(rdev->mddev->thread); in slot_store()
3218 } else if (rdev->mddev->pers) { in slot_store()
3227 if (test_bit(MD_RECOVERY_RUNNING, &rdev->mddev->recovery)) in slot_store()
3230 if (rdev->mddev->pers->hot_add_disk == NULL) in slot_store()
3233 if (slot >= rdev->mddev->raid_disks && in slot_store()
3234 slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks) in slot_store()
3244 err = rdev->mddev->pers->hot_add_disk(rdev->mddev, rdev); in slot_store()
3251 sysfs_link_rdev(rdev->mddev, rdev); in slot_store()
3254 if (slot >= rdev->mddev->raid_disks && in slot_store()
3255 slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks) in slot_store()
3282 if (rdev->mddev->pers && rdev->raid_disk >= 0) in offset_store()
3284 if (rdev->sectors && rdev->mddev->external) in offset_store()
3306 struct mddev *mddev = rdev->mddev; in new_offset_store() local
3311 if (mddev->sync_thread || in new_offset_store()
3312 test_bit(MD_RECOVERY_RUNNING,&mddev->recovery)) in new_offset_store()
3320 + mddev->dev_sectors > rdev->sectors) in new_offset_store()
3329 mddev->reshape_backwards) in new_offset_store()
3336 !mddev->reshape_backwards) in new_offset_store()
3339 if (mddev->pers && mddev->persistent && in new_offset_store()
3340 !super_types[mddev->major_version] in new_offset_store()
3345 mddev->reshape_backwards = 1; in new_offset_store()
3347 mddev->reshape_backwards = 0; in new_offset_store()
3392 struct mddev *my_mddev = rdev->mddev; in rdev_size_store()
3426 struct mddev *mddev; in rdev_size_store() local
3431 for_each_mddev(mddev, tmp) { in rdev_size_store()
3434 rdev_for_each(rdev2, mddev) in rdev_size_store()
3444 mddev_put(mddev); in rdev_size_store()
3486 if (rdev->mddev->pers && in recovery_start_store()
3554 if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) && in ppl_sector_store()
3558 if (rdev->mddev->persistent) { in ppl_sector_store()
3559 if (rdev->mddev->major_version == 0) in ppl_sector_store()
3567 } else if (!rdev->mddev->external) { in ppl_sector_store()
3591 if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) && in ppl_size_store()
3595 if (rdev->mddev->persistent) { in ppl_size_store()
3596 if (rdev->mddev->major_version == 0) in ppl_size_store()
3600 } else if (!rdev->mddev->external) { in ppl_size_store()
3632 if (!rdev->mddev) in rdev_attr_show()
3644 struct mddev *mddev = rdev->mddev; in rdev_attr_store() local
3650 rv = mddev ? mddev_lock(mddev) : -ENODEV; in rdev_attr_store()
3652 if (rdev->mddev == NULL) in rdev_attr_store()
3656 mddev_unlock(mddev); in rdev_attr_store()
3774 static int analyze_sbs(struct mddev *mddev) in analyze_sbs() argument
3781 rdev_for_each_safe(rdev, tmp, mddev) in analyze_sbs()
3782 switch (super_types[mddev->major_version]. in analyze_sbs()
3783 load_super(rdev, freshest, mddev->minor_version)) { in analyze_sbs()
3801 super_types[mddev->major_version]. in analyze_sbs()
3802 validate_super(mddev, freshest); in analyze_sbs()
3805 rdev_for_each_safe(rdev, tmp, mddev) { in analyze_sbs()
3806 if (mddev->max_disks && in analyze_sbs()
3807 (rdev->desc_nr >= mddev->max_disks || in analyze_sbs()
3808 i > mddev->max_disks)) { in analyze_sbs()
3810 mdname(mddev), bdevname(rdev->bdev, b), in analyze_sbs()
3811 mddev->max_disks); in analyze_sbs()
3816 if (super_types[mddev->major_version]. in analyze_sbs()
3817 validate_super(mddev, rdev)) { in analyze_sbs()
3824 if (mddev->level == LEVEL_MULTIPATH) { in analyze_sbs()
3829 (mddev->raid_disks - min(0, mddev->delta_disks)) && in analyze_sbs()
3876 safe_delay_show(struct mddev *mddev, char *page) in safe_delay_show() argument
3878 int msec = (mddev->safemode_delay*1000)/HZ; in safe_delay_show()
3882 safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len) in safe_delay_store() argument
3886 if (mddev_is_clustered(mddev)) { in safe_delay_store()
3894 mddev->safemode_delay = 0; in safe_delay_store()
3896 unsigned long old_delay = mddev->safemode_delay; in safe_delay_store()
3901 mddev->safemode_delay = new_delay; in safe_delay_store()
3903 mod_timer(&mddev->safemode_timer, jiffies+1); in safe_delay_store()
3911 level_show(struct mddev *mddev, char *page) in level_show() argument
3915 spin_lock(&mddev->lock); in level_show()
3916 p = mddev->pers; in level_show()
3919 else if (mddev->clevel[0]) in level_show()
3920 ret = sprintf(page, "%s\n", mddev->clevel); in level_show()
3921 else if (mddev->level != LEVEL_NONE) in level_show()
3922 ret = sprintf(page, "%d\n", mddev->level); in level_show()
3925 spin_unlock(&mddev->lock); in level_show()
3930 level_store(struct mddev *mddev, const char *buf, size_t len) in level_store() argument
3943 rv = mddev_lock(mddev); in level_store()
3947 if (mddev->pers == NULL) { in level_store()
3948 strncpy(mddev->clevel, buf, slen); in level_store()
3949 if (mddev->clevel[slen-1] == '\n') in level_store()
3951 mddev->clevel[slen] = 0; in level_store()
3952 mddev->level = LEVEL_NONE; in level_store()
3957 if (mddev->ro) in level_store()
3967 if (mddev->sync_thread || in level_store()
3968 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in level_store()
3969 mddev->reshape_position != MaxSector || in level_store()
3970 mddev->sysfs_active) in level_store()
3974 if (!mddev->pers->quiesce) { in level_store()
3976 mdname(mddev), mddev->pers->name); in level_store()
4000 if (pers == mddev->pers) { in level_store()
4009 mdname(mddev), clevel); in level_store()
4014 rdev_for_each(rdev, mddev) in level_store()
4020 priv = pers->takeover(mddev); in level_store()
4022 mddev->new_level = mddev->level; in level_store()
4023 mddev->new_layout = mddev->layout; in level_store()
4024 mddev->new_chunk_sectors = mddev->chunk_sectors; in level_store()
4025 mddev->raid_disks -= mddev->delta_disks; in level_store()
4026 mddev->delta_disks = 0; in level_store()
4027 mddev->reshape_backwards = 0; in level_store()
4030 mdname(mddev), clevel); in level_store()
4036 mddev_suspend(mddev); in level_store()
4037 mddev_detach(mddev); in level_store()
4039 spin_lock(&mddev->lock); in level_store()
4040 oldpers = mddev->pers; in level_store()
4041 oldpriv = mddev->private; in level_store()
4042 mddev->pers = pers; in level_store()
4043 mddev->private = priv; in level_store()
4044 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); in level_store()
4045 mddev->level = mddev->new_level; in level_store()
4046 mddev->layout = mddev->new_layout; in level_store()
4047 mddev->chunk_sectors = mddev->new_chunk_sectors; in level_store()
4048 mddev->delta_disks = 0; in level_store()
4049 mddev->reshape_backwards = 0; in level_store()
4050 mddev->degraded = 0; in level_store()
4051 spin_unlock(&mddev->lock); in level_store()
4054 mddev->external) { in level_store()
4062 mddev->in_sync = 0; in level_store()
4063 mddev->safemode_delay = 0; in level_store()
4064 mddev->safemode = 0; in level_store()
4067 oldpers->free(mddev, oldpriv); in level_store()
4072 if (sysfs_create_group(&mddev->kobj, &md_redundancy_group)) in level_store()
4074 mdname(mddev)); in level_store()
4075 mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action"); in level_store()
4076 mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); in level_store()
4077 mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); in level_store()
4082 if (mddev->to_remove == NULL) in level_store()
4083 mddev->to_remove = &md_redundancy_group; in level_store()
4088 rdev_for_each(rdev, mddev) { in level_store()
4091 if (rdev->new_raid_disk >= mddev->raid_disks) in level_store()
4095 sysfs_unlink_rdev(mddev, rdev); in level_store()
4097 rdev_for_each(rdev, mddev) { in level_store()
4106 if (sysfs_link_rdev(mddev, rdev)) in level_store()
4108 rdev->raid_disk, mdname(mddev)); in level_store()
4116 mddev->in_sync = 1; in level_store()
4117 del_timer_sync(&mddev->safemode_timer); in level_store()
4119 blk_set_stacking_limits(&mddev->queue->limits); in level_store()
4120 pers->run(mddev); in level_store()
4121 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in level_store()
4122 mddev_resume(mddev); in level_store()
4123 if (!mddev->thread) in level_store()
4124 md_update_sb(mddev, 1); in level_store()
4125 sysfs_notify_dirent_safe(mddev->sysfs_level); in level_store()
4126 md_new_event(mddev); in level_store()
4129 mddev_unlock(mddev); in level_store()
4137 layout_show(struct mddev *mddev, char *page) in layout_show() argument
4140 if (mddev->reshape_position != MaxSector && in layout_show()
4141 mddev->layout != mddev->new_layout) in layout_show()
4143 mddev->new_layout, mddev->layout); in layout_show()
4144 return sprintf(page, "%d\n", mddev->layout); in layout_show()
4148 layout_store(struct mddev *mddev, const char *buf, size_t len) in layout_store() argument
4156 err = mddev_lock(mddev); in layout_store()
4160 if (mddev->pers) { in layout_store()
4161 if (mddev->pers->check_reshape == NULL) in layout_store()
4163 else if (mddev->ro) in layout_store()
4166 mddev->new_layout = n; in layout_store()
4167 err = mddev->pers->check_reshape(mddev); in layout_store()
4169 mddev->new_layout = mddev->layout; in layout_store()
4172 mddev->new_layout = n; in layout_store()
4173 if (mddev->reshape_position == MaxSector) in layout_store()
4174 mddev->layout = n; in layout_store()
4176 mddev_unlock(mddev); in layout_store()
4183 raid_disks_show(struct mddev *mddev, char *page) in raid_disks_show() argument
4185 if (mddev->raid_disks == 0) in raid_disks_show()
4187 if (mddev->reshape_position != MaxSector && in raid_disks_show()
4188 mddev->delta_disks != 0) in raid_disks_show()
4189 return sprintf(page, "%d (%d)\n", mddev->raid_disks, in raid_disks_show()
4190 mddev->raid_disks - mddev->delta_disks); in raid_disks_show()
4191 return sprintf(page, "%d\n", mddev->raid_disks); in raid_disks_show()
4194 static int update_raid_disks(struct mddev *mddev, int raid_disks);
4197 raid_disks_store(struct mddev *mddev, const char *buf, size_t len) in raid_disks_store() argument
4206 err = mddev_lock(mddev); in raid_disks_store()
4209 if (mddev->pers) in raid_disks_store()
4210 err = update_raid_disks(mddev, n); in raid_disks_store()
4211 else if (mddev->reshape_position != MaxSector) { in raid_disks_store()
4213 int olddisks = mddev->raid_disks - mddev->delta_disks; in raid_disks_store()
4216 rdev_for_each(rdev, mddev) { in raid_disks_store()
4225 mddev->delta_disks = n - olddisks; in raid_disks_store()
4226 mddev->raid_disks = n; in raid_disks_store()
4227 mddev->reshape_backwards = (mddev->delta_disks < 0); in raid_disks_store()
4229 mddev->raid_disks = n; in raid_disks_store()
4231 mddev_unlock(mddev); in raid_disks_store()
4238 uuid_show(struct mddev *mddev, char *page) in uuid_show() argument
4240 return sprintf(page, "%pU\n", mddev->uuid); in uuid_show()
4246 chunk_size_show(struct mddev *mddev, char *page) in chunk_size_show() argument
4248 if (mddev->reshape_position != MaxSector && in chunk_size_show()
4249 mddev->chunk_sectors != mddev->new_chunk_sectors) in chunk_size_show()
4251 mddev->new_chunk_sectors << 9, in chunk_size_show()
4252 mddev->chunk_sectors << 9); in chunk_size_show()
4253 return sprintf(page, "%d\n", mddev->chunk_sectors << 9); in chunk_size_show()
4257 chunk_size_store(struct mddev *mddev, const char *buf, size_t len) in chunk_size_store() argument
4266 err = mddev_lock(mddev); in chunk_size_store()
4269 if (mddev->pers) { in chunk_size_store()
4270 if (mddev->pers->check_reshape == NULL) in chunk_size_store()
4272 else if (mddev->ro) in chunk_size_store()
4275 mddev->new_chunk_sectors = n >> 9; in chunk_size_store()
4276 err = mddev->pers->check_reshape(mddev); in chunk_size_store()
4278 mddev->new_chunk_sectors = mddev->chunk_sectors; in chunk_size_store()
4281 mddev->new_chunk_sectors = n >> 9; in chunk_size_store()
4282 if (mddev->reshape_position == MaxSector) in chunk_size_store()
4283 mddev->chunk_sectors = n >> 9; in chunk_size_store()
4285 mddev_unlock(mddev); in chunk_size_store()
4292 resync_start_show(struct mddev *mddev, char *page) in resync_start_show() argument
4294 if (mddev->recovery_cp == MaxSector) in resync_start_show()
4296 return sprintf(page, "%llu\n", (unsigned long long)mddev->recovery_cp); in resync_start_show()
4300 resync_start_store(struct mddev *mddev, const char *buf, size_t len) in resync_start_store() argument
4315 err = mddev_lock(mddev); in resync_start_store()
4318 if (mddev->pers && !test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) in resync_start_store()
4322 mddev->recovery_cp = n; in resync_start_store()
4323 if (mddev->pers) in resync_start_store()
4324 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in resync_start_store()
4326 mddev_unlock(mddev); in resync_start_store()
4390 array_state_show(struct mddev *mddev, char *page) in array_state_show() argument
4394 if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags)) { in array_state_show()
4395 switch(mddev->ro) { in array_state_show()
4403 spin_lock(&mddev->lock); in array_state_show()
4404 if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) in array_state_show()
4406 else if (mddev->in_sync) in array_state_show()
4408 else if (mddev->safemode) in array_state_show()
4412 spin_unlock(&mddev->lock); in array_state_show()
4415 if (test_bit(MD_BROKEN, &mddev->flags) && st == clean) in array_state_show()
4418 if (list_empty(&mddev->disks) && in array_state_show()
4419 mddev->raid_disks == 0 && in array_state_show()
4420 mddev->dev_sectors == 0) in array_state_show()
4428 static int do_md_stop(struct mddev *mddev, int ro, struct block_device *bdev);
4429 static int md_set_readonly(struct mddev *mddev, struct block_device *bdev);
4430 static int restart_array(struct mddev *mddev);
4433 array_state_store(struct mddev *mddev, const char *buf, size_t len) in array_state_store() argument
4438 if (mddev->pers && (st == active || st == clean) && mddev->ro != 1) { in array_state_store()
4442 spin_lock(&mddev->lock); in array_state_store()
4444 restart_array(mddev); in array_state_store()
4445 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in array_state_store()
4446 md_wakeup_thread(mddev->thread); in array_state_store()
4447 wake_up(&mddev->sb_wait); in array_state_store()
4449 restart_array(mddev); in array_state_store()
4450 if (!set_in_sync(mddev)) in array_state_store()
4454 sysfs_notify_dirent_safe(mddev->sysfs_state); in array_state_store()
4455 spin_unlock(&mddev->lock); in array_state_store()
4458 err = mddev_lock(mddev); in array_state_store()
4467 err = do_md_stop(mddev, 0, NULL); in array_state_store()
4471 if (mddev->pers) in array_state_store()
4472 err = do_md_stop(mddev, 2, NULL); in array_state_store()
4479 if (mddev->pers) in array_state_store()
4480 err = md_set_readonly(mddev, NULL); in array_state_store()
4482 mddev->ro = 1; in array_state_store()
4483 set_disk_ro(mddev->gendisk, 1); in array_state_store()
4484 err = do_md_run(mddev); in array_state_store()
4488 if (mddev->pers) { in array_state_store()
4489 if (mddev->ro == 0) in array_state_store()
4490 err = md_set_readonly(mddev, NULL); in array_state_store()
4491 else if (mddev->ro == 1) in array_state_store()
4492 err = restart_array(mddev); in array_state_store()
4494 mddev->ro = 2; in array_state_store()
4495 set_disk_ro(mddev->gendisk, 0); in array_state_store()
4498 mddev->ro = 2; in array_state_store()
4499 err = do_md_run(mddev); in array_state_store()
4503 if (mddev->pers) { in array_state_store()
4504 err = restart_array(mddev); in array_state_store()
4507 spin_lock(&mddev->lock); in array_state_store()
4508 if (!set_in_sync(mddev)) in array_state_store()
4510 spin_unlock(&mddev->lock); in array_state_store()
4515 if (mddev->pers) { in array_state_store()
4516 err = restart_array(mddev); in array_state_store()
4519 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in array_state_store()
4520 wake_up(&mddev->sb_wait); in array_state_store()
4523 mddev->ro = 0; in array_state_store()
4524 set_disk_ro(mddev->gendisk, 0); in array_state_store()
4525 err = do_md_run(mddev); in array_state_store()
4536 if (mddev->hold_active == UNTIL_IOCTL) in array_state_store()
4537 mddev->hold_active = 0; in array_state_store()
4538 sysfs_notify_dirent_safe(mddev->sysfs_state); in array_state_store()
4540 mddev_unlock(mddev); in array_state_store()
4547 max_corrected_read_errors_show(struct mddev *mddev, char *page) { in max_corrected_read_errors_show() argument
4549 atomic_read(&mddev->max_corr_read_errors)); in max_corrected_read_errors_show()
4553 max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len) in max_corrected_read_errors_store() argument
4561 atomic_set(&mddev->max_corr_read_errors, n); in max_corrected_read_errors_store()
4570 null_show(struct mddev *mddev, char *page) in null_show() argument
4576 static void flush_rdev_wq(struct mddev *mddev) in flush_rdev_wq() argument
4581 rdev_for_each_rcu(rdev, mddev) in flush_rdev_wq()
4590 new_dev_store(struct mddev *mddev, const char *buf, size_t len) in new_dev_store() argument
4616 flush_rdev_wq(mddev); in new_dev_store()
4617 err = mddev_lock(mddev); in new_dev_store()
4620 if (mddev->persistent) { in new_dev_store()
4621 rdev = md_import_device(dev, mddev->major_version, in new_dev_store()
4622 mddev->minor_version); in new_dev_store()
4623 if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) { in new_dev_store()
4625 = list_entry(mddev->disks.next, in new_dev_store()
4627 err = super_types[mddev->major_version] in new_dev_store()
4628 .load_super(rdev, rdev0, mddev->minor_version); in new_dev_store()
4632 } else if (mddev->external) in new_dev_store()
4638 mddev_unlock(mddev); in new_dev_store()
4641 err = bind_rdev_to_array(rdev, mddev); in new_dev_store()
4645 mddev_unlock(mddev); in new_dev_store()
4647 md_new_event(mddev); in new_dev_store()
4655 bitmap_store(struct mddev *mddev, const char *buf, size_t len) in bitmap_store() argument
4661 err = mddev_lock(mddev); in bitmap_store()
4664 if (!mddev->bitmap) in bitmap_store()
4676 md_bitmap_dirty_bits(mddev->bitmap, chunk, end_chunk); in bitmap_store()
4679 md_bitmap_unplug(mddev->bitmap); /* flush the bits to disk */ in bitmap_store()
4681 mddev_unlock(mddev); in bitmap_store()
4689 size_show(struct mddev *mddev, char *page) in size_show() argument
4692 (unsigned long long)mddev->dev_sectors / 2); in size_show()
4695 static int update_size(struct mddev *mddev, sector_t num_sectors);
4698 size_store(struct mddev *mddev, const char *buf, size_t len) in size_store() argument
4709 err = mddev_lock(mddev); in size_store()
4712 if (mddev->pers) { in size_store()
4713 err = update_size(mddev, sectors); in size_store()
4715 md_update_sb(mddev, 1); in size_store()
4717 if (mddev->dev_sectors == 0 || in size_store()
4718 mddev->dev_sectors > sectors) in size_store()
4719 mddev->dev_sectors = sectors; in size_store()
4723 mddev_unlock(mddev); in size_store()
4737 metadata_show(struct mddev *mddev, char *page) in metadata_show() argument
4739 if (mddev->persistent) in metadata_show()
4741 mddev->major_version, mddev->minor_version); in metadata_show()
4742 else if (mddev->external) in metadata_show()
4743 return sprintf(page, "external:%s\n", mddev->metadata_type); in metadata_show()
4749 metadata_store(struct mddev *mddev, const char *buf, size_t len) in metadata_store() argument
4759 err = mddev_lock(mddev); in metadata_store()
4763 if (mddev->external && strncmp(buf, "external:", 9) == 0) in metadata_store()
4765 else if (!list_empty(&mddev->disks)) in metadata_store()
4770 mddev->persistent = 0; in metadata_store()
4771 mddev->external = 0; in metadata_store()
4772 mddev->major_version = 0; in metadata_store()
4773 mddev->minor_version = 90; in metadata_store()
4778 if (namelen >= sizeof(mddev->metadata_type)) in metadata_store()
4779 namelen = sizeof(mddev->metadata_type)-1; in metadata_store()
4780 strncpy(mddev->metadata_type, buf+9, namelen); in metadata_store()
4781 mddev->metadata_type[namelen] = 0; in metadata_store()
4782 if (namelen && mddev->metadata_type[namelen-1] == '\n') in metadata_store()
4783 mddev->metadata_type[--namelen] = 0; in metadata_store()
4784 mddev->persistent = 0; in metadata_store()
4785 mddev->external = 1; in metadata_store()
4786 mddev->major_version = 0; in metadata_store()
4787 mddev->minor_version = 90; in metadata_store()
4801 mddev->major_version = major; in metadata_store()
4802 mddev->minor_version = minor; in metadata_store()
4803 mddev->persistent = 1; in metadata_store()
4804 mddev->external = 0; in metadata_store()
4807 mddev_unlock(mddev); in metadata_store()
4815 action_show(struct mddev *mddev, char *page) in action_show() argument
4818 unsigned long recovery = mddev->recovery; in action_show()
4822 (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &recovery))) { in action_show()
4834 else if (mddev->reshape_position != MaxSector) in action_show()
4841 action_store(struct mddev *mddev, const char *page, size_t len) in action_store() argument
4843 if (!mddev->pers || !mddev->pers->sync_request) in action_store()
4849 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4851 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4852 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in action_store()
4853 mddev_lock(mddev) == 0) { in action_store()
4854 if (work_pending(&mddev->del_work)) in action_store()
4856 if (mddev->sync_thread) { in action_store()
4857 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in action_store()
4858 md_reap_sync_thread(mddev); in action_store()
4860 mddev_unlock(mddev); in action_store()
4862 } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in action_store()
4865 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4867 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4868 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in action_store()
4871 if (mddev->pers->start_reshape == NULL) in action_store()
4873 err = mddev_lock(mddev); in action_store()
4875 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in action_store()
4878 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4879 err = mddev->pers->start_reshape(mddev); in action_store()
4881 mddev_unlock(mddev); in action_store()
4885 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in action_store()
4888 set_bit(MD_RECOVERY_CHECK, &mddev->recovery); in action_store()
4891 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4892 set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in action_store()
4893 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); in action_store()
4895 if (mddev->ro == 2) { in action_store()
4899 mddev->ro = 0; in action_store()
4900 md_wakeup_thread(mddev->sync_thread); in action_store()
4902 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in action_store()
4903 md_wakeup_thread(mddev->thread); in action_store()
4904 sysfs_notify_dirent_safe(mddev->sysfs_action); in action_store()
4912 last_sync_action_show(struct mddev *mddev, char *page) in last_sync_action_show() argument
4914 return sprintf(page, "%s\n", mddev->last_sync_action); in last_sync_action_show()
4920 mismatch_cnt_show(struct mddev *mddev, char *page) in mismatch_cnt_show() argument
4924 atomic64_read(&mddev->resync_mismatches)); in mismatch_cnt_show()
4930 sync_min_show(struct mddev *mddev, char *page) in sync_min_show() argument
4932 return sprintf(page, "%d (%s)\n", speed_min(mddev), in sync_min_show()
4933 mddev->sync_speed_min ? "local": "system"); in sync_min_show()
4937 sync_min_store(struct mddev *mddev, const char *buf, size_t len) in sync_min_store() argument
4951 mddev->sync_speed_min = min; in sync_min_store()
4959 sync_max_show(struct mddev *mddev, char *page) in sync_max_show() argument
4961 return sprintf(page, "%d (%s)\n", speed_max(mddev), in sync_max_show()
4962 mddev->sync_speed_max ? "local": "system"); in sync_max_show()
4966 sync_max_store(struct mddev *mddev, const char *buf, size_t len) in sync_max_store() argument
4980 mddev->sync_speed_max = max; in sync_max_store()
4988 degraded_show(struct mddev *mddev, char *page) in degraded_show() argument
4990 return sprintf(page, "%d\n", mddev->degraded); in degraded_show()
4995 sync_force_parallel_show(struct mddev *mddev, char *page) in sync_force_parallel_show() argument
4997 return sprintf(page, "%d\n", mddev->parallel_resync); in sync_force_parallel_show()
5001 sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len) in sync_force_parallel_store() argument
5011 mddev->parallel_resync = n; in sync_force_parallel_store()
5013 if (mddev->sync_thread) in sync_force_parallel_store()
5025 sync_speed_show(struct mddev *mddev, char *page) in sync_speed_show() argument
5028 if (mddev->curr_resync == 0) in sync_speed_show()
5030 resync = mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active); in sync_speed_show()
5031 dt = (jiffies - mddev->resync_mark) / HZ; in sync_speed_show()
5033 db = resync - mddev->resync_mark_cnt; in sync_speed_show()
5040 sync_completed_show(struct mddev *mddev, char *page) in sync_completed_show() argument
5044 if (!test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in sync_completed_show()
5047 if (mddev->curr_resync == 1 || in sync_completed_show()
5048 mddev->curr_resync == 2) in sync_completed_show()
5051 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in sync_completed_show()
5052 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in sync_completed_show()
5053 max_sectors = mddev->resync_max_sectors; in sync_completed_show()
5055 max_sectors = mddev->dev_sectors; in sync_completed_show()
5057 resync = mddev->curr_resync_completed; in sync_completed_show()
5065 min_sync_show(struct mddev *mddev, char *page) in min_sync_show() argument
5068 (unsigned long long)mddev->resync_min); in min_sync_show()
5071 min_sync_store(struct mddev *mddev, const char *buf, size_t len) in min_sync_store() argument
5079 spin_lock(&mddev->lock); in min_sync_store()
5081 if (min > mddev->resync_max) in min_sync_store()
5085 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in min_sync_store()
5089 mddev->resync_min = round_down(min, 8); in min_sync_store()
5093 spin_unlock(&mddev->lock); in min_sync_store()
5101 max_sync_show(struct mddev *mddev, char *page) in max_sync_show() argument
5103 if (mddev->resync_max == MaxSector) in max_sync_show()
5107 (unsigned long long)mddev->resync_max); in max_sync_show()
5110 max_sync_store(struct mddev *mddev, const char *buf, size_t len) in max_sync_store() argument
5113 spin_lock(&mddev->lock); in max_sync_store()
5115 mddev->resync_max = MaxSector; in max_sync_store()
5123 if (max < mddev->resync_min) in max_sync_store()
5127 if (max < mddev->resync_max && in max_sync_store()
5128 mddev->ro == 0 && in max_sync_store()
5129 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in max_sync_store()
5133 chunk = mddev->chunk_sectors; in max_sync_store()
5141 mddev->resync_max = max; in max_sync_store()
5143 wake_up(&mddev->recovery_wait); in max_sync_store()
5146 spin_unlock(&mddev->lock); in max_sync_store()
5154 suspend_lo_show(struct mddev *mddev, char *page) in suspend_lo_show() argument
5156 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo); in suspend_lo_show()
5160 suspend_lo_store(struct mddev *mddev, const char *buf, size_t len) in suspend_lo_store() argument
5171 err = mddev_lock(mddev); in suspend_lo_store()
5175 if (mddev->pers == NULL || in suspend_lo_store()
5176 mddev->pers->quiesce == NULL) in suspend_lo_store()
5178 mddev_suspend(mddev); in suspend_lo_store()
5179 mddev->suspend_lo = new; in suspend_lo_store()
5180 mddev_resume(mddev); in suspend_lo_store()
5184 mddev_unlock(mddev); in suspend_lo_store()
5191 suspend_hi_show(struct mddev *mddev, char *page) in suspend_hi_show() argument
5193 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi); in suspend_hi_show()
5197 suspend_hi_store(struct mddev *mddev, const char *buf, size_t len) in suspend_hi_store() argument
5208 err = mddev_lock(mddev); in suspend_hi_store()
5212 if (mddev->pers == NULL) in suspend_hi_store()
5215 mddev_suspend(mddev); in suspend_hi_store()
5216 mddev->suspend_hi = new; in suspend_hi_store()
5217 mddev_resume(mddev); in suspend_hi_store()
5221 mddev_unlock(mddev); in suspend_hi_store()
5228 reshape_position_show(struct mddev *mddev, char *page) in reshape_position_show() argument
5230 if (mddev->reshape_position != MaxSector) in reshape_position_show()
5232 (unsigned long long)mddev->reshape_position); in reshape_position_show()
5238 reshape_position_store(struct mddev *mddev, const char *buf, size_t len) in reshape_position_store() argument
5249 err = mddev_lock(mddev); in reshape_position_store()
5253 if (mddev->pers) in reshape_position_store()
5255 mddev->reshape_position = new; in reshape_position_store()
5256 mddev->delta_disks = 0; in reshape_position_store()
5257 mddev->reshape_backwards = 0; in reshape_position_store()
5258 mddev->new_level = mddev->level; in reshape_position_store()
5259 mddev->new_layout = mddev->layout; in reshape_position_store()
5260 mddev->new_chunk_sectors = mddev->chunk_sectors; in reshape_position_store()
5261 rdev_for_each(rdev, mddev) in reshape_position_store()
5265 mddev_unlock(mddev); in reshape_position_store()
5274 reshape_direction_show(struct mddev *mddev, char *page) in reshape_direction_show() argument
5277 mddev->reshape_backwards ? "backwards" : "forwards"); in reshape_direction_show()
5281 reshape_direction_store(struct mddev *mddev, const char *buf, size_t len) in reshape_direction_store() argument
5292 if (mddev->reshape_backwards == backwards) in reshape_direction_store()
5295 err = mddev_lock(mddev); in reshape_direction_store()
5299 if (mddev->delta_disks) in reshape_direction_store()
5301 else if (mddev->persistent && in reshape_direction_store()
5302 mddev->major_version == 0) in reshape_direction_store()
5305 mddev->reshape_backwards = backwards; in reshape_direction_store()
5306 mddev_unlock(mddev); in reshape_direction_store()
5315 array_size_show(struct mddev *mddev, char *page) in array_size_show() argument
5317 if (mddev->external_size) in array_size_show()
5319 (unsigned long long)mddev->array_sectors/2); in array_size_show()
5325 array_size_store(struct mddev *mddev, const char *buf, size_t len) in array_size_store() argument
5330 err = mddev_lock(mddev); in array_size_store()
5335 if (mddev_is_clustered(mddev)) { in array_size_store()
5336 mddev_unlock(mddev); in array_size_store()
5341 if (mddev->pers) in array_size_store()
5342 sectors = mddev->pers->size(mddev, 0, 0); in array_size_store()
5344 sectors = mddev->array_sectors; in array_size_store()
5346 mddev->external_size = 0; in array_size_store()
5350 else if (mddev->pers && mddev->pers->size(mddev, 0, 0) < sectors) in array_size_store()
5353 mddev->external_size = 1; in array_size_store()
5357 mddev->array_sectors = sectors; in array_size_store()
5358 if (mddev->pers) { in array_size_store()
5359 set_capacity(mddev->gendisk, mddev->array_sectors); in array_size_store()
5360 revalidate_disk_size(mddev->gendisk, true); in array_size_store()
5363 mddev_unlock(mddev); in array_size_store()
5372 consistency_policy_show(struct mddev *mddev, char *page) in consistency_policy_show() argument
5376 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) { in consistency_policy_show()
5378 } else if (test_bit(MD_HAS_PPL, &mddev->flags)) { in consistency_policy_show()
5380 } else if (mddev->bitmap) { in consistency_policy_show()
5382 } else if (mddev->pers) { in consistency_policy_show()
5383 if (mddev->pers->sync_request) in consistency_policy_show()
5395 consistency_policy_store(struct mddev *mddev, const char *buf, size_t len) in consistency_policy_store() argument
5399 if (mddev->pers) { in consistency_policy_store()
5400 if (mddev->pers->change_consistency_policy) in consistency_policy_store()
5401 err = mddev->pers->change_consistency_policy(mddev, buf); in consistency_policy_store()
5404 } else if (mddev->external && strncmp(buf, "ppl", 3) == 0) { in consistency_policy_store()
5405 set_bit(MD_HAS_PPL, &mddev->flags); in consistency_policy_store()
5417 static ssize_t fail_last_dev_show(struct mddev *mddev, char *page) in fail_last_dev_show() argument
5419 return sprintf(page, "%d\n", mddev->fail_last_dev); in fail_last_dev_show()
5427 fail_last_dev_store(struct mddev *mddev, const char *buf, size_t len) in fail_last_dev_store() argument
5436 if (value != mddev->fail_last_dev) in fail_last_dev_store()
5437 mddev->fail_last_dev = value; in fail_last_dev_store()
5445 static ssize_t serialize_policy_show(struct mddev *mddev, char *page) in serialize_policy_show() argument
5447 if (mddev->pers == NULL || (mddev->pers->level != 1)) in serialize_policy_show()
5450 return sprintf(page, "%d\n", mddev->serialize_policy); in serialize_policy_show()
5458 serialize_policy_store(struct mddev *mddev, const char *buf, size_t len) in serialize_policy_store() argument
5467 if (value == mddev->serialize_policy) in serialize_policy_store()
5470 err = mddev_lock(mddev); in serialize_policy_store()
5473 if (mddev->pers == NULL || (mddev->pers->level != 1)) { in serialize_policy_store()
5479 mddev_suspend(mddev); in serialize_policy_store()
5481 mddev_create_serial_pool(mddev, NULL, true); in serialize_policy_store()
5483 mddev_destroy_serial_pool(mddev, NULL, true); in serialize_policy_store()
5484 mddev->serialize_policy = value; in serialize_policy_store()
5485 mddev_resume(mddev); in serialize_policy_store()
5487 mddev_unlock(mddev); in serialize_policy_store()
5544 struct mddev *mddev = container_of(kobj, struct mddev, kobj); in md_attr_show() local
5550 if (list_empty(&mddev->all_mddevs)) { in md_attr_show()
5554 mddev_get(mddev); in md_attr_show()
5557 rv = entry->show(mddev, page); in md_attr_show()
5558 mddev_put(mddev); in md_attr_show()
5567 struct mddev *mddev = container_of(kobj, struct mddev, kobj); in md_attr_store() local
5575 if (list_empty(&mddev->all_mddevs)) { in md_attr_store()
5579 mddev_get(mddev); in md_attr_store()
5581 rv = entry->store(mddev, page, length); in md_attr_store()
5582 mddev_put(mddev); in md_attr_store()
5588 struct mddev *mddev = container_of(ko, struct mddev, kobj); in md_free() local
5590 if (mddev->sysfs_state) in md_free()
5591 sysfs_put(mddev->sysfs_state); in md_free()
5592 if (mddev->sysfs_level) in md_free()
5593 sysfs_put(mddev->sysfs_level); in md_free()
5595 if (mddev->gendisk) in md_free()
5596 del_gendisk(mddev->gendisk); in md_free()
5597 if (mddev->queue) in md_free()
5598 blk_cleanup_queue(mddev->queue); in md_free()
5599 if (mddev->gendisk) in md_free()
5600 put_disk(mddev->gendisk); in md_free()
5601 percpu_ref_exit(&mddev->writes_pending); in md_free()
5603 bioset_exit(&mddev->bio_set); in md_free()
5604 bioset_exit(&mddev->sync_set); in md_free()
5605 mempool_exit(&mddev->md_io_pool); in md_free()
5606 kfree(mddev); in md_free()
5623 struct mddev *mddev = container_of(ws, struct mddev, del_work); in mddev_delayed_delete() local
5625 sysfs_remove_group(&mddev->kobj, &md_bitmap_group); in mddev_delayed_delete()
5626 kobject_del(&mddev->kobj); in mddev_delayed_delete()
5627 kobject_put(&mddev->kobj); in mddev_delayed_delete()
5632 int mddev_init_writes_pending(struct mddev *mddev) in mddev_init_writes_pending() argument
5634 if (mddev->writes_pending.percpu_count_ptr) in mddev_init_writes_pending()
5636 if (percpu_ref_init(&mddev->writes_pending, no_op, in mddev_init_writes_pending()
5640 percpu_ref_put(&mddev->writes_pending); in mddev_init_writes_pending()
5657 struct mddev *mddev = mddev_find(dev); in md_alloc() local
5664 if (!mddev) in md_alloc()
5667 partitioned = (MAJOR(mddev->unit) != MD_MAJOR); in md_alloc()
5669 unit = MINOR(mddev->unit) >> shift; in md_alloc()
5678 if (mddev->gendisk) in md_alloc()
5684 struct mddev *mddev2; in md_alloc()
5699 mddev->hold_active = UNTIL_STOP; in md_alloc()
5701 error = mempool_init_kmalloc_pool(&mddev->md_io_pool, BIO_POOL_SIZE, in md_alloc()
5707 mddev->queue = blk_alloc_queue(NUMA_NO_NODE); in md_alloc()
5708 if (!mddev->queue) in md_alloc()
5711 blk_set_stacking_limits(&mddev->queue->limits); in md_alloc()
5715 blk_cleanup_queue(mddev->queue); in md_alloc()
5716 mddev->queue = NULL; in md_alloc()
5719 disk->major = MAJOR(mddev->unit); in md_alloc()
5728 disk->private_data = mddev; in md_alloc()
5729 disk->queue = mddev->queue; in md_alloc()
5730 blk_queue_write_cache(mddev->queue, true, true); in md_alloc()
5737 mddev->gendisk = disk; in md_alloc()
5741 mutex_lock(&mddev->open_mutex); in md_alloc()
5744 error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md"); in md_alloc()
5753 if (mddev->kobj.sd && in md_alloc()
5754 sysfs_create_group(&mddev->kobj, &md_bitmap_group)) in md_alloc()
5756 mutex_unlock(&mddev->open_mutex); in md_alloc()
5759 if (!error && mddev->kobj.sd) { in md_alloc()
5760 kobject_uevent(&mddev->kobj, KOBJ_ADD); in md_alloc()
5761 mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state"); in md_alloc()
5762 mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level"); in md_alloc()
5764 mddev_put(mddev); in md_alloc()
5806 struct mddev *mddev = from_timer(mddev, t, safemode_timer); in md_safemode_timeout() local
5808 mddev->safemode = 1; in md_safemode_timeout()
5809 if (mddev->external) in md_safemode_timeout()
5810 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_safemode_timeout()
5812 md_wakeup_thread(mddev->thread); in md_safemode_timeout()
5817 int md_run(struct mddev *mddev) in md_run() argument
5823 if (list_empty(&mddev->disks)) in md_run()
5827 if (mddev->pers) in md_run()
5830 if (mddev->sysfs_active) in md_run()
5836 if (!mddev->raid_disks) { in md_run()
5837 if (!mddev->persistent) in md_run()
5839 err = analyze_sbs(mddev); in md_run()
5844 if (mddev->level != LEVEL_NONE) in md_run()
5845 request_module("md-level-%d", mddev->level); in md_run()
5846 else if (mddev->clevel[0]) in md_run()
5847 request_module("md-%s", mddev->clevel); in md_run()
5854 mddev->has_superblocks = false; in md_run()
5855 rdev_for_each(rdev, mddev) { in md_run()
5860 if (mddev->ro != 1 && in md_run()
5863 mddev->ro = 1; in md_run()
5864 if (mddev->gendisk) in md_run()
5865 set_disk_ro(mddev->gendisk, 1); in md_run()
5869 mddev->has_superblocks = true; in md_run()
5878 if (mddev->dev_sectors && in md_run()
5879 rdev->data_offset + mddev->dev_sectors in md_run()
5882 mdname(mddev)); in md_run()
5889 mdname(mddev)); in md_run()
5896 if (!bioset_initialized(&mddev->bio_set)) { in md_run()
5897 err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); in md_run()
5901 if (!bioset_initialized(&mddev->sync_set)) { in md_run()
5902 err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); in md_run()
5908 pers = find_pers(mddev->level, mddev->clevel); in md_run()
5911 if (mddev->level != LEVEL_NONE) in md_run()
5913 mddev->level); in md_run()
5916 mddev->clevel); in md_run()
5921 if (mddev->level != pers->level) { in md_run()
5922 mddev->level = pers->level; in md_run()
5923 mddev->new_level = pers->level; in md_run()
5925 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); in md_run()
5927 if (mddev->reshape_position != MaxSector && in md_run()
5943 rdev_for_each(rdev, mddev) in md_run()
5944 rdev_for_each(rdev2, mddev) { in md_run()
5949 mdname(mddev), in md_run()
5960 mddev->recovery = 0; in md_run()
5962 mddev->resync_max_sectors = mddev->dev_sectors; in md_run()
5964 mddev->ok_start_degraded = start_dirty_degraded; in md_run()
5966 if (start_readonly && mddev->ro == 0) in md_run()
5967 mddev->ro = 2; /* read-only, but switch on first write */ in md_run()
5969 err = pers->run(mddev); in md_run()
5972 else if (pers->size(mddev, 0, 0) < mddev->array_sectors) { in md_run()
5973 WARN_ONCE(!mddev->external_size, in md_run()
5977 (unsigned long long)mddev->array_sectors / 2, in md_run()
5978 (unsigned long long)pers->size(mddev, 0, 0) / 2); in md_run()
5982 (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { in md_run()
5985 bitmap = md_bitmap_create(mddev, -1); in md_run()
5989 mdname(mddev), err); in md_run()
5991 mddev->bitmap = bitmap; in md_run()
5997 if (mddev->bitmap_info.max_write_behind > 0) { in md_run()
6000 rdev_for_each(rdev, mddev) { in md_run()
6005 if (create_pool && mddev->serial_info_pool == NULL) { in md_run()
6006 mddev->serial_info_pool = in md_run()
6009 if (!mddev->serial_info_pool) { in md_run()
6016 if (mddev->queue) { in md_run()
6019 rdev_for_each(rdev, mddev) { in md_run()
6026 if (mddev->degraded) in md_run()
6029 blk_queue_flag_set(QUEUE_FLAG_NONROT, mddev->queue); in md_run()
6031 blk_queue_flag_clear(QUEUE_FLAG_NONROT, mddev->queue); in md_run()
6034 if (mddev->kobj.sd && in md_run()
6035 sysfs_create_group(&mddev->kobj, &md_redundancy_group)) in md_run()
6037 mdname(mddev)); in md_run()
6038 mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action"); in md_run()
6039 mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); in md_run()
6040 mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); in md_run()
6041 } else if (mddev->ro == 2) /* auto-readonly not meaningful */ in md_run()
6042 mddev->ro = 0; in md_run()
6044 atomic_set(&mddev->max_corr_read_errors, in md_run()
6046 mddev->safemode = 0; in md_run()
6047 if (mddev_is_clustered(mddev)) in md_run()
6048 mddev->safemode_delay = 0; in md_run()
6050 mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY; in md_run()
6051 mddev->in_sync = 1; in md_run()
6053 spin_lock(&mddev->lock); in md_run()
6054 mddev->pers = pers; in md_run()
6055 spin_unlock(&mddev->lock); in md_run()
6056 rdev_for_each(rdev, mddev) in md_run()
6058 sysfs_link_rdev(mddev, rdev); /* failure here is OK */ in md_run()
6060 if (mddev->degraded && !mddev->ro) in md_run()
6064 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_run()
6065 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_run()
6067 if (mddev->sb_flags) in md_run()
6068 md_update_sb(mddev, 0); in md_run()
6070 md_new_event(mddev); in md_run()
6074 mddev_detach(mddev); in md_run()
6075 if (mddev->private) in md_run()
6076 pers->free(mddev, mddev->private); in md_run()
6077 mddev->private = NULL; in md_run()
6079 md_bitmap_destroy(mddev); in md_run()
6081 bioset_exit(&mddev->bio_set); in md_run()
6082 bioset_exit(&mddev->sync_set); in md_run()
6087 int do_md_run(struct mddev *mddev) in do_md_run() argument
6091 set_bit(MD_NOT_READY, &mddev->flags); in do_md_run()
6092 err = md_run(mddev); in do_md_run()
6095 err = md_bitmap_load(mddev); in do_md_run()
6097 md_bitmap_destroy(mddev); in do_md_run()
6101 if (mddev_is_clustered(mddev)) in do_md_run()
6102 md_allow_write(mddev); in do_md_run()
6105 md_start(mddev); in do_md_run()
6107 md_wakeup_thread(mddev->thread); in do_md_run()
6108 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ in do_md_run()
6110 set_capacity(mddev->gendisk, mddev->array_sectors); in do_md_run()
6111 revalidate_disk_size(mddev->gendisk, true); in do_md_run()
6112 clear_bit(MD_NOT_READY, &mddev->flags); in do_md_run()
6113 mddev->changed = 1; in do_md_run()
6114 kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); in do_md_run()
6115 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_run()
6116 sysfs_notify_dirent_safe(mddev->sysfs_action); in do_md_run()
6117 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in do_md_run()
6119 clear_bit(MD_NOT_READY, &mddev->flags); in do_md_run()
6123 int md_start(struct mddev *mddev) in md_start() argument
6127 if (mddev->pers->start) { in md_start()
6128 set_bit(MD_RECOVERY_WAIT, &mddev->recovery); in md_start()
6129 md_wakeup_thread(mddev->thread); in md_start()
6130 ret = mddev->pers->start(mddev); in md_start()
6131 clear_bit(MD_RECOVERY_WAIT, &mddev->recovery); in md_start()
6132 md_wakeup_thread(mddev->sync_thread); in md_start()
6138 static int restart_array(struct mddev *mddev) in restart_array() argument
6140 struct gendisk *disk = mddev->gendisk; in restart_array()
6146 if (list_empty(&mddev->disks)) in restart_array()
6148 if (!mddev->pers) in restart_array()
6150 if (!mddev->ro) in restart_array()
6154 rdev_for_each_rcu(rdev, mddev) { in restart_array()
6162 if (test_bit(MD_HAS_JOURNAL, &mddev->flags) && !has_journal) in restart_array()
6168 mddev->safemode = 0; in restart_array()
6169 mddev->ro = 0; in restart_array()
6171 pr_debug("md: %s switched to read-write mode.\n", mdname(mddev)); in restart_array()
6173 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in restart_array()
6174 md_wakeup_thread(mddev->thread); in restart_array()
6175 md_wakeup_thread(mddev->sync_thread); in restart_array()
6176 sysfs_notify_dirent_safe(mddev->sysfs_state); in restart_array()
6180 static void md_clean(struct mddev *mddev) in md_clean() argument
6182 mddev->array_sectors = 0; in md_clean()
6183 mddev->external_size = 0; in md_clean()
6184 mddev->dev_sectors = 0; in md_clean()
6185 mddev->raid_disks = 0; in md_clean()
6186 mddev->recovery_cp = 0; in md_clean()
6187 mddev->resync_min = 0; in md_clean()
6188 mddev->resync_max = MaxSector; in md_clean()
6189 mddev->reshape_position = MaxSector; in md_clean()
6190 mddev->external = 0; in md_clean()
6191 mddev->persistent = 0; in md_clean()
6192 mddev->level = LEVEL_NONE; in md_clean()
6193 mddev->clevel[0] = 0; in md_clean()
6194 mddev->flags = 0; in md_clean()
6195 mddev->sb_flags = 0; in md_clean()
6196 mddev->ro = 0; in md_clean()
6197 mddev->metadata_type[0] = 0; in md_clean()
6198 mddev->chunk_sectors = 0; in md_clean()
6199 mddev->ctime = mddev->utime = 0; in md_clean()
6200 mddev->layout = 0; in md_clean()
6201 mddev->max_disks = 0; in md_clean()
6202 mddev->events = 0; in md_clean()
6203 mddev->can_decrease_events = 0; in md_clean()
6204 mddev->delta_disks = 0; in md_clean()
6205 mddev->reshape_backwards = 0; in md_clean()
6206 mddev->new_level = LEVEL_NONE; in md_clean()
6207 mddev->new_layout = 0; in md_clean()
6208 mddev->new_chunk_sectors = 0; in md_clean()
6209 mddev->curr_resync = 0; in md_clean()
6210 atomic64_set(&mddev->resync_mismatches, 0); in md_clean()
6211 mddev->suspend_lo = mddev->suspend_hi = 0; in md_clean()
6212 mddev->sync_speed_min = mddev->sync_speed_max = 0; in md_clean()
6213 mddev->recovery = 0; in md_clean()
6214 mddev->in_sync = 0; in md_clean()
6215 mddev->changed = 0; in md_clean()
6216 mddev->degraded = 0; in md_clean()
6217 mddev->safemode = 0; in md_clean()
6218 mddev->private = NULL; in md_clean()
6219 mddev->cluster_info = NULL; in md_clean()
6220 mddev->bitmap_info.offset = 0; in md_clean()
6221 mddev->bitmap_info.default_offset = 0; in md_clean()
6222 mddev->bitmap_info.default_space = 0; in md_clean()
6223 mddev->bitmap_info.chunksize = 0; in md_clean()
6224 mddev->bitmap_info.daemon_sleep = 0; in md_clean()
6225 mddev->bitmap_info.max_write_behind = 0; in md_clean()
6226 mddev->bitmap_info.nodes = 0; in md_clean()
6229 static void __md_stop_writes(struct mddev *mddev) in __md_stop_writes() argument
6231 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in __md_stop_writes()
6232 if (work_pending(&mddev->del_work)) in __md_stop_writes()
6234 if (mddev->sync_thread) { in __md_stop_writes()
6235 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in __md_stop_writes()
6236 md_reap_sync_thread(mddev); in __md_stop_writes()
6239 del_timer_sync(&mddev->safemode_timer); in __md_stop_writes()
6241 if (mddev->pers && mddev->pers->quiesce) { in __md_stop_writes()
6242 mddev->pers->quiesce(mddev, 1); in __md_stop_writes()
6243 mddev->pers->quiesce(mddev, 0); in __md_stop_writes()
6245 md_bitmap_flush(mddev); in __md_stop_writes()
6247 if (mddev->ro == 0 && in __md_stop_writes()
6248 ((!mddev->in_sync && !mddev_is_clustered(mddev)) || in __md_stop_writes()
6249 mddev->sb_flags)) { in __md_stop_writes()
6251 if (!mddev_is_clustered(mddev)) in __md_stop_writes()
6252 mddev->in_sync = 1; in __md_stop_writes()
6253 md_update_sb(mddev, 1); in __md_stop_writes()
6256 mddev->serialize_policy = 0; in __md_stop_writes()
6257 mddev_destroy_serial_pool(mddev, NULL, true); in __md_stop_writes()
6260 void md_stop_writes(struct mddev *mddev) in md_stop_writes() argument
6262 mddev_lock_nointr(mddev); in md_stop_writes()
6263 __md_stop_writes(mddev); in md_stop_writes()
6264 mddev_unlock(mddev); in md_stop_writes()
6268 static void mddev_detach(struct mddev *mddev) in mddev_detach() argument
6270 md_bitmap_wait_behind_writes(mddev); in mddev_detach()
6271 if (mddev->pers && mddev->pers->quiesce && !mddev->suspended) { in mddev_detach()
6272 mddev->pers->quiesce(mddev, 1); in mddev_detach()
6273 mddev->pers->quiesce(mddev, 0); in mddev_detach()
6275 md_unregister_thread(&mddev->thread); in mddev_detach()
6276 if (mddev->queue) in mddev_detach()
6277 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ in mddev_detach()
6280 static void __md_stop(struct mddev *mddev) in __md_stop() argument
6282 struct md_personality *pers = mddev->pers; in __md_stop()
6283 md_bitmap_destroy(mddev); in __md_stop()
6284 mddev_detach(mddev); in __md_stop()
6286 if (mddev->event_work.func) in __md_stop()
6288 spin_lock(&mddev->lock); in __md_stop()
6289 mddev->pers = NULL; in __md_stop()
6290 spin_unlock(&mddev->lock); in __md_stop()
6291 pers->free(mddev, mddev->private); in __md_stop()
6292 mddev->private = NULL; in __md_stop()
6293 if (pers->sync_request && mddev->to_remove == NULL) in __md_stop()
6294 mddev->to_remove = &md_redundancy_group; in __md_stop()
6296 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in __md_stop()
6299 void md_stop(struct mddev *mddev) in md_stop() argument
6304 __md_stop(mddev); in md_stop()
6305 bioset_exit(&mddev->bio_set); in md_stop()
6306 bioset_exit(&mddev->sync_set); in md_stop()
6311 static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) in md_set_readonly() argument
6316 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { in md_set_readonly()
6318 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
6319 md_wakeup_thread(mddev->thread); in md_set_readonly()
6321 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in md_set_readonly()
6322 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_set_readonly()
6323 if (mddev->sync_thread) in md_set_readonly()
6326 wake_up_process(mddev->sync_thread->tsk); in md_set_readonly()
6328 if (mddev->external && test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) in md_set_readonly()
6330 mddev_unlock(mddev); in md_set_readonly()
6332 &mddev->recovery)); in md_set_readonly()
6333 wait_event(mddev->sb_wait, in md_set_readonly()
6334 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_set_readonly()
6335 mddev_lock_nointr(mddev); in md_set_readonly()
6337 mutex_lock(&mddev->open_mutex); in md_set_readonly()
6338 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || in md_set_readonly()
6339 mddev->sync_thread || in md_set_readonly()
6340 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { in md_set_readonly()
6341 pr_warn("md: %s still in use.\n",mdname(mddev)); in md_set_readonly()
6343 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
6344 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_set_readonly()
6345 md_wakeup_thread(mddev->thread); in md_set_readonly()
6350 if (mddev->pers) { in md_set_readonly()
6351 __md_stop_writes(mddev); in md_set_readonly()
6354 if (mddev->ro==1) in md_set_readonly()
6356 mddev->ro = 1; in md_set_readonly()
6357 set_disk_ro(mddev->gendisk, 1); in md_set_readonly()
6358 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
6359 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_set_readonly()
6360 md_wakeup_thread(mddev->thread); in md_set_readonly()
6361 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_set_readonly()
6365 mutex_unlock(&mddev->open_mutex); in md_set_readonly()
6373 static int do_md_stop(struct mddev *mddev, int mode, in do_md_stop() argument
6376 struct gendisk *disk = mddev->gendisk; in do_md_stop()
6380 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { in do_md_stop()
6382 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in do_md_stop()
6383 md_wakeup_thread(mddev->thread); in do_md_stop()
6385 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in do_md_stop()
6386 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in do_md_stop()
6387 if (mddev->sync_thread) in do_md_stop()
6390 wake_up_process(mddev->sync_thread->tsk); in do_md_stop()
6392 mddev_unlock(mddev); in do_md_stop()
6393 wait_event(resync_wait, (mddev->sync_thread == NULL && in do_md_stop()
6395 &mddev->recovery))); in do_md_stop()
6396 mddev_lock_nointr(mddev); in do_md_stop()
6398 mutex_lock(&mddev->open_mutex); in do_md_stop()
6399 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || in do_md_stop()
6400 mddev->sysfs_active || in do_md_stop()
6401 mddev->sync_thread || in do_md_stop()
6402 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { in do_md_stop()
6403 pr_warn("md: %s still in use.\n",mdname(mddev)); in do_md_stop()
6404 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6406 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in do_md_stop()
6407 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in do_md_stop()
6408 md_wakeup_thread(mddev->thread); in do_md_stop()
6412 if (mddev->pers) { in do_md_stop()
6413 if (mddev->ro) in do_md_stop()
6416 __md_stop_writes(mddev); in do_md_stop()
6417 __md_stop(mddev); in do_md_stop()
6420 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_stop()
6422 rdev_for_each(rdev, mddev) in do_md_stop()
6424 sysfs_unlink_rdev(mddev, rdev); in do_md_stop()
6427 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6428 mddev->changed = 1; in do_md_stop()
6431 if (mddev->ro) in do_md_stop()
6432 mddev->ro = 0; in do_md_stop()
6434 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6439 pr_info("md: %s stopped.\n", mdname(mddev)); in do_md_stop()
6441 if (mddev->bitmap_info.file) { in do_md_stop()
6442 struct file *f = mddev->bitmap_info.file; in do_md_stop()
6443 spin_lock(&mddev->lock); in do_md_stop()
6444 mddev->bitmap_info.file = NULL; in do_md_stop()
6445 spin_unlock(&mddev->lock); in do_md_stop()
6448 mddev->bitmap_info.offset = 0; in do_md_stop()
6450 export_array(mddev); in do_md_stop()
6452 md_clean(mddev); in do_md_stop()
6453 if (mddev->hold_active == UNTIL_STOP) in do_md_stop()
6454 mddev->hold_active = 0; in do_md_stop()
6456 md_new_event(mddev); in do_md_stop()
6457 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_stop()
6462 static void autorun_array(struct mddev *mddev) in autorun_array() argument
6467 if (list_empty(&mddev->disks)) in autorun_array()
6472 rdev_for_each(rdev, mddev) { in autorun_array()
6478 err = do_md_run(mddev); in autorun_array()
6481 do_md_stop(mddev, 0, NULL); in autorun_array()
6500 struct mddev *mddev; in autorun_devices() local
6539 mddev = mddev_find(dev); in autorun_devices()
6540 if (!mddev || !mddev->gendisk) { in autorun_devices()
6541 if (mddev) in autorun_devices()
6542 mddev_put(mddev); in autorun_devices()
6545 if (mddev_lock(mddev)) in autorun_devices()
6546 pr_warn("md: %s locked, cannot run\n", mdname(mddev)); in autorun_devices()
6547 else if (mddev->raid_disks || mddev->major_version in autorun_devices()
6548 || !list_empty(&mddev->disks)) { in autorun_devices()
6550 mdname(mddev), bdevname(rdev0->bdev,b)); in autorun_devices()
6551 mddev_unlock(mddev); in autorun_devices()
6553 pr_debug("md: created %s\n", mdname(mddev)); in autorun_devices()
6554 mddev->persistent = 1; in autorun_devices()
6557 if (bind_rdev_to_array(rdev, mddev)) in autorun_devices()
6560 autorun_array(mddev); in autorun_devices()
6561 mddev_unlock(mddev); in autorun_devices()
6570 mddev_put(mddev); in autorun_devices()
6590 static int get_array_info(struct mddev *mddev, void __user *arg) in get_array_info() argument
6598 rdev_for_each_rcu(rdev, mddev) { in get_array_info()
6615 info.major_version = mddev->major_version; in get_array_info()
6616 info.minor_version = mddev->minor_version; in get_array_info()
6618 info.ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX); in get_array_info()
6619 info.level = mddev->level; in get_array_info()
6620 info.size = mddev->dev_sectors / 2; in get_array_info()
6621 if (info.size != mddev->dev_sectors / 2) /* overflow */ in get_array_info()
6624 info.raid_disks = mddev->raid_disks; in get_array_info()
6625 info.md_minor = mddev->md_minor; in get_array_info()
6626 info.not_persistent= !mddev->persistent; in get_array_info()
6628 info.utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX); in get_array_info()
6630 if (mddev->in_sync) in get_array_info()
6632 if (mddev->bitmap && mddev->bitmap_info.offset) in get_array_info()
6634 if (mddev_is_clustered(mddev)) in get_array_info()
6641 info.layout = mddev->layout; in get_array_info()
6642 info.chunk_size = mddev->chunk_sectors << 9; in get_array_info()
6650 static int get_bitmap_file(struct mddev *mddev, void __user * arg) in get_bitmap_file() argument
6661 spin_lock(&mddev->lock); in get_bitmap_file()
6663 if (mddev->bitmap_info.file) { in get_bitmap_file()
6664 ptr = file_path(mddev->bitmap_info.file, file->pathname, in get_bitmap_file()
6672 spin_unlock(&mddev->lock); in get_bitmap_file()
6682 static int get_disk_info(struct mddev *mddev, void __user * arg) in get_disk_info() argument
6691 rdev = md_find_rdev_nr_rcu(mddev, info.number); in get_disk_info()
6722 int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info) in md_add_new_disk() argument
6728 if (mddev_is_clustered(mddev) && in md_add_new_disk()
6731 mdname(mddev)); in md_add_new_disk()
6738 if (!mddev->raid_disks) { in md_add_new_disk()
6741 rdev = md_import_device(dev, mddev->major_version, mddev->minor_version); in md_add_new_disk()
6747 if (!list_empty(&mddev->disks)) { in md_add_new_disk()
6749 = list_entry(mddev->disks.next, in md_add_new_disk()
6751 err = super_types[mddev->major_version] in md_add_new_disk()
6752 .load_super(rdev, rdev0, mddev->minor_version); in md_add_new_disk()
6761 err = bind_rdev_to_array(rdev, mddev); in md_add_new_disk()
6772 if (mddev->pers) { in md_add_new_disk()
6774 if (!mddev->pers->hot_add_disk) { in md_add_new_disk()
6776 mdname(mddev)); in md_add_new_disk()
6779 if (mddev->persistent) in md_add_new_disk()
6780 rdev = md_import_device(dev, mddev->major_version, in md_add_new_disk()
6781 mddev->minor_version); in md_add_new_disk()
6790 if (!mddev->persistent) { in md_add_new_disk()
6792 info->raid_disk < mddev->raid_disks) { in md_add_new_disk()
6800 super_types[mddev->major_version]. in md_add_new_disk()
6801 validate_super(mddev, rdev); in md_add_new_disk()
6826 rdev_for_each(rdev2, mddev) { in md_add_new_disk()
6832 if (has_journal || mddev->bitmap) { in md_add_new_disk()
6841 if (mddev_is_clustered(mddev)) { in md_add_new_disk()
6846 err = md_cluster_ops->add_new_disk(mddev, rdev); in md_add_new_disk()
6855 err = bind_rdev_to_array(rdev, mddev); in md_add_new_disk()
6860 if (mddev_is_clustered(mddev)) { in md_add_new_disk()
6863 err = md_cluster_ops->new_disk_ack(mddev, in md_add_new_disk()
6870 md_cluster_ops->add_new_disk_cancel(mddev); in md_add_new_disk()
6884 if (mddev->major_version != 0) { in md_add_new_disk()
6885 pr_warn("%s: ADD_NEW_DISK not supported\n", mdname(mddev)); in md_add_new_disk()
6898 if (info->raid_disk < mddev->raid_disks) in md_add_new_disk()
6903 if (rdev->raid_disk < mddev->raid_disks) in md_add_new_disk()
6912 if (!mddev->persistent) { in md_add_new_disk()
6919 err = bind_rdev_to_array(rdev, mddev); in md_add_new_disk()
6929 static int hot_remove_disk(struct mddev *mddev, dev_t dev) in hot_remove_disk() argument
6934 if (!mddev->pers) in hot_remove_disk()
6937 rdev = find_rdev(mddev, dev); in hot_remove_disk()
6945 remove_and_add_spares(mddev, rdev); in hot_remove_disk()
6951 if (mddev_is_clustered(mddev)) in hot_remove_disk()
6952 md_cluster_ops->remove_disk(mddev, rdev); in hot_remove_disk()
6955 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in hot_remove_disk()
6956 if (mddev->thread) in hot_remove_disk()
6957 md_wakeup_thread(mddev->thread); in hot_remove_disk()
6959 md_update_sb(mddev, 1); in hot_remove_disk()
6960 md_new_event(mddev); in hot_remove_disk()
6965 bdevname(rdev->bdev,b), mdname(mddev)); in hot_remove_disk()
6969 static int hot_add_disk(struct mddev *mddev, dev_t dev) in hot_add_disk() argument
6975 if (!mddev->pers) in hot_add_disk()
6978 if (mddev->major_version != 0) { in hot_add_disk()
6980 mdname(mddev)); in hot_add_disk()
6983 if (!mddev->pers->hot_add_disk) { in hot_add_disk()
6985 mdname(mddev)); in hot_add_disk()
6996 if (mddev->persistent) in hot_add_disk()
7005 bdevname(rdev->bdev,b), mdname(mddev)); in hot_add_disk()
7013 err = bind_rdev_to_array(rdev, mddev); in hot_add_disk()
7024 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in hot_add_disk()
7025 if (!mddev->thread) in hot_add_disk()
7026 md_update_sb(mddev, 1); in hot_add_disk()
7031 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in hot_add_disk()
7032 md_wakeup_thread(mddev->thread); in hot_add_disk()
7033 md_new_event(mddev); in hot_add_disk()
7041 static int set_bitmap_file(struct mddev *mddev, int fd) in set_bitmap_file() argument
7045 if (mddev->pers) { in set_bitmap_file()
7046 if (!mddev->pers->quiesce || !mddev->thread) in set_bitmap_file()
7048 if (mddev->recovery || mddev->sync_thread) in set_bitmap_file()
7057 if (mddev->bitmap || mddev->bitmap_info.file) in set_bitmap_file()
7063 mdname(mddev)); in set_bitmap_file()
7070 mdname(mddev)); in set_bitmap_file()
7074 mdname(mddev)); in set_bitmap_file()
7078 mdname(mddev)); in set_bitmap_file()
7085 mddev->bitmap_info.file = f; in set_bitmap_file()
7086 mddev->bitmap_info.offset = 0; /* file overrides offset */ in set_bitmap_file()
7087 } else if (mddev->bitmap == NULL) in set_bitmap_file()
7090 if (mddev->pers) { in set_bitmap_file()
7094 bitmap = md_bitmap_create(mddev, -1); in set_bitmap_file()
7095 mddev_suspend(mddev); in set_bitmap_file()
7097 mddev->bitmap = bitmap; in set_bitmap_file()
7098 err = md_bitmap_load(mddev); in set_bitmap_file()
7102 md_bitmap_destroy(mddev); in set_bitmap_file()
7105 mddev_resume(mddev); in set_bitmap_file()
7107 mddev_suspend(mddev); in set_bitmap_file()
7108 md_bitmap_destroy(mddev); in set_bitmap_file()
7109 mddev_resume(mddev); in set_bitmap_file()
7113 struct file *f = mddev->bitmap_info.file; in set_bitmap_file()
7115 spin_lock(&mddev->lock); in set_bitmap_file()
7116 mddev->bitmap_info.file = NULL; in set_bitmap_file()
7117 spin_unlock(&mddev->lock); in set_bitmap_file()
7138 int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info) in md_set_array_info() argument
7150 mddev->major_version = info->major_version; in md_set_array_info()
7151 mddev->minor_version = info->minor_version; in md_set_array_info()
7152 mddev->patch_version = info->patch_version; in md_set_array_info()
7153 mddev->persistent = !info->not_persistent; in md_set_array_info()
7157 mddev->ctime = ktime_get_real_seconds(); in md_set_array_info()
7160 mddev->major_version = MD_MAJOR_VERSION; in md_set_array_info()
7161 mddev->minor_version = MD_MINOR_VERSION; in md_set_array_info()
7162 mddev->patch_version = MD_PATCHLEVEL_VERSION; in md_set_array_info()
7163 mddev->ctime = ktime_get_real_seconds(); in md_set_array_info()
7165 mddev->level = info->level; in md_set_array_info()
7166 mddev->clevel[0] = 0; in md_set_array_info()
7167 mddev->dev_sectors = 2 * (sector_t)info->size; in md_set_array_info()
7168 mddev->raid_disks = info->raid_disks; in md_set_array_info()
7173 mddev->recovery_cp = MaxSector; in md_set_array_info()
7175 mddev->recovery_cp = 0; in md_set_array_info()
7176 mddev->persistent = ! info->not_persistent; in md_set_array_info()
7177 mddev->external = 0; in md_set_array_info()
7179 mddev->layout = info->layout; in md_set_array_info()
7180 if (mddev->level == 0) in md_set_array_info()
7182 mddev->layout = -1; in md_set_array_info()
7183 mddev->chunk_sectors = info->chunk_size >> 9; in md_set_array_info()
7185 if (mddev->persistent) { in md_set_array_info()
7186 mddev->max_disks = MD_SB_DISKS; in md_set_array_info()
7187 mddev->flags = 0; in md_set_array_info()
7188 mddev->sb_flags = 0; in md_set_array_info()
7190 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_set_array_info()
7192 mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; in md_set_array_info()
7193 mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9); in md_set_array_info()
7194 mddev->bitmap_info.offset = 0; in md_set_array_info()
7196 mddev->reshape_position = MaxSector; in md_set_array_info()
7201 get_random_bytes(mddev->uuid, 16); in md_set_array_info()
7203 mddev->new_level = mddev->level; in md_set_array_info()
7204 mddev->new_chunk_sectors = mddev->chunk_sectors; in md_set_array_info()
7205 mddev->new_layout = mddev->layout; in md_set_array_info()
7206 mddev->delta_disks = 0; in md_set_array_info()
7207 mddev->reshape_backwards = 0; in md_set_array_info()
7212 void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors) in md_set_array_sectors() argument
7214 lockdep_assert_held(&mddev->reconfig_mutex); in md_set_array_sectors()
7216 if (mddev->external_size) in md_set_array_sectors()
7219 mddev->array_sectors = array_sectors; in md_set_array_sectors()
7223 static int update_size(struct mddev *mddev, sector_t num_sectors) in update_size() argument
7228 sector_t old_dev_sectors = mddev->dev_sectors; in update_size()
7230 if (mddev->pers->resize == NULL) in update_size()
7241 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in update_size()
7242 mddev->sync_thread) in update_size()
7244 if (mddev->ro) in update_size()
7247 rdev_for_each(rdev, mddev) { in update_size()
7255 rv = mddev->pers->resize(mddev, num_sectors); in update_size()
7257 if (mddev_is_clustered(mddev)) in update_size()
7258 md_cluster_ops->update_size(mddev, old_dev_sectors); in update_size()
7259 else if (mddev->queue) { in update_size()
7260 set_capacity(mddev->gendisk, mddev->array_sectors); in update_size()
7261 revalidate_disk_size(mddev->gendisk, true); in update_size()
7267 static int update_raid_disks(struct mddev *mddev, int raid_disks) in update_raid_disks() argument
7272 if (mddev->pers->check_reshape == NULL) in update_raid_disks()
7274 if (mddev->ro) in update_raid_disks()
7277 (mddev->max_disks && raid_disks >= mddev->max_disks)) in update_raid_disks()
7279 if (mddev->sync_thread || in update_raid_disks()
7280 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in update_raid_disks()
7281 mddev->reshape_position != MaxSector) in update_raid_disks()
7284 rdev_for_each(rdev, mddev) { in update_raid_disks()
7285 if (mddev->raid_disks < raid_disks && in update_raid_disks()
7288 if (mddev->raid_disks > raid_disks && in update_raid_disks()
7293 mddev->delta_disks = raid_disks - mddev->raid_disks; in update_raid_disks()
7294 if (mddev->delta_disks < 0) in update_raid_disks()
7295 mddev->reshape_backwards = 1; in update_raid_disks()
7296 else if (mddev->delta_disks > 0) in update_raid_disks()
7297 mddev->reshape_backwards = 0; in update_raid_disks()
7299 rv = mddev->pers->check_reshape(mddev); in update_raid_disks()
7301 mddev->delta_disks = 0; in update_raid_disks()
7302 mddev->reshape_backwards = 0; in update_raid_disks()
7315 static int update_array_info(struct mddev *mddev, mdu_array_info_t *info) in update_array_info() argument
7322 if (mddev->bitmap && mddev->bitmap_info.offset) in update_array_info()
7325 if (mddev->major_version != info->major_version || in update_array_info()
7326 mddev->minor_version != info->minor_version || in update_array_info()
7328 mddev->ctime != info->ctime || in update_array_info()
7329 mddev->level != info->level || in update_array_info()
7331 mddev->persistent != !info->not_persistent || in update_array_info()
7332 mddev->chunk_sectors != info->chunk_size >> 9 || in update_array_info()
7338 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) in update_array_info()
7340 if (mddev->raid_disks != info->raid_disks) in update_array_info()
7342 if (mddev->layout != info->layout) in update_array_info()
7351 if (mddev->layout != info->layout) { in update_array_info()
7356 if (mddev->pers->check_reshape == NULL) in update_array_info()
7359 mddev->new_layout = info->layout; in update_array_info()
7360 rv = mddev->pers->check_reshape(mddev); in update_array_info()
7362 mddev->new_layout = mddev->layout; in update_array_info()
7366 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) in update_array_info()
7367 rv = update_size(mddev, (sector_t)info->size * 2); in update_array_info()
7369 if (mddev->raid_disks != info->raid_disks) in update_array_info()
7370 rv = update_raid_disks(mddev, info->raid_disks); in update_array_info()
7373 if (mddev->pers->quiesce == NULL || mddev->thread == NULL) { in update_array_info()
7377 if (mddev->recovery || mddev->sync_thread) { in update_array_info()
7384 if (mddev->bitmap) { in update_array_info()
7388 if (mddev->bitmap_info.default_offset == 0) { in update_array_info()
7392 mddev->bitmap_info.offset = in update_array_info()
7393 mddev->bitmap_info.default_offset; in update_array_info()
7394 mddev->bitmap_info.space = in update_array_info()
7395 mddev->bitmap_info.default_space; in update_array_info()
7396 bitmap = md_bitmap_create(mddev, -1); in update_array_info()
7397 mddev_suspend(mddev); in update_array_info()
7399 mddev->bitmap = bitmap; in update_array_info()
7400 rv = md_bitmap_load(mddev); in update_array_info()
7404 md_bitmap_destroy(mddev); in update_array_info()
7405 mddev_resume(mddev); in update_array_info()
7408 if (!mddev->bitmap) { in update_array_info()
7412 if (mddev->bitmap->storage.file) { in update_array_info()
7416 if (mddev->bitmap_info.nodes) { in update_array_info()
7418 if (md_cluster_ops->lock_all_bitmaps(mddev) <= 0) { in update_array_info()
7421 md_cluster_ops->unlock_all_bitmaps(mddev); in update_array_info()
7425 mddev->bitmap_info.nodes = 0; in update_array_info()
7426 md_cluster_ops->leave(mddev); in update_array_info()
7428 mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY; in update_array_info()
7430 mddev_suspend(mddev); in update_array_info()
7431 md_bitmap_destroy(mddev); in update_array_info()
7432 mddev_resume(mddev); in update_array_info()
7433 mddev->bitmap_info.offset = 0; in update_array_info()
7436 md_update_sb(mddev, 1); in update_array_info()
7442 static int set_disk_faulty(struct mddev *mddev, dev_t dev) in set_disk_faulty() argument
7447 if (mddev->pers == NULL) in set_disk_faulty()
7451 rdev = md_find_rdev_rcu(mddev, dev); in set_disk_faulty()
7455 md_error(mddev, rdev); in set_disk_faulty()
7471 struct mddev *mddev = bdev->bd_disk->private_data; in md_getgeo() local
7475 geo->cylinders = mddev->array_sectors / 8; in md_getgeo()
7509 struct mddev *mddev = NULL; in md_ioctl() local
7541 mddev = bdev->bd_disk->private_data; in md_ioctl()
7543 if (!mddev) { in md_ioctl()
7551 if (!mddev->raid_disks && !mddev->external) in md_ioctl()
7554 err = get_array_info(mddev, argp); in md_ioctl()
7558 if (!mddev->raid_disks && !mddev->external) in md_ioctl()
7561 err = get_disk_info(mddev, argp); in md_ioctl()
7565 err = set_disk_faulty(mddev, new_decode_dev(arg)); in md_ioctl()
7569 err = get_bitmap_file(mddev, argp); in md_ioctl()
7575 flush_rdev_wq(mddev); in md_ioctl()
7579 wait_event_interruptible_timeout(mddev->sb_wait, in md_ioctl()
7581 &mddev->recovery), in md_ioctl()
7587 mutex_lock(&mddev->open_mutex); in md_ioctl()
7588 if (mddev->pers && atomic_read(&mddev->openers) > 1) { in md_ioctl()
7589 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7593 WARN_ON_ONCE(test_bit(MD_CLOSING, &mddev->flags)); in md_ioctl()
7594 set_bit(MD_CLOSING, &mddev->flags); in md_ioctl()
7596 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7599 err = mddev_lock(mddev); in md_ioctl()
7614 if (mddev->pers) { in md_ioctl()
7615 err = update_array_info(mddev, &info); in md_ioctl()
7622 if (!list_empty(&mddev->disks)) { in md_ioctl()
7623 pr_warn("md: array %s already has disks!\n", mdname(mddev)); in md_ioctl()
7627 if (mddev->raid_disks) { in md_ioctl()
7628 pr_warn("md: array %s already initialised!\n", mdname(mddev)); in md_ioctl()
7632 err = md_set_array_info(mddev, &info); in md_ioctl()
7645 if ((!mddev->raid_disks && !mddev->external) in md_ioctl()
7658 err = restart_array(mddev); in md_ioctl()
7662 err = do_md_stop(mddev, 0, bdev); in md_ioctl()
7666 err = md_set_readonly(mddev, bdev); in md_ioctl()
7670 err = hot_remove_disk(mddev, new_decode_dev(arg)); in md_ioctl()
7678 if (mddev->pers) { in md_ioctl()
7686 err = md_add_new_disk(mddev, &info); in md_ioctl()
7705 if (mddev->ro != 1) in md_ioctl()
7711 if (mddev->pers) { in md_ioctl()
7712 err = restart_array(mddev); in md_ioctl()
7714 mddev->ro = 2; in md_ioctl()
7715 set_disk_ro(mddev->gendisk, 0); in md_ioctl()
7725 if (mddev->ro && mddev->pers) { in md_ioctl()
7726 if (mddev->ro == 2) { in md_ioctl()
7727 mddev->ro = 0; in md_ioctl()
7728 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_ioctl()
7729 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_ioctl()
7734 if (test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) { in md_ioctl()
7735 mddev_unlock(mddev); in md_ioctl()
7736 wait_event(mddev->sb_wait, in md_ioctl()
7737 !test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags) && in md_ioctl()
7738 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_ioctl()
7739 mddev_lock_nointr(mddev); in md_ioctl()
7754 err = md_add_new_disk(mddev, &info); in md_ioctl()
7759 if (mddev_is_clustered(mddev)) in md_ioctl()
7760 md_cluster_ops->new_disk_ack(mddev, false); in md_ioctl()
7766 err = hot_add_disk(mddev, new_decode_dev(arg)); in md_ioctl()
7770 err = do_md_run(mddev); in md_ioctl()
7774 err = set_bitmap_file(mddev, (int)arg); in md_ioctl()
7783 if (mddev->hold_active == UNTIL_IOCTL && in md_ioctl()
7785 mddev->hold_active = 0; in md_ioctl()
7786 mddev_unlock(mddev); in md_ioctl()
7789 clear_bit(MD_CLOSING, &mddev->flags); in md_ioctl()
7818 struct mddev *mddev = mddev_find(bdev->bd_dev); in md_open() local
7821 if (!mddev) in md_open()
7824 if (mddev->gendisk != bdev->bd_disk) { in md_open()
7828 mddev_put(mddev); in md_open()
7830 if (work_pending(&mddev->del_work)) in md_open()
7835 BUG_ON(mddev != bdev->bd_disk->private_data); in md_open()
7837 if ((err = mutex_lock_interruptible(&mddev->open_mutex))) in md_open()
7840 if (test_bit(MD_CLOSING, &mddev->flags)) { in md_open()
7841 mutex_unlock(&mddev->open_mutex); in md_open()
7847 atomic_inc(&mddev->openers); in md_open()
7848 mutex_unlock(&mddev->open_mutex); in md_open()
7853 mddev_put(mddev); in md_open()
7859 struct mddev *mddev = disk->private_data; in md_release() local
7861 BUG_ON(!mddev); in md_release()
7862 atomic_dec(&mddev->openers); in md_release()
7863 mddev_put(mddev); in md_release()
7868 struct mddev *mddev = disk->private_data; in md_check_events() local
7871 if (mddev->changed) in md_check_events()
7873 mddev->changed = 0; in md_check_events()
7945 struct mddev *mddev, const char *name) in md_register_thread() argument
7956 thread->mddev = mddev; in md_register_thread()
7960 mdname(thread->mddev), in md_register_thread()
7988 void md_error(struct mddev *mddev, struct md_rdev *rdev) in md_error() argument
7993 if (!mddev->pers || !mddev->pers->error_handler) in md_error()
7995 mddev->pers->error_handler(mddev,rdev); in md_error()
7996 if (mddev->degraded) in md_error()
7997 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_error()
7999 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_error()
8000 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_error()
8001 md_wakeup_thread(mddev->thread); in md_error()
8002 if (mddev->event_work.func) in md_error()
8003 queue_work(md_misc_wq, &mddev->event_work); in md_error()
8004 md_new_event(mddev); in md_error()
8029 static int status_resync(struct seq_file *seq, struct mddev *mddev) in status_resync() argument
8037 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in status_resync()
8038 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in status_resync()
8039 max_sectors = mddev->resync_max_sectors; in status_resync()
8041 max_sectors = mddev->dev_sectors; in status_resync()
8043 resync = mddev->curr_resync; in status_resync()
8045 if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) in status_resync()
8051 resync -= atomic_read(&mddev->recovery_active); in status_resync()
8054 if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery)) { in status_resync()
8057 rdev_for_each(rdev, mddev) in status_resync()
8065 if (mddev->reshape_position != MaxSector) in status_resync()
8071 if (mddev->recovery_cp < MaxSector) { in status_resync()
8108 (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)? in status_resync()
8110 (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)? in status_resync()
8112 (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ? in status_resync()
8135 dt = ((jiffies - mddev->resync_mark) / HZ); in status_resync()
8138 curr_mark_cnt = mddev->curr_mark_cnt; in status_resync()
8139 recovery_active = atomic_read(&mddev->recovery_active); in status_resync()
8140 resync_mark_cnt = mddev->resync_mark_cnt; in status_resync()
8161 struct mddev *mddev; in md_seq_start() local
8172 mddev = list_entry(tmp, struct mddev, all_mddevs); in md_seq_start()
8173 mddev_get(mddev); in md_seq_start()
8175 return mddev; in md_seq_start()
8186 struct mddev *next_mddev, *mddev = v; in md_seq_next() local
8196 tmp = mddev->all_mddevs.next; in md_seq_next()
8198 next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs)); in md_seq_next()
8206 mddev_put(mddev); in md_seq_next()
8213 struct mddev *mddev = v; in md_seq_stop() local
8215 if (mddev && v != (void*)1 && v != (void*)2) in md_seq_stop()
8216 mddev_put(mddev); in md_seq_stop()
8221 struct mddev *mddev = v; in md_seq_show() local
8242 spin_lock(&mddev->lock); in md_seq_show()
8243 if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) { in md_seq_show()
8244 seq_printf(seq, "%s : %sactive", mdname(mddev), in md_seq_show()
8245 mddev->pers ? "" : "in"); in md_seq_show()
8246 if (mddev->pers) { in md_seq_show()
8247 if (mddev->ro==1) in md_seq_show()
8249 if (mddev->ro==2) in md_seq_show()
8251 seq_printf(seq, " %s", mddev->pers->name); in md_seq_show()
8256 rdev_for_each_rcu(rdev, mddev) { in md_seq_show()
8276 if (!list_empty(&mddev->disks)) { in md_seq_show()
8277 if (mddev->pers) in md_seq_show()
8280 mddev->array_sectors / 2); in md_seq_show()
8285 if (mddev->persistent) { in md_seq_show()
8286 if (mddev->major_version != 0 || in md_seq_show()
8287 mddev->minor_version != 90) { in md_seq_show()
8289 mddev->major_version, in md_seq_show()
8290 mddev->minor_version); in md_seq_show()
8292 } else if (mddev->external) in md_seq_show()
8294 mddev->metadata_type); in md_seq_show()
8298 if (mddev->pers) { in md_seq_show()
8299 mddev->pers->status(seq, mddev); in md_seq_show()
8301 if (mddev->pers->sync_request) { in md_seq_show()
8302 if (status_resync(seq, mddev)) in md_seq_show()
8308 md_bitmap_status(seq, mddev->bitmap); in md_seq_show()
8312 spin_unlock(&mddev->lock); in md_seq_show()
8410 int md_setup_cluster(struct mddev *mddev, int nodes) in md_setup_cluster() argument
8424 ret = md_cluster_ops->join(mddev, nodes); in md_setup_cluster()
8426 mddev->safemode_delay = 0; in md_setup_cluster()
8430 void md_cluster_stop(struct mddev *mddev) in md_cluster_stop() argument
8434 md_cluster_ops->leave(mddev); in md_cluster_stop()
8438 static int is_mddev_idle(struct mddev *mddev, int init) in is_mddev_idle() argument
8446 rdev_for_each_rcu(rdev, mddev) { in is_mddev_idle()
8481 void md_done_sync(struct mddev *mddev, int blocks, int ok) in md_done_sync() argument
8484 atomic_sub(blocks, &mddev->recovery_active); in md_done_sync()
8485 wake_up(&mddev->recovery_wait); in md_done_sync()
8487 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_done_sync()
8488 set_bit(MD_RECOVERY_ERROR, &mddev->recovery); in md_done_sync()
8489 md_wakeup_thread(mddev->thread); in md_done_sync()
8502 bool md_write_start(struct mddev *mddev, struct bio *bi) in md_write_start() argument
8509 BUG_ON(mddev->ro == 1); in md_write_start()
8510 if (mddev->ro == 2) { in md_write_start()
8512 mddev->ro = 0; in md_write_start()
8513 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_write_start()
8514 md_wakeup_thread(mddev->thread); in md_write_start()
8515 md_wakeup_thread(mddev->sync_thread); in md_write_start()
8519 percpu_ref_get(&mddev->writes_pending); in md_write_start()
8521 if (mddev->safemode == 1) in md_write_start()
8522 mddev->safemode = 0; in md_write_start()
8524 if (mddev->in_sync || mddev->sync_checkers) { in md_write_start()
8525 spin_lock(&mddev->lock); in md_write_start()
8526 if (mddev->in_sync) { in md_write_start()
8527 mddev->in_sync = 0; in md_write_start()
8528 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_write_start()
8529 set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_write_start()
8530 md_wakeup_thread(mddev->thread); in md_write_start()
8533 spin_unlock(&mddev->lock); in md_write_start()
8537 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_write_start()
8538 if (!mddev->has_superblocks) in md_write_start()
8540 wait_event(mddev->sb_wait, in md_write_start()
8541 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags) || in md_write_start()
8542 mddev->suspended); in md_write_start()
8543 if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in md_write_start()
8544 percpu_ref_put(&mddev->writes_pending); in md_write_start()
8559 void md_write_inc(struct mddev *mddev, struct bio *bi) in md_write_inc() argument
8563 WARN_ON_ONCE(mddev->in_sync || mddev->ro); in md_write_inc()
8564 percpu_ref_get(&mddev->writes_pending); in md_write_inc()
8568 void md_write_end(struct mddev *mddev) in md_write_end() argument
8570 percpu_ref_put(&mddev->writes_pending); in md_write_end()
8572 if (mddev->safemode == 2) in md_write_end()
8573 md_wakeup_thread(mddev->thread); in md_write_end()
8574 else if (mddev->safemode_delay) in md_write_end()
8578 mod_timer(&mddev->safemode_timer, in md_write_end()
8579 roundup(jiffies, mddev->safemode_delay) + in md_write_end()
8580 mddev->safemode_delay); in md_write_end()
8591 void md_allow_write(struct mddev *mddev) in md_allow_write() argument
8593 if (!mddev->pers) in md_allow_write()
8595 if (mddev->ro) in md_allow_write()
8597 if (!mddev->pers->sync_request) in md_allow_write()
8600 spin_lock(&mddev->lock); in md_allow_write()
8601 if (mddev->in_sync) { in md_allow_write()
8602 mddev->in_sync = 0; in md_allow_write()
8603 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_allow_write()
8604 set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_allow_write()
8605 if (mddev->safemode_delay && in md_allow_write()
8606 mddev->safemode == 0) in md_allow_write()
8607 mddev->safemode = 1; in md_allow_write()
8608 spin_unlock(&mddev->lock); in md_allow_write()
8609 md_update_sb(mddev, 0); in md_allow_write()
8610 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_allow_write()
8612 wait_event(mddev->sb_wait, in md_allow_write()
8613 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_allow_write()
8615 spin_unlock(&mddev->lock); in md_allow_write()
8624 struct mddev *mddev = thread->mddev; in md_do_sync() local
8625 struct mddev *mddev2; in md_do_sync()
8641 if (test_bit(MD_RECOVERY_DONE, &mddev->recovery) || in md_do_sync()
8642 test_bit(MD_RECOVERY_WAIT, &mddev->recovery)) in md_do_sync()
8644 if (mddev->ro) {/* never try to sync a read-only array */ in md_do_sync()
8645 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_do_sync()
8649 if (mddev_is_clustered(mddev)) { in md_do_sync()
8650 ret = md_cluster_ops->resync_start(mddev); in md_do_sync()
8654 set_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags); in md_do_sync()
8655 if (!(test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in md_do_sync()
8656 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) || in md_do_sync()
8657 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) in md_do_sync()
8658 && ((unsigned long long)mddev->curr_resync_completed in md_do_sync()
8659 < (unsigned long long)mddev->resync_max_sectors)) in md_do_sync()
8663 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8664 if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) { in md_do_sync()
8667 } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { in md_do_sync()
8672 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in md_do_sync()
8677 mddev->last_sync_action = action ?: desc; in md_do_sync()
8697 mddev->curr_resync = 2; in md_do_sync()
8700 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8703 if (mddev2 == mddev) in md_do_sync()
8705 if (!mddev->parallel_resync in md_do_sync()
8707 && match_mddev_units(mddev, mddev2)) { in md_do_sync()
8709 if (mddev < mddev2 && mddev->curr_resync == 2) { in md_do_sync()
8711 mddev->curr_resync = 1; in md_do_sync()
8714 if (mddev > mddev2 && mddev->curr_resync == 1) in md_do_sync()
8724 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8725 mddev2->curr_resync >= mddev->curr_resync) { in md_do_sync()
8729 desc, mdname(mddev), in md_do_sync()
8742 } while (mddev->curr_resync < 2); in md_do_sync()
8745 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8749 max_sectors = mddev->resync_max_sectors; in md_do_sync()
8750 atomic64_set(&mddev->resync_mismatches, 0); in md_do_sync()
8752 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
8753 j = mddev->resync_min; in md_do_sync()
8754 else if (!mddev->bitmap) in md_do_sync()
8755 j = mddev->recovery_cp; in md_do_sync()
8757 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) { in md_do_sync()
8758 max_sectors = mddev->resync_max_sectors; in md_do_sync()
8764 if (mddev_is_clustered(mddev) && in md_do_sync()
8765 mddev->reshape_position != MaxSector) in md_do_sync()
8766 j = mddev->reshape_position; in md_do_sync()
8769 max_sectors = mddev->dev_sectors; in md_do_sync()
8772 rdev_for_each_rcu(rdev, mddev) in md_do_sync()
8789 if (mddev->bitmap) { in md_do_sync()
8790 mddev->pers->quiesce(mddev, 1); in md_do_sync()
8791 mddev->pers->quiesce(mddev, 0); in md_do_sync()
8795 pr_info("md: %s of RAID array %s\n", desc, mdname(mddev)); in md_do_sync()
8796 pr_debug("md: minimum _guaranteed_ speed: %d KB/sec/disk.\n", speed_min(mddev)); in md_do_sync()
8798 speed_max(mddev), desc); in md_do_sync()
8800 is_mddev_idle(mddev, 1); /* this initializes IO event counters */ in md_do_sync()
8808 mddev->resync_mark = mark[last_mark]; in md_do_sync()
8809 mddev->resync_mark_cnt = mark_cnt[last_mark]; in md_do_sync()
8818 atomic_set(&mddev->recovery_active, 0); in md_do_sync()
8823 desc, mdname(mddev)); in md_do_sync()
8824 mddev->curr_resync = j; in md_do_sync()
8826 mddev->curr_resync = 3; /* no longer delayed */ in md_do_sync()
8827 mddev->curr_resync_completed = j; in md_do_sync()
8828 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_do_sync()
8829 md_new_event(mddev); in md_do_sync()
8838 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8839 ((mddev->curr_resync > mddev->curr_resync_completed && in md_do_sync()
8840 (mddev->curr_resync - mddev->curr_resync_completed) in md_do_sync()
8843 (j - mddev->curr_resync_completed)*2 in md_do_sync()
8844 >= mddev->resync_max - mddev->curr_resync_completed || in md_do_sync()
8845 mddev->curr_resync_completed > mddev->resync_max in md_do_sync()
8848 wait_event(mddev->recovery_wait, in md_do_sync()
8849 atomic_read(&mddev->recovery_active) == 0); in md_do_sync()
8850 mddev->curr_resync_completed = j; in md_do_sync()
8851 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && in md_do_sync()
8852 j > mddev->recovery_cp) in md_do_sync()
8853 mddev->recovery_cp = j; in md_do_sync()
8855 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_do_sync()
8856 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_do_sync()
8859 while (j >= mddev->resync_max && in md_do_sync()
8860 !test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
8866 wait_event_interruptible(mddev->recovery_wait, in md_do_sync()
8867 mddev->resync_max > j in md_do_sync()
8869 &mddev->recovery)); in md_do_sync()
8872 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8875 sectors = mddev->pers->sync_request(mddev, j, &skipped); in md_do_sync()
8877 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_do_sync()
8883 atomic_add(sectors, &mddev->recovery_active); in md_do_sync()
8886 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8894 mddev->curr_resync = j; in md_do_sync()
8895 mddev->curr_mark_cnt = io_sectors; in md_do_sync()
8900 md_new_event(mddev); in md_do_sync()
8911 mddev->resync_mark = mark[next]; in md_do_sync()
8912 mddev->resync_mark_cnt = mark_cnt[next]; in md_do_sync()
8914 mark_cnt[next] = io_sectors - atomic_read(&mddev->recovery_active); in md_do_sync()
8918 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8931 recovery_done = io_sectors - atomic_read(&mddev->recovery_active); in md_do_sync()
8932 currspeed = ((unsigned long)(recovery_done - mddev->resync_mark_cnt))/2 in md_do_sync()
8933 /((jiffies-mddev->resync_mark)/HZ +1) +1; in md_do_sync()
8935 if (currspeed > speed_min(mddev)) { in md_do_sync()
8936 if (currspeed > speed_max(mddev)) { in md_do_sync()
8940 if (!is_mddev_idle(mddev, 0)) { in md_do_sync()
8945 wait_event(mddev->recovery_wait, in md_do_sync()
8946 !atomic_read(&mddev->recovery_active)); in md_do_sync()
8950 pr_info("md: %s: %s %s.\n",mdname(mddev), desc, in md_do_sync()
8951 test_bit(MD_RECOVERY_INTR, &mddev->recovery) in md_do_sync()
8957 wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); in md_do_sync()
8959 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8960 !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8961 mddev->curr_resync > 3) { in md_do_sync()
8962 mddev->curr_resync_completed = mddev->curr_resync; in md_do_sync()
8963 sysfs_notify_dirent_safe(mddev->sysfs_completed); in md_do_sync()
8965 mddev->pers->sync_request(mddev, max_sectors, &skipped); in md_do_sync()
8967 if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) && in md_do_sync()
8968 mddev->curr_resync > 3) { in md_do_sync()
8969 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8970 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
8971 if (mddev->curr_resync >= mddev->recovery_cp) { in md_do_sync()
8973 desc, mdname(mddev)); in md_do_sync()
8975 &mddev->recovery)) in md_do_sync()
8976 mddev->recovery_cp = in md_do_sync()
8977 mddev->curr_resync_completed; in md_do_sync()
8979 mddev->recovery_cp = in md_do_sync()
8980 mddev->curr_resync; in md_do_sync()
8983 mddev->recovery_cp = MaxSector; in md_do_sync()
8985 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8986 mddev->curr_resync = MaxSector; in md_do_sync()
8987 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8988 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) { in md_do_sync()
8990 rdev_for_each_rcu(rdev, mddev) in md_do_sync()
8992 mddev->delta_disks >= 0 && in md_do_sync()
8996 rdev->recovery_offset < mddev->curr_resync) in md_do_sync()
8997 rdev->recovery_offset = mddev->curr_resync; in md_do_sync()
9006 set_mask_bits(&mddev->sb_flags, 0, in md_do_sync()
9009 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
9010 !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
9011 mddev->delta_disks > 0 && in md_do_sync()
9012 mddev->pers->finish_reshape && in md_do_sync()
9013 mddev->pers->size && in md_do_sync()
9014 mddev->queue) { in md_do_sync()
9015 mddev_lock_nointr(mddev); in md_do_sync()
9016 md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0)); in md_do_sync()
9017 mddev_unlock(mddev); in md_do_sync()
9018 if (!mddev_is_clustered(mddev)) { in md_do_sync()
9019 set_capacity(mddev->gendisk, mddev->array_sectors); in md_do_sync()
9020 revalidate_disk_size(mddev->gendisk, true); in md_do_sync()
9024 spin_lock(&mddev->lock); in md_do_sync()
9025 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
9027 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
9028 mddev->resync_min = 0; in md_do_sync()
9029 mddev->resync_max = MaxSector; in md_do_sync()
9030 } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
9031 mddev->resync_min = mddev->curr_resync_completed; in md_do_sync()
9032 set_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_do_sync()
9033 mddev->curr_resync = 0; in md_do_sync()
9034 spin_unlock(&mddev->lock); in md_do_sync()
9037 md_wakeup_thread(mddev->thread); in md_do_sync()
9042 static int remove_and_add_spares(struct mddev *mddev, in remove_and_add_spares() argument
9050 if (this && test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in remove_and_add_spares()
9054 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
9072 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
9080 if (mddev->pers->hot_remove_disk( in remove_and_add_spares()
9081 mddev, rdev) == 0) { in remove_and_add_spares()
9082 sysfs_unlink_rdev(mddev, rdev); in remove_and_add_spares()
9092 if (removed && mddev->kobj.sd) in remove_and_add_spares()
9093 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in remove_and_add_spares()
9098 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
9113 if (mddev->ro && in remove_and_add_spares()
9120 if (mddev->pers->hot_add_disk(mddev, rdev) == 0) { in remove_and_add_spares()
9122 sysfs_link_rdev(mddev, rdev); in remove_and_add_spares()
9125 md_new_event(mddev); in remove_and_add_spares()
9126 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in remove_and_add_spares()
9131 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in remove_and_add_spares()
9137 struct mddev *mddev = container_of(ws, struct mddev, del_work); in md_start_sync() local
9139 mddev->sync_thread = md_register_thread(md_do_sync, in md_start_sync()
9140 mddev, in md_start_sync()
9142 if (!mddev->sync_thread) { in md_start_sync()
9144 mdname(mddev)); in md_start_sync()
9146 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_start_sync()
9147 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_start_sync()
9148 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_start_sync()
9149 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_start_sync()
9150 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_start_sync()
9153 &mddev->recovery)) in md_start_sync()
9154 if (mddev->sysfs_action) in md_start_sync()
9155 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_start_sync()
9157 md_wakeup_thread(mddev->sync_thread); in md_start_sync()
9158 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_start_sync()
9159 md_new_event(mddev); in md_start_sync()
9184 void md_check_recovery(struct mddev *mddev) in md_check_recovery() argument
9186 if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags) && mddev->sb_flags) { in md_check_recovery()
9190 set_bit(MD_UPDATING_SB, &mddev->flags); in md_check_recovery()
9192 if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags)) in md_check_recovery()
9193 md_update_sb(mddev, 0); in md_check_recovery()
9194 clear_bit_unlock(MD_UPDATING_SB, &mddev->flags); in md_check_recovery()
9195 wake_up(&mddev->sb_wait); in md_check_recovery()
9198 if (mddev->suspended) in md_check_recovery()
9201 if (mddev->bitmap) in md_check_recovery()
9202 md_bitmap_daemon_work(mddev); in md_check_recovery()
9205 if (mddev->pers->sync_request && !mddev->external) { in md_check_recovery()
9207 mdname(mddev)); in md_check_recovery()
9208 mddev->safemode = 2; in md_check_recovery()
9213 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) in md_check_recovery()
9216 (mddev->sb_flags & ~ (1<<MD_SB_CHANGE_PENDING)) || in md_check_recovery()
9217 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || in md_check_recovery()
9218 test_bit(MD_RECOVERY_DONE, &mddev->recovery) || in md_check_recovery()
9219 (mddev->external == 0 && mddev->safemode == 1) || in md_check_recovery()
9220 (mddev->safemode == 2 in md_check_recovery()
9221 && !mddev->in_sync && mddev->recovery_cp == MaxSector) in md_check_recovery()
9225 if (mddev_trylock(mddev)) { in md_check_recovery()
9227 bool try_set_sync = mddev->safemode != 0; in md_check_recovery()
9229 if (!mddev->external && mddev->safemode == 1) in md_check_recovery()
9230 mddev->safemode = 0; in md_check_recovery()
9232 if (mddev->ro) { in md_check_recovery()
9234 if (!mddev->external && mddev->in_sync) in md_check_recovery()
9240 rdev_for_each(rdev, mddev) in md_check_recovery()
9249 remove_and_add_spares(mddev, NULL); in md_check_recovery()
9253 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_check_recovery()
9254 md_reap_sync_thread(mddev); in md_check_recovery()
9255 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9256 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_check_recovery()
9257 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_check_recovery()
9261 if (mddev_is_clustered(mddev)) { in md_check_recovery()
9266 rdev_for_each(rdev, mddev) { in md_check_recovery()
9273 if (try_set_sync && !mddev->external && !mddev->in_sync) { in md_check_recovery()
9274 spin_lock(&mddev->lock); in md_check_recovery()
9275 set_in_sync(mddev); in md_check_recovery()
9276 spin_unlock(&mddev->lock); in md_check_recovery()
9279 if (mddev->sb_flags) in md_check_recovery()
9280 md_update_sb(mddev, 0); in md_check_recovery()
9282 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in md_check_recovery()
9283 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) { in md_check_recovery()
9285 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_check_recovery()
9288 if (mddev->sync_thread) { in md_check_recovery()
9289 md_reap_sync_thread(mddev); in md_check_recovery()
9295 mddev->curr_resync_completed = 0; in md_check_recovery()
9296 spin_lock(&mddev->lock); in md_check_recovery()
9297 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_check_recovery()
9298 spin_unlock(&mddev->lock); in md_check_recovery()
9302 clear_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_check_recovery()
9303 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_check_recovery()
9305 if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || in md_check_recovery()
9306 test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) in md_check_recovery()
9315 if (mddev->reshape_position != MaxSector) { in md_check_recovery()
9316 if (mddev->pers->check_reshape == NULL || in md_check_recovery()
9317 mddev->pers->check_reshape(mddev) != 0) in md_check_recovery()
9320 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_check_recovery()
9321 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9322 } else if ((spares = remove_and_add_spares(mddev, NULL))) { in md_check_recovery()
9323 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_check_recovery()
9324 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_check_recovery()
9325 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_check_recovery()
9326 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9327 } else if (mddev->recovery_cp < MaxSector) { in md_check_recovery()
9328 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_check_recovery()
9329 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
9330 } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) in md_check_recovery()
9334 if (mddev->pers->sync_request) { in md_check_recovery()
9340 md_bitmap_write_all(mddev->bitmap); in md_check_recovery()
9342 INIT_WORK(&mddev->del_work, md_start_sync); in md_check_recovery()
9343 queue_work(md_misc_wq, &mddev->del_work); in md_check_recovery()
9347 if (!mddev->sync_thread) { in md_check_recovery()
9348 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_check_recovery()
9351 &mddev->recovery)) in md_check_recovery()
9352 if (mddev->sysfs_action) in md_check_recovery()
9353 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_check_recovery()
9356 wake_up(&mddev->sb_wait); in md_check_recovery()
9357 mddev_unlock(mddev); in md_check_recovery()
9362 void md_reap_sync_thread(struct mddev *mddev) in md_reap_sync_thread() argument
9365 sector_t old_dev_sectors = mddev->dev_sectors; in md_reap_sync_thread()
9369 md_unregister_thread(&mddev->sync_thread); in md_reap_sync_thread()
9370 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_reap_sync_thread()
9371 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && in md_reap_sync_thread()
9372 mddev->degraded != mddev->raid_disks) { in md_reap_sync_thread()
9375 if (mddev->pers->spare_active(mddev)) { in md_reap_sync_thread()
9376 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in md_reap_sync_thread()
9377 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_reap_sync_thread()
9380 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_reap_sync_thread()
9381 mddev->pers->finish_reshape) { in md_reap_sync_thread()
9382 mddev->pers->finish_reshape(mddev); in md_reap_sync_thread()
9383 if (mddev_is_clustered(mddev)) in md_reap_sync_thread()
9390 if (!mddev->degraded) in md_reap_sync_thread()
9391 rdev_for_each(rdev, mddev) in md_reap_sync_thread()
9394 md_update_sb(mddev, 1); in md_reap_sync_thread()
9398 if (test_and_clear_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags)) in md_reap_sync_thread()
9399 md_cluster_ops->resync_finish(mddev); in md_reap_sync_thread()
9400 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_reap_sync_thread()
9401 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_reap_sync_thread()
9402 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_reap_sync_thread()
9403 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_reap_sync_thread()
9404 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_reap_sync_thread()
9405 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_reap_sync_thread()
9411 if (mddev_is_clustered(mddev) && is_reshaped in md_reap_sync_thread()
9412 && !test_bit(MD_CLOSING, &mddev->flags)) in md_reap_sync_thread()
9413 md_cluster_ops->update_size(mddev, old_dev_sectors); in md_reap_sync_thread()
9416 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_reap_sync_thread()
9417 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_reap_sync_thread()
9418 md_new_event(mddev); in md_reap_sync_thread()
9419 if (mddev->event_work.func) in md_reap_sync_thread()
9420 queue_work(md_misc_wq, &mddev->event_work); in md_reap_sync_thread()
9424 void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev) in md_wait_for_blocked_rdev() argument
9431 rdev_dec_pending(rdev, mddev); in md_wait_for_blocked_rdev()
9435 void md_finish_reshape(struct mddev *mddev) in md_finish_reshape() argument
9440 rdev_for_each(rdev, mddev) { in md_finish_reshape()
9456 struct mddev *mddev = rdev->mddev; in rdev_set_badblocks() local
9468 set_mask_bits(&mddev->sb_flags, 0, in rdev_set_badblocks()
9470 md_wakeup_thread(rdev->mddev->thread); in rdev_set_badblocks()
9496 struct mddev *mddev; in md_notify_reboot() local
9499 for_each_mddev(mddev, tmp) { in md_notify_reboot()
9500 if (mddev_trylock(mddev)) { in md_notify_reboot()
9501 if (mddev->pers) in md_notify_reboot()
9502 __md_stop_writes(mddev); in md_notify_reboot()
9503 if (mddev->persistent) in md_notify_reboot()
9504 mddev->safemode = 2; in md_notify_reboot()
9505 mddev_unlock(mddev); in md_notify_reboot()
9580 static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev) in check_sb_changes() argument
9591 if (mddev->dev_sectors != le64_to_cpu(sb->size)) { in check_sb_changes()
9592 ret = mddev->pers->resize(mddev, le64_to_cpu(sb->size)); in check_sb_changes()
9596 md_bitmap_update_sb(mddev->bitmap); in check_sb_changes()
9600 rdev_for_each(rdev2, mddev) { in check_sb_changes()
9625 ret = remove_and_add_spares(mddev, rdev2); in check_sb_changes()
9630 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in check_sb_changes()
9631 md_wakeup_thread(mddev->thread); in check_sb_changes()
9639 md_error(mddev, rdev2); in check_sb_changes()
9645 if (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) in check_sb_changes()
9646 update_raid_disks(mddev, le32_to_cpu(sb->raid_disks)); in check_sb_changes()
9652 if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) && in check_sb_changes()
9658 mddev->reshape_position = le64_to_cpu(sb->reshape_position); in check_sb_changes()
9659 if (mddev->pers->update_reshape_pos) in check_sb_changes()
9660 mddev->pers->update_reshape_pos(mddev); in check_sb_changes()
9661 if (mddev->pers->start_reshape) in check_sb_changes()
9662 mddev->pers->start_reshape(mddev); in check_sb_changes()
9663 } else if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) && in check_sb_changes()
9664 mddev->reshape_position != MaxSector && in check_sb_changes()
9667 mddev->reshape_position = MaxSector; in check_sb_changes()
9668 if (mddev->pers->update_reshape_pos) in check_sb_changes()
9669 mddev->pers->update_reshape_pos(mddev); in check_sb_changes()
9673 mddev->events = le64_to_cpu(sb->events); in check_sb_changes()
9676 static int read_rdev(struct mddev *mddev, struct md_rdev *rdev) in read_rdev() argument
9690 err = super_types[mddev->major_version]. in read_rdev()
9691 load_super(rdev, NULL, mddev->minor_version); in read_rdev()
9716 mddev->pers->spare_active(mddev)) in read_rdev()
9717 sysfs_notify_dirent_safe(mddev->sysfs_degraded); in read_rdev()
9723 void md_reload_sb(struct mddev *mddev, int nr) in md_reload_sb() argument
9729 rdev_for_each_rcu(rdev, mddev) { in md_reload_sb()
9739 err = read_rdev(mddev, rdev); in md_reload_sb()
9743 check_sb_changes(mddev, rdev); in md_reload_sb()
9746 rdev_for_each_rcu(rdev, mddev) { in md_reload_sb()
9748 read_rdev(mddev, rdev); in md_reload_sb()
9824 struct mddev *mddev; in md_exit() local
9848 for_each_mddev(mddev, tmp) { in md_exit()
9849 export_array(mddev); in md_exit()
9850 mddev->ctime = 0; in md_exit()
9851 mddev->hold_active = 0; in md_exit()