Lines Matching refs:mddev

98 static int remove_and_add_spares(struct mddev *mddev,
100 static void mddev_detach(struct mddev *mddev);
123 static inline int speed_min(struct mddev *mddev) in speed_min() argument
125 return mddev->sync_speed_min ? in speed_min()
126 mddev->sync_speed_min : sysctl_speed_limit_min; in speed_min()
129 static inline int speed_max(struct mddev *mddev) in speed_max() argument
131 return mddev->sync_speed_max ? in speed_max()
132 mddev->sync_speed_max : sysctl_speed_limit_max; in speed_max()
208 struct mddev *mddev) in bio_alloc_mddev() argument
212 if (!mddev || !bioset_initialized(&mddev->bio_set)) in bio_alloc_mddev()
215 b = bio_alloc_bioset(gfp_mask, nr_iovecs, &mddev->bio_set); in bio_alloc_mddev()
222 static struct bio *md_bio_alloc_sync(struct mddev *mddev) in md_bio_alloc_sync() argument
224 if (!mddev || !bioset_initialized(&mddev->sync_set)) in md_bio_alloc_sync()
227 return bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set); in md_bio_alloc_sync()
242 void md_new_event(struct mddev *mddev) in md_new_event() argument
269 mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\
272 _mddev = list_entry(_tmp, struct mddev, all_mddevs); \
285 static bool is_suspended(struct mddev *mddev, struct bio *bio) in is_suspended() argument
287 if (mddev->suspended) in is_suspended()
291 if (mddev->suspend_lo >= mddev->suspend_hi) in is_suspended()
293 if (bio->bi_iter.bi_sector >= mddev->suspend_hi) in is_suspended()
295 if (bio_end_sector(bio) < mddev->suspend_lo) in is_suspended()
300 void md_handle_request(struct mddev *mddev, struct bio *bio) in md_handle_request() argument
304 if (is_suspended(mddev, bio)) { in md_handle_request()
307 prepare_to_wait(&mddev->sb_wait, &__wait, in md_handle_request()
309 if (!is_suspended(mddev, bio)) in md_handle_request()
315 finish_wait(&mddev->sb_wait, &__wait); in md_handle_request()
317 atomic_inc(&mddev->active_io); in md_handle_request()
320 if (!mddev->pers->make_request(mddev, bio)) { in md_handle_request()
321 atomic_dec(&mddev->active_io); in md_handle_request()
322 wake_up(&mddev->sb_wait); in md_handle_request()
326 if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) in md_handle_request()
327 wake_up(&mddev->sb_wait); in md_handle_request()
335 struct mddev *mddev = q->queuedata; in md_make_request() local
341 if (mddev == NULL || mddev->pers == NULL) { in md_make_request()
345 if (mddev->ro == 1 && unlikely(rw == WRITE)) { in md_make_request()
360 md_handle_request(mddev, bio); in md_make_request()
363 part_stat_inc(cpu, &mddev->gendisk->part0, ios[sgrp]); in md_make_request()
364 part_stat_add(cpu, &mddev->gendisk->part0, sectors[sgrp], sectors); in md_make_request()
376 void mddev_suspend(struct mddev *mddev) in mddev_suspend() argument
378 WARN_ON_ONCE(mddev->thread && current == mddev->thread->tsk); in mddev_suspend()
379 lockdep_assert_held(&mddev->reconfig_mutex); in mddev_suspend()
380 if (mddev->suspended++) in mddev_suspend()
383 wake_up(&mddev->sb_wait); in mddev_suspend()
384 set_bit(MD_ALLOW_SB_UPDATE, &mddev->flags); in mddev_suspend()
386 wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); in mddev_suspend()
387 mddev->pers->quiesce(mddev, 1); in mddev_suspend()
388 clear_bit_unlock(MD_ALLOW_SB_UPDATE, &mddev->flags); in mddev_suspend()
389 wait_event(mddev->sb_wait, !test_bit(MD_UPDATING_SB, &mddev->flags)); in mddev_suspend()
391 del_timer_sync(&mddev->safemode_timer); in mddev_suspend()
395 void mddev_resume(struct mddev *mddev) in mddev_resume() argument
397 lockdep_assert_held(&mddev->reconfig_mutex); in mddev_resume()
398 if (--mddev->suspended) in mddev_resume()
400 wake_up(&mddev->sb_wait); in mddev_resume()
401 mddev->pers->quiesce(mddev, 0); in mddev_resume()
403 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in mddev_resume()
404 md_wakeup_thread(mddev->thread); in mddev_resume()
405 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ in mddev_resume()
409 int mddev_congested(struct mddev *mddev, int bits) in mddev_congested() argument
411 struct md_personality *pers = mddev->pers; in mddev_congested()
415 if (mddev->suspended) in mddev_congested()
418 ret = pers->congested(mddev, bits); in mddev_congested()
425 struct mddev *mddev = data; in md_congested() local
426 return mddev_congested(mddev, bits); in md_congested()
435 struct mddev *mddev = fi->mddev; in submit_flushes() local
439 md_handle_request(mddev, bio); in submit_flushes()
441 mempool_free(fi, mddev->flush_pool); in submit_flushes()
450 struct mddev *mddev = fi->mddev; in md_end_flush() local
452 rdev_dec_pending(rdev, mddev); in md_end_flush()
464 mempool_free(fb, mddev->flush_bio_pool); in md_end_flush()
468 void md_flush_request(struct mddev *mddev, struct bio *bio) in md_flush_request() argument
473 fi = mempool_alloc(mddev->flush_pool, GFP_NOIO); in md_flush_request()
476 fi->mddev = mddev; in md_flush_request()
480 rdev_for_each_rcu(rdev, mddev) in md_flush_request()
493 fb = mempool_alloc(mddev->flush_bio_pool, GFP_NOIO); in md_flush_request()
497 bi = bio_alloc_mddev(GFP_NOIO, 0, mddev); in md_flush_request()
507 rdev_dec_pending(rdev, mddev); in md_flush_request()
523 static inline struct mddev *mddev_get(struct mddev *mddev) in mddev_get() argument
525 atomic_inc(&mddev->active); in mddev_get()
526 return mddev; in mddev_get()
531 static void mddev_put(struct mddev *mddev) in mddev_put() argument
533 if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock)) in mddev_put()
535 if (!mddev->raid_disks && list_empty(&mddev->disks) && in mddev_put()
536 mddev->ctime == 0 && !mddev->hold_active) { in mddev_put()
539 list_del_init(&mddev->all_mddevs); in mddev_put()
546 INIT_WORK(&mddev->del_work, mddev_delayed_delete); in mddev_put()
547 queue_work(md_misc_wq, &mddev->del_work); in mddev_put()
554 void mddev_init(struct mddev *mddev) in mddev_init() argument
556 kobject_init(&mddev->kobj, &md_ktype); in mddev_init()
557 mutex_init(&mddev->open_mutex); in mddev_init()
558 mutex_init(&mddev->reconfig_mutex); in mddev_init()
559 mutex_init(&mddev->bitmap_info.mutex); in mddev_init()
560 INIT_LIST_HEAD(&mddev->disks); in mddev_init()
561 INIT_LIST_HEAD(&mddev->all_mddevs); in mddev_init()
562 timer_setup(&mddev->safemode_timer, md_safemode_timeout, 0); in mddev_init()
563 atomic_set(&mddev->active, 1); in mddev_init()
564 atomic_set(&mddev->openers, 0); in mddev_init()
565 atomic_set(&mddev->active_io, 0); in mddev_init()
566 spin_lock_init(&mddev->lock); in mddev_init()
567 init_waitqueue_head(&mddev->sb_wait); in mddev_init()
568 init_waitqueue_head(&mddev->recovery_wait); in mddev_init()
569 mddev->reshape_position = MaxSector; in mddev_init()
570 mddev->reshape_backwards = 0; in mddev_init()
571 mddev->last_sync_action = "none"; in mddev_init()
572 mddev->resync_min = 0; in mddev_init()
573 mddev->resync_max = MaxSector; in mddev_init()
574 mddev->level = LEVEL_NONE; in mddev_init()
578 static struct mddev *mddev_find(dev_t unit) in mddev_find()
580 struct mddev *mddev, *new = NULL; in mddev_find() local
589 list_for_each_entry(mddev, &all_mddevs, all_mddevs) in mddev_find()
590 if (mddev->unit == unit) { in mddev_find()
591 mddev_get(mddev); in mddev_find()
594 return mddev; in mddev_find()
622 list_for_each_entry(mddev, &all_mddevs, all_mddevs) in mddev_find()
623 if (mddev->unit == dev) { in mddev_find()
654 void mddev_unlock(struct mddev *mddev) in mddev_unlock() argument
656 if (mddev->to_remove) { in mddev_unlock()
669 struct attribute_group *to_remove = mddev->to_remove; in mddev_unlock()
670 mddev->to_remove = NULL; in mddev_unlock()
671 mddev->sysfs_active = 1; in mddev_unlock()
672 mutex_unlock(&mddev->reconfig_mutex); in mddev_unlock()
674 if (mddev->kobj.sd) { in mddev_unlock()
676 sysfs_remove_group(&mddev->kobj, to_remove); in mddev_unlock()
677 if (mddev->pers == NULL || in mddev_unlock()
678 mddev->pers->sync_request == NULL) { in mddev_unlock()
679 sysfs_remove_group(&mddev->kobj, &md_redundancy_group); in mddev_unlock()
680 if (mddev->sysfs_action) in mddev_unlock()
681 sysfs_put(mddev->sysfs_action); in mddev_unlock()
682 mddev->sysfs_action = NULL; in mddev_unlock()
685 mddev->sysfs_active = 0; in mddev_unlock()
687 mutex_unlock(&mddev->reconfig_mutex); in mddev_unlock()
693 md_wakeup_thread(mddev->thread); in mddev_unlock()
694 wake_up(&mddev->sb_wait); in mddev_unlock()
699 struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr) in md_find_rdev_nr_rcu() argument
703 rdev_for_each_rcu(rdev, mddev) in md_find_rdev_nr_rcu()
711 static struct md_rdev *find_rdev(struct mddev *mddev, dev_t dev) in find_rdev() argument
715 rdev_for_each(rdev, mddev) in find_rdev()
722 struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev) in md_find_rdev_rcu() argument
726 rdev_for_each_rcu(rdev, mddev) in md_find_rdev_rcu()
781 struct mddev *mddev = rdev->mddev; in super_written() local
785 md_error(mddev, rdev); in super_written()
788 set_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags); in super_written()
794 if (atomic_dec_and_test(&mddev->pending_writes)) in super_written()
795 wake_up(&mddev->sb_wait); in super_written()
796 rdev_dec_pending(rdev, mddev); in super_written()
800 void md_super_write(struct mddev *mddev, struct md_rdev *rdev, in md_super_write() argument
818 bio = md_bio_alloc_sync(mddev); in md_super_write()
828 if (test_bit(MD_FAILFAST_SUPPORTED, &mddev->flags) && in md_super_write()
834 atomic_inc(&mddev->pending_writes); in md_super_write()
838 int md_super_wait(struct mddev *mddev) in md_super_wait() argument
841 wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0); in md_super_wait()
842 if (test_and_clear_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags)) in md_super_wait()
850 struct bio *bio = md_bio_alloc_sync(rdev->mddev); in sync_page_io()
860 else if (rdev->mddev->reshape_position != MaxSector && in sync_page_io()
861 (rdev->mddev->reshape_backwards == in sync_page_io()
862 (sector >= rdev->mddev->reshape_position))) in sync_page_io()
1003 int (*validate_super)(struct mddev *mddev,
1005 void (*sync_super)(struct mddev *mddev,
1021 int md_check_no_bitmap(struct mddev *mddev) in md_check_no_bitmap() argument
1023 if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset) in md_check_no_bitmap()
1026 mdname(mddev), mddev->pers->name); in md_check_no_bitmap()
1131 static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) in super_90_validate() argument
1143 if (mddev->raid_disks == 0) { in super_90_validate()
1144 mddev->major_version = 0; in super_90_validate()
1145 mddev->minor_version = sb->minor_version; in super_90_validate()
1146 mddev->patch_version = sb->patch_version; in super_90_validate()
1147 mddev->external = 0; in super_90_validate()
1148 mddev->chunk_sectors = sb->chunk_size >> 9; in super_90_validate()
1149 mddev->ctime = sb->ctime; in super_90_validate()
1150 mddev->utime = sb->utime; in super_90_validate()
1151 mddev->level = sb->level; in super_90_validate()
1152 mddev->clevel[0] = 0; in super_90_validate()
1153 mddev->layout = sb->layout; in super_90_validate()
1154 mddev->raid_disks = sb->raid_disks; in super_90_validate()
1155 mddev->dev_sectors = ((sector_t)sb->size) * 2; in super_90_validate()
1156 mddev->events = ev1; in super_90_validate()
1157 mddev->bitmap_info.offset = 0; in super_90_validate()
1158 mddev->bitmap_info.space = 0; in super_90_validate()
1160 mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; in super_90_validate()
1161 mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9); in super_90_validate()
1162 mddev->reshape_backwards = 0; in super_90_validate()
1164 if (mddev->minor_version >= 91) { in super_90_validate()
1165 mddev->reshape_position = sb->reshape_position; in super_90_validate()
1166 mddev->delta_disks = sb->delta_disks; in super_90_validate()
1167 mddev->new_level = sb->new_level; in super_90_validate()
1168 mddev->new_layout = sb->new_layout; in super_90_validate()
1169 mddev->new_chunk_sectors = sb->new_chunk >> 9; in super_90_validate()
1170 if (mddev->delta_disks < 0) in super_90_validate()
1171 mddev->reshape_backwards = 1; in super_90_validate()
1173 mddev->reshape_position = MaxSector; in super_90_validate()
1174 mddev->delta_disks = 0; in super_90_validate()
1175 mddev->new_level = mddev->level; in super_90_validate()
1176 mddev->new_layout = mddev->layout; in super_90_validate()
1177 mddev->new_chunk_sectors = mddev->chunk_sectors; in super_90_validate()
1181 mddev->recovery_cp = MaxSector; in super_90_validate()
1185 mddev->recovery_cp = sb->recovery_cp; in super_90_validate()
1187 mddev->recovery_cp = 0; in super_90_validate()
1190 memcpy(mddev->uuid+0, &sb->set_uuid0, 4); in super_90_validate()
1191 memcpy(mddev->uuid+4, &sb->set_uuid1, 4); in super_90_validate()
1192 memcpy(mddev->uuid+8, &sb->set_uuid2, 4); in super_90_validate()
1193 memcpy(mddev->uuid+12,&sb->set_uuid3, 4); in super_90_validate()
1195 mddev->max_disks = MD_SB_DISKS; in super_90_validate()
1198 mddev->bitmap_info.file == NULL) { in super_90_validate()
1199 mddev->bitmap_info.offset = in super_90_validate()
1200 mddev->bitmap_info.default_offset; in super_90_validate()
1201 mddev->bitmap_info.space = in super_90_validate()
1202 mddev->bitmap_info.default_space; in super_90_validate()
1205 } else if (mddev->pers == NULL) { in super_90_validate()
1211 if (ev1 < mddev->events) in super_90_validate()
1213 } else if (mddev->bitmap) { in super_90_validate()
1217 if (ev1 < mddev->bitmap->events_cleared) in super_90_validate()
1219 if (ev1 < mddev->events) in super_90_validate()
1222 if (ev1 < mddev->events) in super_90_validate()
1227 if (mddev->level != LEVEL_MULTIPATH) { in super_90_validate()
1241 if (mddev->minor_version >= 91) { in super_90_validate()
1258 static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev) in super_90_sync() argument
1262 int next_spare = mddev->raid_disks; in super_90_sync()
1284 sb->major_version = mddev->major_version; in super_90_sync()
1285 sb->patch_version = mddev->patch_version; in super_90_sync()
1287 memcpy(&sb->set_uuid0, mddev->uuid+0, 4); in super_90_sync()
1288 memcpy(&sb->set_uuid1, mddev->uuid+4, 4); in super_90_sync()
1289 memcpy(&sb->set_uuid2, mddev->uuid+8, 4); in super_90_sync()
1290 memcpy(&sb->set_uuid3, mddev->uuid+12,4); in super_90_sync()
1292 sb->ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX); in super_90_sync()
1293 sb->level = mddev->level; in super_90_sync()
1294 sb->size = mddev->dev_sectors / 2; in super_90_sync()
1295 sb->raid_disks = mddev->raid_disks; in super_90_sync()
1296 sb->md_minor = mddev->md_minor; in super_90_sync()
1298 sb->utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX); in super_90_sync()
1300 sb->events_hi = (mddev->events>>32); in super_90_sync()
1301 sb->events_lo = (u32)mddev->events; in super_90_sync()
1303 if (mddev->reshape_position == MaxSector) in super_90_sync()
1307 sb->reshape_position = mddev->reshape_position; in super_90_sync()
1308 sb->new_level = mddev->new_level; in super_90_sync()
1309 sb->delta_disks = mddev->delta_disks; in super_90_sync()
1310 sb->new_layout = mddev->new_layout; in super_90_sync()
1311 sb->new_chunk = mddev->new_chunk_sectors << 9; in super_90_sync()
1313 mddev->minor_version = sb->minor_version; in super_90_sync()
1314 if (mddev->in_sync) in super_90_sync()
1316 sb->recovery_cp = mddev->recovery_cp; in super_90_sync()
1317 sb->cp_events_hi = (mddev->events>>32); in super_90_sync()
1318 sb->cp_events_lo = (u32)mddev->events; in super_90_sync()
1319 if (mddev->recovery_cp == MaxSector) in super_90_sync()
1324 sb->layout = mddev->layout; in super_90_sync()
1325 sb->chunk_size = mddev->chunk_sectors << 9; in super_90_sync()
1327 if (mddev->bitmap && mddev->bitmap_info.file == NULL) in super_90_sync()
1331 rdev_for_each(rdev2, mddev) { in super_90_sync()
1379 for (i=0 ; i < mddev->raid_disks ; i++) { in super_90_sync()
1405 if (num_sectors && num_sectors < rdev->mddev->dev_sectors) in super_90_rdev_size_change()
1407 if (rdev->mddev->bitmap_info.offset) in super_90_rdev_size_change()
1416 rdev->mddev->level >= 1) in super_90_rdev_size_change()
1419 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, in super_90_rdev_size_change()
1421 } while (md_super_wait(rdev->mddev) < 0); in super_90_rdev_size_change()
1629 static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) in super_1_validate() argument
1640 if (mddev->raid_disks == 0) { in super_1_validate()
1641 mddev->major_version = 1; in super_1_validate()
1642 mddev->patch_version = 0; in super_1_validate()
1643 mddev->external = 0; in super_1_validate()
1644 mddev->chunk_sectors = le32_to_cpu(sb->chunksize); in super_1_validate()
1645 mddev->ctime = le64_to_cpu(sb->ctime); in super_1_validate()
1646 mddev->utime = le64_to_cpu(sb->utime); in super_1_validate()
1647 mddev->level = le32_to_cpu(sb->level); in super_1_validate()
1648 mddev->clevel[0] = 0; in super_1_validate()
1649 mddev->layout = le32_to_cpu(sb->layout); in super_1_validate()
1650 mddev->raid_disks = le32_to_cpu(sb->raid_disks); in super_1_validate()
1651 mddev->dev_sectors = le64_to_cpu(sb->size); in super_1_validate()
1652 mddev->events = ev1; in super_1_validate()
1653 mddev->bitmap_info.offset = 0; in super_1_validate()
1654 mddev->bitmap_info.space = 0; in super_1_validate()
1658 mddev->bitmap_info.default_offset = 1024 >> 9; in super_1_validate()
1659 mddev->bitmap_info.default_space = (4096-1024) >> 9; in super_1_validate()
1660 mddev->reshape_backwards = 0; in super_1_validate()
1662 mddev->recovery_cp = le64_to_cpu(sb->resync_offset); in super_1_validate()
1663 memcpy(mddev->uuid, sb->set_uuid, 16); in super_1_validate()
1665 mddev->max_disks = (4096-256)/2; in super_1_validate()
1668 mddev->bitmap_info.file == NULL) { in super_1_validate()
1669 mddev->bitmap_info.offset = in super_1_validate()
1676 if (mddev->minor_version > 0) in super_1_validate()
1677 mddev->bitmap_info.space = 0; in super_1_validate()
1678 else if (mddev->bitmap_info.offset > 0) in super_1_validate()
1679 mddev->bitmap_info.space = in super_1_validate()
1680 8 - mddev->bitmap_info.offset; in super_1_validate()
1682 mddev->bitmap_info.space = in super_1_validate()
1683 -mddev->bitmap_info.offset; in super_1_validate()
1687 mddev->reshape_position = le64_to_cpu(sb->reshape_position); in super_1_validate()
1688 mddev->delta_disks = le32_to_cpu(sb->delta_disks); in super_1_validate()
1689 mddev->new_level = le32_to_cpu(sb->new_level); in super_1_validate()
1690 mddev->new_layout = le32_to_cpu(sb->new_layout); in super_1_validate()
1691 mddev->new_chunk_sectors = le32_to_cpu(sb->new_chunk); in super_1_validate()
1692 if (mddev->delta_disks < 0 || in super_1_validate()
1693 (mddev->delta_disks == 0 && in super_1_validate()
1696 mddev->reshape_backwards = 1; in super_1_validate()
1698 mddev->reshape_position = MaxSector; in super_1_validate()
1699 mddev->delta_disks = 0; in super_1_validate()
1700 mddev->new_level = mddev->level; in super_1_validate()
1701 mddev->new_layout = mddev->layout; in super_1_validate()
1702 mddev->new_chunk_sectors = mddev->chunk_sectors; in super_1_validate()
1706 set_bit(MD_HAS_JOURNAL, &mddev->flags); in super_1_validate()
1717 set_bit(MD_HAS_PPL, &mddev->flags); in super_1_validate()
1719 } else if (mddev->pers == NULL) { in super_1_validate()
1727 if (ev1 < mddev->events) in super_1_validate()
1729 } else if (mddev->bitmap) { in super_1_validate()
1733 if (ev1 < mddev->bitmap->events_cleared) in super_1_validate()
1735 if (ev1 < mddev->events) in super_1_validate()
1738 if (ev1 < mddev->events) in super_1_validate()
1742 if (mddev->level != LEVEL_MULTIPATH) { in super_1_validate()
1791 static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev) in super_1_sync() argument
1805 sb->utime = cpu_to_le64((__u64)mddev->utime); in super_1_sync()
1806 sb->events = cpu_to_le64(mddev->events); in super_1_sync()
1807 if (mddev->in_sync) in super_1_sync()
1808 sb->resync_offset = cpu_to_le64(mddev->recovery_cp); in super_1_sync()
1809 else if (test_bit(MD_JOURNAL_CLEAN, &mddev->flags)) in super_1_sync()
1816 sb->raid_disks = cpu_to_le32(mddev->raid_disks); in super_1_sync()
1817 sb->size = cpu_to_le64(mddev->dev_sectors); in super_1_sync()
1818 sb->chunksize = cpu_to_le32(mddev->chunk_sectors); in super_1_sync()
1819 sb->level = cpu_to_le32(mddev->level); in super_1_sync()
1820 sb->layout = cpu_to_le32(mddev->layout); in super_1_sync()
1833 if (mddev->bitmap && mddev->bitmap_info.file == NULL) { in super_1_sync()
1834 sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset); in super_1_sync()
1844 if (rdev->saved_raid_disk >= 0 && mddev->bitmap) in super_1_sync()
1855 if (mddev->reshape_position != MaxSector) { in super_1_sync()
1857 sb->reshape_position = cpu_to_le64(mddev->reshape_position); in super_1_sync()
1858 sb->new_layout = cpu_to_le32(mddev->new_layout); in super_1_sync()
1859 sb->delta_disks = cpu_to_le32(mddev->delta_disks); in super_1_sync()
1860 sb->new_level = cpu_to_le32(mddev->new_level); in super_1_sync()
1861 sb->new_chunk = cpu_to_le32(mddev->new_chunk_sectors); in super_1_sync()
1862 if (mddev->delta_disks == 0 && in super_1_sync()
1863 mddev->reshape_backwards) in super_1_sync()
1874 if (mddev_is_clustered(mddev)) in super_1_sync()
1881 md_error(mddev, rdev); in super_1_sync()
1912 rdev_for_each(rdev2, mddev) in super_1_sync()
1929 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) in super_1_sync()
1932 if (test_bit(MD_HAS_PPL, &mddev->flags)) { in super_1_sync()
1933 if (test_bit(MD_HAS_MULTIPLE_PPLS, &mddev->flags)) in super_1_sync()
1942 rdev_for_each(rdev2, mddev) { in super_1_sync()
1964 if (num_sectors && num_sectors < rdev->mddev->dev_sectors) in super_1_rdev_size_change()
1974 } else if (rdev->mddev->bitmap_info.offset) { in super_1_rdev_size_change()
1992 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, in super_1_rdev_size_change()
1994 } while (md_super_wait(rdev->mddev) < 0); in super_1_rdev_size_change()
2010 if (rdev->mddev->minor_version == 0) in super_1_allow_new_offset()
2021 bitmap = rdev->mddev->bitmap; in super_1_allow_new_offset()
2022 if (bitmap && !rdev->mddev->bitmap_info.file && in super_1_allow_new_offset()
2023 rdev->sb_start + rdev->mddev->bitmap_info.offset + in super_1_allow_new_offset()
2053 static void sync_super(struct mddev *mddev, struct md_rdev *rdev) in sync_super() argument
2055 if (mddev->sync_super) { in sync_super()
2056 mddev->sync_super(mddev, rdev); in sync_super()
2060 BUG_ON(mddev->major_version >= ARRAY_SIZE(super_types)); in sync_super()
2062 super_types[mddev->major_version].sync_super(mddev, rdev); in sync_super()
2065 static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2) in match_mddev_units()
2100 int md_integrity_register(struct mddev *mddev) in md_integrity_register() argument
2104 if (list_empty(&mddev->disks)) in md_integrity_register()
2106 if (!mddev->gendisk || blk_get_integrity(mddev->gendisk)) in md_integrity_register()
2108 rdev_for_each(rdev, mddev) { in md_integrity_register()
2130 blk_integrity_register(mddev->gendisk, in md_integrity_register()
2133 pr_debug("md: data integrity enabled on %s\n", mdname(mddev)); in md_integrity_register()
2134 if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE)) { in md_integrity_register()
2136 mdname(mddev)); in md_integrity_register()
2147 int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev) in md_integrity_add_rdev() argument
2153 if (!mddev->gendisk) in md_integrity_add_rdev()
2157 bi_mddev = blk_get_integrity(mddev->gendisk); in md_integrity_add_rdev()
2162 if (blk_integrity_compare(mddev->gendisk, rdev->bdev->bd_disk) != 0) { in md_integrity_add_rdev()
2164 mdname(mddev), bdevname(rdev->bdev, name)); in md_integrity_add_rdev()
2172 static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev) in bind_rdev_to_array() argument
2179 if (find_rdev(mddev, rdev->bdev->bd_dev)) in bind_rdev_to_array()
2183 mddev->pers) in bind_rdev_to_array()
2189 (mddev->dev_sectors == 0 || rdev->sectors < mddev->dev_sectors)) { in bind_rdev_to_array()
2190 if (mddev->pers) { in bind_rdev_to_array()
2195 if (mddev->level > 0) in bind_rdev_to_array()
2198 mddev->dev_sectors = rdev->sectors; in bind_rdev_to_array()
2208 if (mddev->pers) in bind_rdev_to_array()
2209 choice = mddev->raid_disks; in bind_rdev_to_array()
2210 while (md_find_rdev_nr_rcu(mddev, choice)) in bind_rdev_to_array()
2214 if (md_find_rdev_nr_rcu(mddev, rdev->desc_nr)) { in bind_rdev_to_array()
2221 mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { in bind_rdev_to_array()
2223 mdname(mddev), mddev->max_disks); in bind_rdev_to_array()
2229 rdev->mddev = mddev; in bind_rdev_to_array()
2232 if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b))) in bind_rdev_to_array()
2240 list_add_rcu(&rdev->same_set, &mddev->disks); in bind_rdev_to_array()
2241 bd_link_disk_holder(rdev->bdev, mddev->gendisk); in bind_rdev_to_array()
2244 mddev->recovery_disabled++; in bind_rdev_to_array()
2250 b, mdname(mddev)); in bind_rdev_to_array()
2265 bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk); in unbind_rdev_from_array()
2268 rdev->mddev = NULL; in unbind_rdev_from_array()
2334 static void export_array(struct mddev *mddev) in export_array() argument
2338 while (!list_empty(&mddev->disks)) { in export_array()
2339 rdev = list_first_entry(&mddev->disks, struct md_rdev, in export_array()
2343 mddev->raid_disks = 0; in export_array()
2344 mddev->major_version = 0; in export_array()
2347 static bool set_in_sync(struct mddev *mddev) in set_in_sync() argument
2349 lockdep_assert_held(&mddev->lock); in set_in_sync()
2350 if (!mddev->in_sync) { in set_in_sync()
2351 mddev->sync_checkers++; in set_in_sync()
2352 spin_unlock(&mddev->lock); in set_in_sync()
2353 percpu_ref_switch_to_atomic_sync(&mddev->writes_pending); in set_in_sync()
2354 spin_lock(&mddev->lock); in set_in_sync()
2355 if (!mddev->in_sync && in set_in_sync()
2356 percpu_ref_is_zero(&mddev->writes_pending)) { in set_in_sync()
2357 mddev->in_sync = 1; in set_in_sync()
2363 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in set_in_sync()
2364 sysfs_notify_dirent_safe(mddev->sysfs_state); in set_in_sync()
2366 if (--mddev->sync_checkers == 0) in set_in_sync()
2367 percpu_ref_switch_to_percpu(&mddev->writes_pending); in set_in_sync()
2369 if (mddev->safemode == 1) in set_in_sync()
2370 mddev->safemode = 0; in set_in_sync()
2371 return mddev->in_sync; in set_in_sync()
2374 static void sync_sbs(struct mddev *mddev, int nospares) in sync_sbs() argument
2383 rdev_for_each(rdev, mddev) { in sync_sbs()
2384 if (rdev->sb_events == mddev->events || in sync_sbs()
2387 rdev->sb_events+1 == mddev->events)) { in sync_sbs()
2391 sync_super(mddev, rdev); in sync_sbs()
2397 static bool does_sb_need_changing(struct mddev *mddev) in does_sb_need_changing() argument
2404 rdev_for_each(rdev, mddev) in does_sb_need_changing()
2414 rdev_for_each(rdev, mddev) { in does_sb_need_changing()
2426 if ((mddev->dev_sectors != le64_to_cpu(sb->size)) || in does_sb_need_changing()
2427 (mddev->reshape_position != le64_to_cpu(sb->reshape_position)) || in does_sb_need_changing()
2428 (mddev->layout != le32_to_cpu(sb->layout)) || in does_sb_need_changing()
2429 (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) || in does_sb_need_changing()
2430 (mddev->chunk_sectors != le32_to_cpu(sb->chunksize))) in does_sb_need_changing()
2436 void md_update_sb(struct mddev *mddev, int force_change) in md_update_sb() argument
2444 if (mddev->ro) { in md_update_sb()
2446 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_update_sb()
2451 if (mddev_is_clustered(mddev)) { in md_update_sb()
2452 if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) in md_update_sb()
2454 if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags)) in md_update_sb()
2456 ret = md_cluster_ops->metadata_update_start(mddev); in md_update_sb()
2458 if (!does_sb_need_changing(mddev)) { in md_update_sb()
2460 md_cluster_ops->metadata_update_cancel(mddev); in md_update_sb()
2461 bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING), in md_update_sb()
2474 rdev_for_each(rdev, mddev) { in md_update_sb()
2476 mddev->delta_disks >= 0 && in md_update_sb()
2477 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in md_update_sb()
2478 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery) && in md_update_sb()
2479 !test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_update_sb()
2482 mddev->curr_resync_completed > rdev->recovery_offset) in md_update_sb()
2483 rdev->recovery_offset = mddev->curr_resync_completed; in md_update_sb()
2486 if (!mddev->persistent) { in md_update_sb()
2487 clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_update_sb()
2488 clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_update_sb()
2489 if (!mddev->external) { in md_update_sb()
2490 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_update_sb()
2491 rdev_for_each(rdev, mddev) { in md_update_sb()
2495 md_error(mddev, rdev); in md_update_sb()
2502 wake_up(&mddev->sb_wait); in md_update_sb()
2506 spin_lock(&mddev->lock); in md_update_sb()
2508 mddev->utime = ktime_get_real_seconds(); in md_update_sb()
2510 if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) in md_update_sb()
2512 if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags)) in md_update_sb()
2520 if (mddev->degraded) in md_update_sb()
2532 sync_req = mddev->in_sync; in md_update_sb()
2537 && (mddev->in_sync && mddev->recovery_cp == MaxSector) in md_update_sb()
2538 && mddev->can_decrease_events in md_update_sb()
2539 && mddev->events != 1) { in md_update_sb()
2540 mddev->events--; in md_update_sb()
2541 mddev->can_decrease_events = 0; in md_update_sb()
2544 mddev->events ++; in md_update_sb()
2545 mddev->can_decrease_events = nospares; in md_update_sb()
2553 WARN_ON(mddev->events == 0); in md_update_sb()
2555 rdev_for_each(rdev, mddev) { in md_update_sb()
2562 sync_sbs(mddev, nospares); in md_update_sb()
2563 spin_unlock(&mddev->lock); in md_update_sb()
2566 mdname(mddev), mddev->in_sync); in md_update_sb()
2568 if (mddev->queue) in md_update_sb()
2569 blk_add_trace_msg(mddev->queue, "md md_update_sb"); in md_update_sb()
2571 md_bitmap_update_sb(mddev->bitmap); in md_update_sb()
2572 rdev_for_each(rdev, mddev) { in md_update_sb()
2579 md_super_write(mddev,rdev, in md_update_sb()
2585 rdev->sb_events = mddev->events; in md_update_sb()
2587 md_super_write(mddev, rdev, in md_update_sb()
2598 if (mddev->level == LEVEL_MULTIPATH) in md_update_sb()
2602 if (md_super_wait(mddev) < 0) in md_update_sb()
2606 if (mddev_is_clustered(mddev) && ret == 0) in md_update_sb()
2607 md_cluster_ops->metadata_update_finish(mddev); in md_update_sb()
2609 if (mddev->in_sync != sync_req || in md_update_sb()
2610 !bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING), in md_update_sb()
2614 wake_up(&mddev->sb_wait); in md_update_sb()
2615 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in md_update_sb()
2616 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); in md_update_sb()
2618 rdev_for_each(rdev, mddev) { in md_update_sb()
2632 struct mddev *mddev = rdev->mddev; in add_bound_rdev() local
2636 if (!mddev->pers->hot_remove_disk || add_journal) { in add_bound_rdev()
2641 super_types[mddev->major_version]. in add_bound_rdev()
2642 validate_super(mddev, rdev); in add_bound_rdev()
2644 mddev_suspend(mddev); in add_bound_rdev()
2645 err = mddev->pers->hot_add_disk(mddev, rdev); in add_bound_rdev()
2647 mddev_resume(mddev); in add_bound_rdev()
2655 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in add_bound_rdev()
2656 if (mddev->degraded) in add_bound_rdev()
2657 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in add_bound_rdev()
2658 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in add_bound_rdev()
2659 md_new_event(mddev); in add_bound_rdev()
2660 md_wakeup_thread(mddev->thread); in add_bound_rdev()
2750 if (cmd_match(buf, "faulty") && rdev->mddev->pers) { in state_store()
2751 md_error(rdev->mddev, rdev); in state_store()
2757 if (rdev->mddev->pers) { in state_store()
2759 remove_and_add_spares(rdev->mddev, rdev); in state_store()
2764 struct mddev *mddev = rdev->mddev; in state_store() local
2766 if (mddev_is_clustered(mddev)) in state_store()
2767 err = md_cluster_ops->remove_disk(mddev, rdev); in state_store()
2771 if (mddev->pers) { in state_store()
2772 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in state_store()
2773 md_wakeup_thread(mddev->thread); in state_store()
2775 md_new_event(mddev); in state_store()
2794 md_error(rdev->mddev, rdev); in state_store()
2799 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in state_store()
2800 md_wakeup_thread(rdev->mddev->thread); in state_store()
2814 if (rdev->mddev->pers == NULL) { in state_store()
2835 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in state_store()
2836 md_wakeup_thread(rdev->mddev->thread); in state_store()
2849 if (rdev->mddev->pers) in state_store()
2857 if (rdev->mddev->pers) in state_store()
2872 if (!mddev_is_clustered(rdev->mddev) || in state_store()
2879 } else if (cmd_match(buf, "external_bbl") && (rdev->mddev->external)) { in state_store()
2883 } else if (cmd_match(buf, "-external_bbl") && (rdev->mddev->external)) { in state_store()
2941 if (rdev->mddev->pers && slot == -1) { in slot_store()
2952 if (rdev->mddev->pers->hot_remove_disk == NULL) in slot_store()
2955 remove_and_add_spares(rdev->mddev, rdev); in slot_store()
2958 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); in slot_store()
2959 md_wakeup_thread(rdev->mddev->thread); in slot_store()
2960 } else if (rdev->mddev->pers) { in slot_store()
2969 if (test_bit(MD_RECOVERY_RUNNING, &rdev->mddev->recovery)) in slot_store()
2972 if (rdev->mddev->pers->hot_add_disk == NULL) in slot_store()
2975 if (slot >= rdev->mddev->raid_disks && in slot_store()
2976 slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks) in slot_store()
2986 err = rdev->mddev->pers-> in slot_store()
2987 hot_add_disk(rdev->mddev, rdev); in slot_store()
2993 if (sysfs_link_rdev(rdev->mddev, rdev)) in slot_store()
2997 if (slot >= rdev->mddev->raid_disks && in slot_store()
2998 slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks) in slot_store()
3025 if (rdev->mddev->pers && rdev->raid_disk >= 0) in offset_store()
3027 if (rdev->sectors && rdev->mddev->external) in offset_store()
3049 struct mddev *mddev = rdev->mddev; in new_offset_store() local
3054 if (mddev->sync_thread || in new_offset_store()
3055 test_bit(MD_RECOVERY_RUNNING,&mddev->recovery)) in new_offset_store()
3063 + mddev->dev_sectors > rdev->sectors) in new_offset_store()
3072 mddev->reshape_backwards) in new_offset_store()
3079 !mddev->reshape_backwards) in new_offset_store()
3082 if (mddev->pers && mddev->persistent && in new_offset_store()
3083 !super_types[mddev->major_version] in new_offset_store()
3088 mddev->reshape_backwards = 1; in new_offset_store()
3090 mddev->reshape_backwards = 0; in new_offset_store()
3135 struct mddev *my_mddev = rdev->mddev; in rdev_size_store()
3169 struct mddev *mddev; in rdev_size_store() local
3174 for_each_mddev(mddev, tmp) { in rdev_size_store()
3177 rdev_for_each(rdev2, mddev) in rdev_size_store()
3187 mddev_put(mddev); in rdev_size_store()
3229 if (rdev->mddev->pers && in recovery_start_store()
3297 if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) && in ppl_sector_store()
3301 if (rdev->mddev->persistent) { in ppl_sector_store()
3302 if (rdev->mddev->major_version == 0) in ppl_sector_store()
3310 } else if (!rdev->mddev->external) { in ppl_sector_store()
3334 if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) && in ppl_size_store()
3338 if (rdev->mddev->persistent) { in ppl_size_store()
3339 if (rdev->mddev->major_version == 0) in ppl_size_store()
3343 } else if (!rdev->mddev->external) { in ppl_size_store()
3375 if (!rdev->mddev) in rdev_attr_show()
3387 struct mddev *mddev = rdev->mddev; in rdev_attr_store() local
3393 rv = mddev ? mddev_lock(mddev): -EBUSY; in rdev_attr_store()
3395 if (rdev->mddev == NULL) in rdev_attr_store()
3399 mddev_unlock(mddev); in rdev_attr_store()
3517 static void analyze_sbs(struct mddev *mddev) in analyze_sbs() argument
3524 rdev_for_each_safe(rdev, tmp, mddev) in analyze_sbs()
3525 switch (super_types[mddev->major_version]. in analyze_sbs()
3526 load_super(rdev, freshest, mddev->minor_version)) { in analyze_sbs()
3538 super_types[mddev->major_version]. in analyze_sbs()
3539 validate_super(mddev, freshest); in analyze_sbs()
3542 rdev_for_each_safe(rdev, tmp, mddev) { in analyze_sbs()
3543 if (mddev->max_disks && in analyze_sbs()
3544 (rdev->desc_nr >= mddev->max_disks || in analyze_sbs()
3545 i > mddev->max_disks)) { in analyze_sbs()
3547 mdname(mddev), bdevname(rdev->bdev, b), in analyze_sbs()
3548 mddev->max_disks); in analyze_sbs()
3553 if (super_types[mddev->major_version]. in analyze_sbs()
3554 validate_super(mddev, rdev)) { in analyze_sbs()
3561 if (mddev->level == LEVEL_MULTIPATH) { in analyze_sbs()
3566 (mddev->raid_disks - min(0, mddev->delta_disks)) && in analyze_sbs()
3615 safe_delay_show(struct mddev *mddev, char *page) in safe_delay_show() argument
3617 int msec = (mddev->safemode_delay*1000)/HZ; in safe_delay_show()
3621 safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len) in safe_delay_store() argument
3625 if (mddev_is_clustered(mddev)) { in safe_delay_store()
3633 mddev->safemode_delay = 0; in safe_delay_store()
3635 unsigned long old_delay = mddev->safemode_delay; in safe_delay_store()
3640 mddev->safemode_delay = new_delay; in safe_delay_store()
3642 mod_timer(&mddev->safemode_timer, jiffies+1); in safe_delay_store()
3650 level_show(struct mddev *mddev, char *page) in level_show() argument
3654 spin_lock(&mddev->lock); in level_show()
3655 p = mddev->pers; in level_show()
3658 else if (mddev->clevel[0]) in level_show()
3659 ret = sprintf(page, "%s\n", mddev->clevel); in level_show()
3660 else if (mddev->level != LEVEL_NONE) in level_show()
3661 ret = sprintf(page, "%d\n", mddev->level); in level_show()
3664 spin_unlock(&mddev->lock); in level_show()
3669 level_store(struct mddev *mddev, const char *buf, size_t len) in level_store() argument
3682 rv = mddev_lock(mddev); in level_store()
3686 if (mddev->pers == NULL) { in level_store()
3687 strncpy(mddev->clevel, buf, slen); in level_store()
3688 if (mddev->clevel[slen-1] == '\n') in level_store()
3690 mddev->clevel[slen] = 0; in level_store()
3691 mddev->level = LEVEL_NONE; in level_store()
3696 if (mddev->ro) in level_store()
3706 if (mddev->sync_thread || in level_store()
3707 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in level_store()
3708 mddev->reshape_position != MaxSector || in level_store()
3709 mddev->sysfs_active) in level_store()
3713 if (!mddev->pers->quiesce) { in level_store()
3715 mdname(mddev), mddev->pers->name); in level_store()
3739 if (pers == mddev->pers) { in level_store()
3748 mdname(mddev), clevel); in level_store()
3753 rdev_for_each(rdev, mddev) in level_store()
3759 priv = pers->takeover(mddev); in level_store()
3761 mddev->new_level = mddev->level; in level_store()
3762 mddev->new_layout = mddev->layout; in level_store()
3763 mddev->new_chunk_sectors = mddev->chunk_sectors; in level_store()
3764 mddev->raid_disks -= mddev->delta_disks; in level_store()
3765 mddev->delta_disks = 0; in level_store()
3766 mddev->reshape_backwards = 0; in level_store()
3769 mdname(mddev), clevel); in level_store()
3775 mddev_suspend(mddev); in level_store()
3776 mddev_detach(mddev); in level_store()
3778 spin_lock(&mddev->lock); in level_store()
3779 oldpers = mddev->pers; in level_store()
3780 oldpriv = mddev->private; in level_store()
3781 mddev->pers = pers; in level_store()
3782 mddev->private = priv; in level_store()
3783 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); in level_store()
3784 mddev->level = mddev->new_level; in level_store()
3785 mddev->layout = mddev->new_layout; in level_store()
3786 mddev->chunk_sectors = mddev->new_chunk_sectors; in level_store()
3787 mddev->delta_disks = 0; in level_store()
3788 mddev->reshape_backwards = 0; in level_store()
3789 mddev->degraded = 0; in level_store()
3790 spin_unlock(&mddev->lock); in level_store()
3793 mddev->external) { in level_store()
3801 mddev->in_sync = 0; in level_store()
3802 mddev->safemode_delay = 0; in level_store()
3803 mddev->safemode = 0; in level_store()
3806 oldpers->free(mddev, oldpriv); in level_store()
3811 if (sysfs_create_group(&mddev->kobj, &md_redundancy_group)) in level_store()
3813 mdname(mddev)); in level_store()
3814 mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action"); in level_store()
3819 if (mddev->to_remove == NULL) in level_store()
3820 mddev->to_remove = &md_redundancy_group; in level_store()
3825 rdev_for_each(rdev, mddev) { in level_store()
3828 if (rdev->new_raid_disk >= mddev->raid_disks) in level_store()
3832 sysfs_unlink_rdev(mddev, rdev); in level_store()
3834 rdev_for_each(rdev, mddev) { in level_store()
3843 if (sysfs_link_rdev(mddev, rdev)) in level_store()
3845 rdev->raid_disk, mdname(mddev)); in level_store()
3853 mddev->in_sync = 1; in level_store()
3854 del_timer_sync(&mddev->safemode_timer); in level_store()
3856 blk_set_stacking_limits(&mddev->queue->limits); in level_store()
3857 pers->run(mddev); in level_store()
3858 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in level_store()
3859 mddev_resume(mddev); in level_store()
3860 if (!mddev->thread) in level_store()
3861 md_update_sb(mddev, 1); in level_store()
3862 sysfs_notify(&mddev->kobj, NULL, "level"); in level_store()
3863 md_new_event(mddev); in level_store()
3866 mddev_unlock(mddev); in level_store()
3874 layout_show(struct mddev *mddev, char *page) in layout_show() argument
3877 if (mddev->reshape_position != MaxSector && in layout_show()
3878 mddev->layout != mddev->new_layout) in layout_show()
3880 mddev->new_layout, mddev->layout); in layout_show()
3881 return sprintf(page, "%d\n", mddev->layout); in layout_show()
3885 layout_store(struct mddev *mddev, const char *buf, size_t len) in layout_store() argument
3893 err = mddev_lock(mddev); in layout_store()
3897 if (mddev->pers) { in layout_store()
3898 if (mddev->pers->check_reshape == NULL) in layout_store()
3900 else if (mddev->ro) in layout_store()
3903 mddev->new_layout = n; in layout_store()
3904 err = mddev->pers->check_reshape(mddev); in layout_store()
3906 mddev->new_layout = mddev->layout; in layout_store()
3909 mddev->new_layout = n; in layout_store()
3910 if (mddev->reshape_position == MaxSector) in layout_store()
3911 mddev->layout = n; in layout_store()
3913 mddev_unlock(mddev); in layout_store()
3920 raid_disks_show(struct mddev *mddev, char *page) in raid_disks_show() argument
3922 if (mddev->raid_disks == 0) in raid_disks_show()
3924 if (mddev->reshape_position != MaxSector && in raid_disks_show()
3925 mddev->delta_disks != 0) in raid_disks_show()
3926 return sprintf(page, "%d (%d)\n", mddev->raid_disks, in raid_disks_show()
3927 mddev->raid_disks - mddev->delta_disks); in raid_disks_show()
3928 return sprintf(page, "%d\n", mddev->raid_disks); in raid_disks_show()
3931 static int update_raid_disks(struct mddev *mddev, int raid_disks);
3934 raid_disks_store(struct mddev *mddev, const char *buf, size_t len) in raid_disks_store() argument
3943 err = mddev_lock(mddev); in raid_disks_store()
3946 if (mddev->pers) in raid_disks_store()
3947 err = update_raid_disks(mddev, n); in raid_disks_store()
3948 else if (mddev->reshape_position != MaxSector) { in raid_disks_store()
3950 int olddisks = mddev->raid_disks - mddev->delta_disks; in raid_disks_store()
3953 rdev_for_each(rdev, mddev) { in raid_disks_store()
3962 mddev->delta_disks = n - olddisks; in raid_disks_store()
3963 mddev->raid_disks = n; in raid_disks_store()
3964 mddev->reshape_backwards = (mddev->delta_disks < 0); in raid_disks_store()
3966 mddev->raid_disks = n; in raid_disks_store()
3968 mddev_unlock(mddev); in raid_disks_store()
3975 chunk_size_show(struct mddev *mddev, char *page) in chunk_size_show() argument
3977 if (mddev->reshape_position != MaxSector && in chunk_size_show()
3978 mddev->chunk_sectors != mddev->new_chunk_sectors) in chunk_size_show()
3980 mddev->new_chunk_sectors << 9, in chunk_size_show()
3981 mddev->chunk_sectors << 9); in chunk_size_show()
3982 return sprintf(page, "%d\n", mddev->chunk_sectors << 9); in chunk_size_show()
3986 chunk_size_store(struct mddev *mddev, const char *buf, size_t len) in chunk_size_store() argument
3995 err = mddev_lock(mddev); in chunk_size_store()
3998 if (mddev->pers) { in chunk_size_store()
3999 if (mddev->pers->check_reshape == NULL) in chunk_size_store()
4001 else if (mddev->ro) in chunk_size_store()
4004 mddev->new_chunk_sectors = n >> 9; in chunk_size_store()
4005 err = mddev->pers->check_reshape(mddev); in chunk_size_store()
4007 mddev->new_chunk_sectors = mddev->chunk_sectors; in chunk_size_store()
4010 mddev->new_chunk_sectors = n >> 9; in chunk_size_store()
4011 if (mddev->reshape_position == MaxSector) in chunk_size_store()
4012 mddev->chunk_sectors = n >> 9; in chunk_size_store()
4014 mddev_unlock(mddev); in chunk_size_store()
4021 resync_start_show(struct mddev *mddev, char *page) in resync_start_show() argument
4023 if (mddev->recovery_cp == MaxSector) in resync_start_show()
4025 return sprintf(page, "%llu\n", (unsigned long long)mddev->recovery_cp); in resync_start_show()
4029 resync_start_store(struct mddev *mddev, const char *buf, size_t len) in resync_start_store() argument
4044 err = mddev_lock(mddev); in resync_start_store()
4047 if (mddev->pers && !test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) in resync_start_store()
4051 mddev->recovery_cp = n; in resync_start_store()
4052 if (mddev->pers) in resync_start_store()
4053 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in resync_start_store()
4055 mddev_unlock(mddev); in resync_start_store()
4114 array_state_show(struct mddev *mddev, char *page) in array_state_show() argument
4118 if (mddev->pers) in array_state_show()
4119 switch(mddev->ro) { in array_state_show()
4127 spin_lock(&mddev->lock); in array_state_show()
4128 if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) in array_state_show()
4130 else if (mddev->in_sync) in array_state_show()
4132 else if (mddev->safemode) in array_state_show()
4136 spin_unlock(&mddev->lock); in array_state_show()
4139 if (list_empty(&mddev->disks) && in array_state_show()
4140 mddev->raid_disks == 0 && in array_state_show()
4141 mddev->dev_sectors == 0) in array_state_show()
4149 static int do_md_stop(struct mddev *mddev, int ro, struct block_device *bdev);
4150 static int md_set_readonly(struct mddev *mddev, struct block_device *bdev);
4151 static int do_md_run(struct mddev *mddev);
4152 static int restart_array(struct mddev *mddev);
4155 array_state_store(struct mddev *mddev, const char *buf, size_t len) in array_state_store() argument
4160 if (mddev->pers && (st == active || st == clean) && mddev->ro != 1) { in array_state_store()
4164 spin_lock(&mddev->lock); in array_state_store()
4166 restart_array(mddev); in array_state_store()
4167 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in array_state_store()
4168 md_wakeup_thread(mddev->thread); in array_state_store()
4169 wake_up(&mddev->sb_wait); in array_state_store()
4171 restart_array(mddev); in array_state_store()
4172 if (!set_in_sync(mddev)) in array_state_store()
4176 sysfs_notify_dirent_safe(mddev->sysfs_state); in array_state_store()
4177 spin_unlock(&mddev->lock); in array_state_store()
4180 err = mddev_lock(mddev); in array_state_store()
4189 err = do_md_stop(mddev, 0, NULL); in array_state_store()
4193 if (mddev->pers) in array_state_store()
4194 err = do_md_stop(mddev, 2, NULL); in array_state_store()
4201 if (mddev->pers) in array_state_store()
4202 err = md_set_readonly(mddev, NULL); in array_state_store()
4204 mddev->ro = 1; in array_state_store()
4205 set_disk_ro(mddev->gendisk, 1); in array_state_store()
4206 err = do_md_run(mddev); in array_state_store()
4210 if (mddev->pers) { in array_state_store()
4211 if (mddev->ro == 0) in array_state_store()
4212 err = md_set_readonly(mddev, NULL); in array_state_store()
4213 else if (mddev->ro == 1) in array_state_store()
4214 err = restart_array(mddev); in array_state_store()
4216 mddev->ro = 2; in array_state_store()
4217 set_disk_ro(mddev->gendisk, 0); in array_state_store()
4220 mddev->ro = 2; in array_state_store()
4221 err = do_md_run(mddev); in array_state_store()
4225 if (mddev->pers) { in array_state_store()
4226 err = restart_array(mddev); in array_state_store()
4229 spin_lock(&mddev->lock); in array_state_store()
4230 if (!set_in_sync(mddev)) in array_state_store()
4232 spin_unlock(&mddev->lock); in array_state_store()
4237 if (mddev->pers) { in array_state_store()
4238 err = restart_array(mddev); in array_state_store()
4241 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in array_state_store()
4242 wake_up(&mddev->sb_wait); in array_state_store()
4245 mddev->ro = 0; in array_state_store()
4246 set_disk_ro(mddev->gendisk, 0); in array_state_store()
4247 err = do_md_run(mddev); in array_state_store()
4257 if (mddev->hold_active == UNTIL_IOCTL) in array_state_store()
4258 mddev->hold_active = 0; in array_state_store()
4259 sysfs_notify_dirent_safe(mddev->sysfs_state); in array_state_store()
4261 mddev_unlock(mddev); in array_state_store()
4268 max_corrected_read_errors_show(struct mddev *mddev, char *page) { in max_corrected_read_errors_show() argument
4270 atomic_read(&mddev->max_corr_read_errors)); in max_corrected_read_errors_show()
4274 max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len) in max_corrected_read_errors_store() argument
4282 atomic_set(&mddev->max_corr_read_errors, n); in max_corrected_read_errors_store()
4291 null_show(struct mddev *mddev, char *page) in null_show() argument
4297 new_dev_store(struct mddev *mddev, const char *buf, size_t len) in new_dev_store() argument
4325 err = mddev_lock(mddev); in new_dev_store()
4328 if (mddev->persistent) { in new_dev_store()
4329 rdev = md_import_device(dev, mddev->major_version, in new_dev_store()
4330 mddev->minor_version); in new_dev_store()
4331 if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) { in new_dev_store()
4333 = list_entry(mddev->disks.next, in new_dev_store()
4335 err = super_types[mddev->major_version] in new_dev_store()
4336 .load_super(rdev, rdev0, mddev->minor_version); in new_dev_store()
4340 } else if (mddev->external) in new_dev_store()
4346 mddev_unlock(mddev); in new_dev_store()
4349 err = bind_rdev_to_array(rdev, mddev); in new_dev_store()
4353 mddev_unlock(mddev); in new_dev_store()
4355 md_new_event(mddev); in new_dev_store()
4363 bitmap_store(struct mddev *mddev, const char *buf, size_t len) in bitmap_store() argument
4369 err = mddev_lock(mddev); in bitmap_store()
4372 if (!mddev->bitmap) in bitmap_store()
4384 md_bitmap_dirty_bits(mddev->bitmap, chunk, end_chunk); in bitmap_store()
4387 md_bitmap_unplug(mddev->bitmap); /* flush the bits to disk */ in bitmap_store()
4389 mddev_unlock(mddev); in bitmap_store()
4397 size_show(struct mddev *mddev, char *page) in size_show() argument
4400 (unsigned long long)mddev->dev_sectors / 2); in size_show()
4403 static int update_size(struct mddev *mddev, sector_t num_sectors);
4406 size_store(struct mddev *mddev, const char *buf, size_t len) in size_store() argument
4417 err = mddev_lock(mddev); in size_store()
4420 if (mddev->pers) { in size_store()
4421 err = update_size(mddev, sectors); in size_store()
4423 md_update_sb(mddev, 1); in size_store()
4425 if (mddev->dev_sectors == 0 || in size_store()
4426 mddev->dev_sectors > sectors) in size_store()
4427 mddev->dev_sectors = sectors; in size_store()
4431 mddev_unlock(mddev); in size_store()
4445 metadata_show(struct mddev *mddev, char *page) in metadata_show() argument
4447 if (mddev->persistent) in metadata_show()
4449 mddev->major_version, mddev->minor_version); in metadata_show()
4450 else if (mddev->external) in metadata_show()
4451 return sprintf(page, "external:%s\n", mddev->metadata_type); in metadata_show()
4457 metadata_store(struct mddev *mddev, const char *buf, size_t len) in metadata_store() argument
4467 err = mddev_lock(mddev); in metadata_store()
4471 if (mddev->external && strncmp(buf, "external:", 9) == 0) in metadata_store()
4473 else if (!list_empty(&mddev->disks)) in metadata_store()
4478 mddev->persistent = 0; in metadata_store()
4479 mddev->external = 0; in metadata_store()
4480 mddev->major_version = 0; in metadata_store()
4481 mddev->minor_version = 90; in metadata_store()
4486 if (namelen >= sizeof(mddev->metadata_type)) in metadata_store()
4487 namelen = sizeof(mddev->metadata_type)-1; in metadata_store()
4488 strncpy(mddev->metadata_type, buf+9, namelen); in metadata_store()
4489 mddev->metadata_type[namelen] = 0; in metadata_store()
4490 if (namelen && mddev->metadata_type[namelen-1] == '\n') in metadata_store()
4491 mddev->metadata_type[--namelen] = 0; in metadata_store()
4492 mddev->persistent = 0; in metadata_store()
4493 mddev->external = 1; in metadata_store()
4494 mddev->major_version = 0; in metadata_store()
4495 mddev->minor_version = 90; in metadata_store()
4509 mddev->major_version = major; in metadata_store()
4510 mddev->minor_version = minor; in metadata_store()
4511 mddev->persistent = 1; in metadata_store()
4512 mddev->external = 0; in metadata_store()
4515 mddev_unlock(mddev); in metadata_store()
4523 action_show(struct mddev *mddev, char *page) in action_show() argument
4526 unsigned long recovery = mddev->recovery; in action_show()
4530 (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &recovery))) { in action_show()
4542 else if (mddev->reshape_position != MaxSector) in action_show()
4549 action_store(struct mddev *mddev, const char *page, size_t len) in action_store() argument
4551 if (!mddev->pers || !mddev->pers->sync_request) in action_store()
4557 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4559 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4560 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in action_store()
4561 mddev_lock(mddev) == 0) { in action_store()
4563 if (mddev->sync_thread) { in action_store()
4564 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in action_store()
4565 md_reap_sync_thread(mddev); in action_store()
4567 mddev_unlock(mddev); in action_store()
4569 } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in action_store()
4572 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4574 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4575 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in action_store()
4578 if (mddev->pers->start_reshape == NULL) in action_store()
4580 err = mddev_lock(mddev); in action_store()
4582 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in action_store()
4585 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4586 err = mddev->pers->start_reshape(mddev); in action_store()
4588 mddev_unlock(mddev); in action_store()
4592 sysfs_notify(&mddev->kobj, NULL, "degraded"); in action_store()
4595 set_bit(MD_RECOVERY_CHECK, &mddev->recovery); in action_store()
4598 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in action_store()
4599 set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in action_store()
4600 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); in action_store()
4602 if (mddev->ro == 2) { in action_store()
4606 mddev->ro = 0; in action_store()
4607 md_wakeup_thread(mddev->sync_thread); in action_store()
4609 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in action_store()
4610 md_wakeup_thread(mddev->thread); in action_store()
4611 sysfs_notify_dirent_safe(mddev->sysfs_action); in action_store()
4619 last_sync_action_show(struct mddev *mddev, char *page) in last_sync_action_show() argument
4621 return sprintf(page, "%s\n", mddev->last_sync_action); in last_sync_action_show()
4627 mismatch_cnt_show(struct mddev *mddev, char *page) in mismatch_cnt_show() argument
4631 atomic64_read(&mddev->resync_mismatches)); in mismatch_cnt_show()
4637 sync_min_show(struct mddev *mddev, char *page) in sync_min_show() argument
4639 return sprintf(page, "%d (%s)\n", speed_min(mddev), in sync_min_show()
4640 mddev->sync_speed_min ? "local": "system"); in sync_min_show()
4644 sync_min_store(struct mddev *mddev, const char *buf, size_t len) in sync_min_store() argument
4658 mddev->sync_speed_min = min; in sync_min_store()
4666 sync_max_show(struct mddev *mddev, char *page) in sync_max_show() argument
4668 return sprintf(page, "%d (%s)\n", speed_max(mddev), in sync_max_show()
4669 mddev->sync_speed_max ? "local": "system"); in sync_max_show()
4673 sync_max_store(struct mddev *mddev, const char *buf, size_t len) in sync_max_store() argument
4687 mddev->sync_speed_max = max; in sync_max_store()
4695 degraded_show(struct mddev *mddev, char *page) in degraded_show() argument
4697 return sprintf(page, "%d\n", mddev->degraded); in degraded_show()
4702 sync_force_parallel_show(struct mddev *mddev, char *page) in sync_force_parallel_show() argument
4704 return sprintf(page, "%d\n", mddev->parallel_resync); in sync_force_parallel_show()
4708 sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len) in sync_force_parallel_store() argument
4718 mddev->parallel_resync = n; in sync_force_parallel_store()
4720 if (mddev->sync_thread) in sync_force_parallel_store()
4732 sync_speed_show(struct mddev *mddev, char *page) in sync_speed_show() argument
4735 if (mddev->curr_resync == 0) in sync_speed_show()
4737 resync = mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active); in sync_speed_show()
4738 dt = (jiffies - mddev->resync_mark) / HZ; in sync_speed_show()
4740 db = resync - mddev->resync_mark_cnt; in sync_speed_show()
4747 sync_completed_show(struct mddev *mddev, char *page) in sync_completed_show() argument
4751 if (!test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in sync_completed_show()
4754 if (mddev->curr_resync == 1 || in sync_completed_show()
4755 mddev->curr_resync == 2) in sync_completed_show()
4758 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in sync_completed_show()
4759 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in sync_completed_show()
4760 max_sectors = mddev->resync_max_sectors; in sync_completed_show()
4762 max_sectors = mddev->dev_sectors; in sync_completed_show()
4764 resync = mddev->curr_resync_completed; in sync_completed_show()
4772 min_sync_show(struct mddev *mddev, char *page) in min_sync_show() argument
4775 (unsigned long long)mddev->resync_min); in min_sync_show()
4778 min_sync_store(struct mddev *mddev, const char *buf, size_t len) in min_sync_store() argument
4786 spin_lock(&mddev->lock); in min_sync_store()
4788 if (min > mddev->resync_max) in min_sync_store()
4792 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in min_sync_store()
4796 mddev->resync_min = round_down(min, 8); in min_sync_store()
4800 spin_unlock(&mddev->lock); in min_sync_store()
4808 max_sync_show(struct mddev *mddev, char *page) in max_sync_show() argument
4810 if (mddev->resync_max == MaxSector) in max_sync_show()
4814 (unsigned long long)mddev->resync_max); in max_sync_show()
4817 max_sync_store(struct mddev *mddev, const char *buf, size_t len) in max_sync_store() argument
4820 spin_lock(&mddev->lock); in max_sync_store()
4822 mddev->resync_max = MaxSector; in max_sync_store()
4830 if (max < mddev->resync_min) in max_sync_store()
4834 if (max < mddev->resync_max && in max_sync_store()
4835 mddev->ro == 0 && in max_sync_store()
4836 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in max_sync_store()
4840 chunk = mddev->chunk_sectors; in max_sync_store()
4848 mddev->resync_max = max; in max_sync_store()
4850 wake_up(&mddev->recovery_wait); in max_sync_store()
4853 spin_unlock(&mddev->lock); in max_sync_store()
4861 suspend_lo_show(struct mddev *mddev, char *page) in suspend_lo_show() argument
4863 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo); in suspend_lo_show()
4867 suspend_lo_store(struct mddev *mddev, const char *buf, size_t len) in suspend_lo_store() argument
4878 err = mddev_lock(mddev); in suspend_lo_store()
4882 if (mddev->pers == NULL || in suspend_lo_store()
4883 mddev->pers->quiesce == NULL) in suspend_lo_store()
4885 mddev_suspend(mddev); in suspend_lo_store()
4886 mddev->suspend_lo = new; in suspend_lo_store()
4887 mddev_resume(mddev); in suspend_lo_store()
4891 mddev_unlock(mddev); in suspend_lo_store()
4898 suspend_hi_show(struct mddev *mddev, char *page) in suspend_hi_show() argument
4900 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi); in suspend_hi_show()
4904 suspend_hi_store(struct mddev *mddev, const char *buf, size_t len) in suspend_hi_store() argument
4915 err = mddev_lock(mddev); in suspend_hi_store()
4919 if (mddev->pers == NULL) in suspend_hi_store()
4922 mddev_suspend(mddev); in suspend_hi_store()
4923 mddev->suspend_hi = new; in suspend_hi_store()
4924 mddev_resume(mddev); in suspend_hi_store()
4928 mddev_unlock(mddev); in suspend_hi_store()
4935 reshape_position_show(struct mddev *mddev, char *page) in reshape_position_show() argument
4937 if (mddev->reshape_position != MaxSector) in reshape_position_show()
4939 (unsigned long long)mddev->reshape_position); in reshape_position_show()
4945 reshape_position_store(struct mddev *mddev, const char *buf, size_t len) in reshape_position_store() argument
4956 err = mddev_lock(mddev); in reshape_position_store()
4960 if (mddev->pers) in reshape_position_store()
4962 mddev->reshape_position = new; in reshape_position_store()
4963 mddev->delta_disks = 0; in reshape_position_store()
4964 mddev->reshape_backwards = 0; in reshape_position_store()
4965 mddev->new_level = mddev->level; in reshape_position_store()
4966 mddev->new_layout = mddev->layout; in reshape_position_store()
4967 mddev->new_chunk_sectors = mddev->chunk_sectors; in reshape_position_store()
4968 rdev_for_each(rdev, mddev) in reshape_position_store()
4972 mddev_unlock(mddev); in reshape_position_store()
4981 reshape_direction_show(struct mddev *mddev, char *page) in reshape_direction_show() argument
4984 mddev->reshape_backwards ? "backwards" : "forwards"); in reshape_direction_show()
4988 reshape_direction_store(struct mddev *mddev, const char *buf, size_t len) in reshape_direction_store() argument
4999 if (mddev->reshape_backwards == backwards) in reshape_direction_store()
5002 err = mddev_lock(mddev); in reshape_direction_store()
5006 if (mddev->delta_disks) in reshape_direction_store()
5008 else if (mddev->persistent && in reshape_direction_store()
5009 mddev->major_version == 0) in reshape_direction_store()
5012 mddev->reshape_backwards = backwards; in reshape_direction_store()
5013 mddev_unlock(mddev); in reshape_direction_store()
5022 array_size_show(struct mddev *mddev, char *page) in array_size_show() argument
5024 if (mddev->external_size) in array_size_show()
5026 (unsigned long long)mddev->array_sectors/2); in array_size_show()
5032 array_size_store(struct mddev *mddev, const char *buf, size_t len) in array_size_store() argument
5037 err = mddev_lock(mddev); in array_size_store()
5042 if (mddev_is_clustered(mddev)) { in array_size_store()
5043 mddev_unlock(mddev); in array_size_store()
5048 if (mddev->pers) in array_size_store()
5049 sectors = mddev->pers->size(mddev, 0, 0); in array_size_store()
5051 sectors = mddev->array_sectors; in array_size_store()
5053 mddev->external_size = 0; in array_size_store()
5057 else if (mddev->pers && mddev->pers->size(mddev, 0, 0) < sectors) in array_size_store()
5060 mddev->external_size = 1; in array_size_store()
5064 mddev->array_sectors = sectors; in array_size_store()
5065 if (mddev->pers) { in array_size_store()
5066 set_capacity(mddev->gendisk, mddev->array_sectors); in array_size_store()
5067 revalidate_disk(mddev->gendisk); in array_size_store()
5070 mddev_unlock(mddev); in array_size_store()
5079 consistency_policy_show(struct mddev *mddev, char *page) in consistency_policy_show() argument
5083 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) { in consistency_policy_show()
5085 } else if (test_bit(MD_HAS_PPL, &mddev->flags)) { in consistency_policy_show()
5087 } else if (mddev->bitmap) { in consistency_policy_show()
5089 } else if (mddev->pers) { in consistency_policy_show()
5090 if (mddev->pers->sync_request) in consistency_policy_show()
5102 consistency_policy_store(struct mddev *mddev, const char *buf, size_t len) in consistency_policy_store() argument
5106 if (mddev->pers) { in consistency_policy_store()
5107 if (mddev->pers->change_consistency_policy) in consistency_policy_store()
5108 err = mddev->pers->change_consistency_policy(mddev, buf); in consistency_policy_store()
5111 } else if (mddev->external && strncmp(buf, "ppl", 3) == 0) { in consistency_policy_store()
5112 set_bit(MD_HAS_PPL, &mddev->flags); in consistency_policy_store()
5169 struct mddev *mddev = container_of(kobj, struct mddev, kobj); in md_attr_show() local
5175 if (list_empty(&mddev->all_mddevs)) { in md_attr_show()
5179 mddev_get(mddev); in md_attr_show()
5182 rv = entry->show(mddev, page); in md_attr_show()
5183 mddev_put(mddev); in md_attr_show()
5192 struct mddev *mddev = container_of(kobj, struct mddev, kobj); in md_attr_store() local
5200 if (list_empty(&mddev->all_mddevs)) { in md_attr_store()
5204 mddev_get(mddev); in md_attr_store()
5206 rv = entry->store(mddev, page, length); in md_attr_store()
5207 mddev_put(mddev); in md_attr_store()
5213 struct mddev *mddev = container_of(ko, struct mddev, kobj); in md_free() local
5215 if (mddev->sysfs_state) in md_free()
5216 sysfs_put(mddev->sysfs_state); in md_free()
5218 if (mddev->gendisk) in md_free()
5219 del_gendisk(mddev->gendisk); in md_free()
5220 if (mddev->queue) in md_free()
5221 blk_cleanup_queue(mddev->queue); in md_free()
5222 if (mddev->gendisk) in md_free()
5223 put_disk(mddev->gendisk); in md_free()
5224 percpu_ref_exit(&mddev->writes_pending); in md_free()
5226 bioset_exit(&mddev->bio_set); in md_free()
5227 bioset_exit(&mddev->sync_set); in md_free()
5228 kfree(mddev); in md_free()
5245 struct mddev *mddev = container_of(ws, struct mddev, del_work); in mddev_delayed_delete() local
5247 sysfs_remove_group(&mddev->kobj, &md_bitmap_group); in mddev_delayed_delete()
5248 kobject_del(&mddev->kobj); in mddev_delayed_delete()
5249 kobject_put(&mddev->kobj); in mddev_delayed_delete()
5254 int mddev_init_writes_pending(struct mddev *mddev) in mddev_init_writes_pending() argument
5256 if (mddev->writes_pending.percpu_count_ptr) in mddev_init_writes_pending()
5258 if (percpu_ref_init(&mddev->writes_pending, no_op, 0, GFP_KERNEL) < 0) in mddev_init_writes_pending()
5261 percpu_ref_put(&mddev->writes_pending); in mddev_init_writes_pending()
5278 struct mddev *mddev = mddev_find(dev); in md_alloc() local
5285 if (!mddev) in md_alloc()
5288 partitioned = (MAJOR(mddev->unit) != MD_MAJOR); in md_alloc()
5290 unit = MINOR(mddev->unit) >> shift; in md_alloc()
5299 if (mddev->gendisk) in md_alloc()
5305 struct mddev *mddev2; in md_alloc()
5320 mddev->hold_active = UNTIL_STOP; in md_alloc()
5323 mddev->queue = blk_alloc_queue(GFP_KERNEL); in md_alloc()
5324 if (!mddev->queue) in md_alloc()
5326 mddev->queue->queuedata = mddev; in md_alloc()
5328 blk_queue_make_request(mddev->queue, md_make_request); in md_alloc()
5329 blk_set_stacking_limits(&mddev->queue->limits); in md_alloc()
5333 blk_cleanup_queue(mddev->queue); in md_alloc()
5334 mddev->queue = NULL; in md_alloc()
5337 disk->major = MAJOR(mddev->unit); in md_alloc()
5346 disk->private_data = mddev; in md_alloc()
5347 disk->queue = mddev->queue; in md_alloc()
5348 blk_queue_write_cache(mddev->queue, true, true); in md_alloc()
5354 mddev->gendisk = disk; in md_alloc()
5358 mutex_lock(&mddev->open_mutex); in md_alloc()
5361 error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md"); in md_alloc()
5370 if (mddev->kobj.sd && in md_alloc()
5371 sysfs_create_group(&mddev->kobj, &md_bitmap_group)) in md_alloc()
5373 mutex_unlock(&mddev->open_mutex); in md_alloc()
5376 if (!error && mddev->kobj.sd) { in md_alloc()
5377 kobject_uevent(&mddev->kobj, KOBJ_ADD); in md_alloc()
5378 mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state"); in md_alloc()
5380 mddev_put(mddev); in md_alloc()
5422 struct mddev *mddev = from_timer(mddev, t, safemode_timer); in md_safemode_timeout() local
5424 mddev->safemode = 1; in md_safemode_timeout()
5425 if (mddev->external) in md_safemode_timeout()
5426 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_safemode_timeout()
5428 md_wakeup_thread(mddev->thread); in md_safemode_timeout()
5433 int md_run(struct mddev *mddev) in md_run() argument
5439 if (list_empty(&mddev->disks)) in md_run()
5443 if (mddev->pers) in md_run()
5446 if (mddev->sysfs_active) in md_run()
5452 if (!mddev->raid_disks) { in md_run()
5453 if (!mddev->persistent) in md_run()
5455 analyze_sbs(mddev); in md_run()
5458 if (mddev->level != LEVEL_NONE) in md_run()
5459 request_module("md-level-%d", mddev->level); in md_run()
5460 else if (mddev->clevel[0]) in md_run()
5461 request_module("md-%s", mddev->clevel); in md_run()
5468 mddev->has_superblocks = false; in md_run()
5469 rdev_for_each(rdev, mddev) { in md_run()
5474 if (mddev->ro != 1 && in md_run()
5477 mddev->ro = 1; in md_run()
5478 if (mddev->gendisk) in md_run()
5479 set_disk_ro(mddev->gendisk, 1); in md_run()
5483 mddev->has_superblocks = true; in md_run()
5492 if (mddev->dev_sectors && in md_run()
5493 rdev->data_offset + mddev->dev_sectors in md_run()
5496 mdname(mddev)); in md_run()
5503 mdname(mddev)); in md_run()
5510 if (!bioset_initialized(&mddev->bio_set)) { in md_run()
5511 err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); in md_run()
5515 if (!bioset_initialized(&mddev->sync_set)) { in md_run()
5516 err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS); in md_run()
5520 if (mddev->flush_pool == NULL) { in md_run()
5521 mddev->flush_pool = mempool_create(NR_FLUSH_INFOS, flush_info_alloc, in md_run()
5522 flush_info_free, mddev); in md_run()
5523 if (!mddev->flush_pool) { in md_run()
5528 if (mddev->flush_bio_pool == NULL) { in md_run()
5529 mddev->flush_bio_pool = mempool_create(NR_FLUSH_BIOS, flush_bio_alloc, in md_run()
5530 flush_bio_free, mddev); in md_run()
5531 if (!mddev->flush_bio_pool) { in md_run()
5538 pers = find_pers(mddev->level, mddev->clevel); in md_run()
5541 if (mddev->level != LEVEL_NONE) in md_run()
5543 mddev->level); in md_run()
5546 mddev->clevel); in md_run()
5551 if (mddev->level != pers->level) { in md_run()
5552 mddev->level = pers->level; in md_run()
5553 mddev->new_level = pers->level; in md_run()
5555 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); in md_run()
5557 if (mddev->reshape_position != MaxSector && in md_run()
5573 rdev_for_each(rdev, mddev) in md_run()
5574 rdev_for_each(rdev2, mddev) { in md_run()
5579 mdname(mddev), in md_run()
5590 mddev->recovery = 0; in md_run()
5592 mddev->resync_max_sectors = mddev->dev_sectors; in md_run()
5594 mddev->ok_start_degraded = start_dirty_degraded; in md_run()
5596 if (start_readonly && mddev->ro == 0) in md_run()
5597 mddev->ro = 2; /* read-only, but switch on first write */ in md_run()
5599 err = pers->run(mddev); in md_run()
5602 else if (pers->size(mddev, 0, 0) < mddev->array_sectors) { in md_run()
5603 WARN_ONCE(!mddev->external_size, in md_run()
5607 (unsigned long long)mddev->array_sectors / 2, in md_run()
5608 (unsigned long long)pers->size(mddev, 0, 0) / 2); in md_run()
5612 (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { in md_run()
5615 bitmap = md_bitmap_create(mddev, -1); in md_run()
5619 mdname(mddev), err); in md_run()
5621 mddev->bitmap = bitmap; in md_run()
5625 mddev_detach(mddev); in md_run()
5626 if (mddev->private) in md_run()
5627 pers->free(mddev, mddev->private); in md_run()
5628 mddev->private = NULL; in md_run()
5630 md_bitmap_destroy(mddev); in md_run()
5633 if (mddev->queue) { in md_run()
5636 rdev_for_each(rdev, mddev) { in md_run()
5643 if (mddev->degraded) in md_run()
5646 blk_queue_flag_set(QUEUE_FLAG_NONROT, mddev->queue); in md_run()
5648 blk_queue_flag_clear(QUEUE_FLAG_NONROT, mddev->queue); in md_run()
5649 mddev->queue->backing_dev_info->congested_data = mddev; in md_run()
5650 mddev->queue->backing_dev_info->congested_fn = md_congested; in md_run()
5653 if (mddev->kobj.sd && in md_run()
5654 sysfs_create_group(&mddev->kobj, &md_redundancy_group)) in md_run()
5656 mdname(mddev)); in md_run()
5657 mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action"); in md_run()
5658 } else if (mddev->ro == 2) /* auto-readonly not meaningful */ in md_run()
5659 mddev->ro = 0; in md_run()
5661 atomic_set(&mddev->max_corr_read_errors, in md_run()
5663 mddev->safemode = 0; in md_run()
5664 if (mddev_is_clustered(mddev)) in md_run()
5665 mddev->safemode_delay = 0; in md_run()
5667 mddev->safemode_delay = (200 * HZ)/1000 +1; /* 200 msec delay */ in md_run()
5668 mddev->in_sync = 1; in md_run()
5670 spin_lock(&mddev->lock); in md_run()
5671 mddev->pers = pers; in md_run()
5672 spin_unlock(&mddev->lock); in md_run()
5673 rdev_for_each(rdev, mddev) in md_run()
5675 if (sysfs_link_rdev(mddev, rdev)) in md_run()
5678 if (mddev->degraded && !mddev->ro) in md_run()
5682 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_run()
5683 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_run()
5685 if (mddev->sb_flags) in md_run()
5686 md_update_sb(mddev, 0); in md_run()
5688 md_new_event(mddev); in md_run()
5689 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_run()
5690 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_run()
5691 sysfs_notify(&mddev->kobj, NULL, "degraded"); in md_run()
5695 if (mddev->flush_bio_pool) { in md_run()
5696 mempool_destroy(mddev->flush_bio_pool); in md_run()
5697 mddev->flush_bio_pool = NULL; in md_run()
5699 if (mddev->flush_pool){ in md_run()
5700 mempool_destroy(mddev->flush_pool); in md_run()
5701 mddev->flush_pool = NULL; in md_run()
5708 static int do_md_run(struct mddev *mddev) in do_md_run() argument
5712 err = md_run(mddev); in do_md_run()
5715 err = md_bitmap_load(mddev); in do_md_run()
5717 md_bitmap_destroy(mddev); in do_md_run()
5721 if (mddev_is_clustered(mddev)) in do_md_run()
5722 md_allow_write(mddev); in do_md_run()
5725 md_start(mddev); in do_md_run()
5727 md_wakeup_thread(mddev->thread); in do_md_run()
5728 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ in do_md_run()
5730 set_capacity(mddev->gendisk, mddev->array_sectors); in do_md_run()
5731 revalidate_disk(mddev->gendisk); in do_md_run()
5732 mddev->changed = 1; in do_md_run()
5733 kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); in do_md_run()
5738 int md_start(struct mddev *mddev) in md_start() argument
5742 if (mddev->pers->start) { in md_start()
5743 set_bit(MD_RECOVERY_WAIT, &mddev->recovery); in md_start()
5744 md_wakeup_thread(mddev->thread); in md_start()
5745 ret = mddev->pers->start(mddev); in md_start()
5746 clear_bit(MD_RECOVERY_WAIT, &mddev->recovery); in md_start()
5747 md_wakeup_thread(mddev->sync_thread); in md_start()
5753 static int restart_array(struct mddev *mddev) in restart_array() argument
5755 struct gendisk *disk = mddev->gendisk; in restart_array()
5761 if (list_empty(&mddev->disks)) in restart_array()
5763 if (!mddev->pers) in restart_array()
5765 if (!mddev->ro) in restart_array()
5769 rdev_for_each_rcu(rdev, mddev) { in restart_array()
5777 if (test_bit(MD_HAS_JOURNAL, &mddev->flags) && !has_journal) in restart_array()
5783 mddev->safemode = 0; in restart_array()
5784 mddev->ro = 0; in restart_array()
5786 pr_debug("md: %s switched to read-write mode.\n", mdname(mddev)); in restart_array()
5788 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in restart_array()
5789 md_wakeup_thread(mddev->thread); in restart_array()
5790 md_wakeup_thread(mddev->sync_thread); in restart_array()
5791 sysfs_notify_dirent_safe(mddev->sysfs_state); in restart_array()
5795 static void md_clean(struct mddev *mddev) in md_clean() argument
5797 mddev->array_sectors = 0; in md_clean()
5798 mddev->external_size = 0; in md_clean()
5799 mddev->dev_sectors = 0; in md_clean()
5800 mddev->raid_disks = 0; in md_clean()
5801 mddev->recovery_cp = 0; in md_clean()
5802 mddev->resync_min = 0; in md_clean()
5803 mddev->resync_max = MaxSector; in md_clean()
5804 mddev->reshape_position = MaxSector; in md_clean()
5805 mddev->external = 0; in md_clean()
5806 mddev->persistent = 0; in md_clean()
5807 mddev->level = LEVEL_NONE; in md_clean()
5808 mddev->clevel[0] = 0; in md_clean()
5809 mddev->flags = 0; in md_clean()
5810 mddev->sb_flags = 0; in md_clean()
5811 mddev->ro = 0; in md_clean()
5812 mddev->metadata_type[0] = 0; in md_clean()
5813 mddev->chunk_sectors = 0; in md_clean()
5814 mddev->ctime = mddev->utime = 0; in md_clean()
5815 mddev->layout = 0; in md_clean()
5816 mddev->max_disks = 0; in md_clean()
5817 mddev->events = 0; in md_clean()
5818 mddev->can_decrease_events = 0; in md_clean()
5819 mddev->delta_disks = 0; in md_clean()
5820 mddev->reshape_backwards = 0; in md_clean()
5821 mddev->new_level = LEVEL_NONE; in md_clean()
5822 mddev->new_layout = 0; in md_clean()
5823 mddev->new_chunk_sectors = 0; in md_clean()
5824 mddev->curr_resync = 0; in md_clean()
5825 atomic64_set(&mddev->resync_mismatches, 0); in md_clean()
5826 mddev->suspend_lo = mddev->suspend_hi = 0; in md_clean()
5827 mddev->sync_speed_min = mddev->sync_speed_max = 0; in md_clean()
5828 mddev->recovery = 0; in md_clean()
5829 mddev->in_sync = 0; in md_clean()
5830 mddev->changed = 0; in md_clean()
5831 mddev->degraded = 0; in md_clean()
5832 mddev->safemode = 0; in md_clean()
5833 mddev->private = NULL; in md_clean()
5834 mddev->cluster_info = NULL; in md_clean()
5835 mddev->bitmap_info.offset = 0; in md_clean()
5836 mddev->bitmap_info.default_offset = 0; in md_clean()
5837 mddev->bitmap_info.default_space = 0; in md_clean()
5838 mddev->bitmap_info.chunksize = 0; in md_clean()
5839 mddev->bitmap_info.daemon_sleep = 0; in md_clean()
5840 mddev->bitmap_info.max_write_behind = 0; in md_clean()
5841 mddev->bitmap_info.nodes = 0; in md_clean()
5844 static void __md_stop_writes(struct mddev *mddev) in __md_stop_writes() argument
5846 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in __md_stop_writes()
5848 if (mddev->sync_thread) { in __md_stop_writes()
5849 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in __md_stop_writes()
5850 md_reap_sync_thread(mddev); in __md_stop_writes()
5853 del_timer_sync(&mddev->safemode_timer); in __md_stop_writes()
5855 if (mddev->pers && mddev->pers->quiesce) { in __md_stop_writes()
5856 mddev->pers->quiesce(mddev, 1); in __md_stop_writes()
5857 mddev->pers->quiesce(mddev, 0); in __md_stop_writes()
5859 md_bitmap_flush(mddev); in __md_stop_writes()
5861 if (mddev->ro == 0 && in __md_stop_writes()
5862 ((!mddev->in_sync && !mddev_is_clustered(mddev)) || in __md_stop_writes()
5863 mddev->sb_flags)) { in __md_stop_writes()
5865 if (!mddev_is_clustered(mddev)) in __md_stop_writes()
5866 mddev->in_sync = 1; in __md_stop_writes()
5867 md_update_sb(mddev, 1); in __md_stop_writes()
5871 void md_stop_writes(struct mddev *mddev) in md_stop_writes() argument
5873 mddev_lock_nointr(mddev); in md_stop_writes()
5874 __md_stop_writes(mddev); in md_stop_writes()
5875 mddev_unlock(mddev); in md_stop_writes()
5879 static void mddev_detach(struct mddev *mddev) in mddev_detach() argument
5881 md_bitmap_wait_behind_writes(mddev); in mddev_detach()
5882 if (mddev->pers && mddev->pers->quiesce) { in mddev_detach()
5883 mddev->pers->quiesce(mddev, 1); in mddev_detach()
5884 mddev->pers->quiesce(mddev, 0); in mddev_detach()
5886 md_unregister_thread(&mddev->thread); in mddev_detach()
5887 if (mddev->queue) in mddev_detach()
5888 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ in mddev_detach()
5891 static void __md_stop(struct mddev *mddev) in __md_stop() argument
5893 struct md_personality *pers = mddev->pers; in __md_stop()
5894 md_bitmap_destroy(mddev); in __md_stop()
5895 mddev_detach(mddev); in __md_stop()
5898 spin_lock(&mddev->lock); in __md_stop()
5899 mddev->pers = NULL; in __md_stop()
5900 spin_unlock(&mddev->lock); in __md_stop()
5901 pers->free(mddev, mddev->private); in __md_stop()
5902 mddev->private = NULL; in __md_stop()
5903 if (pers->sync_request && mddev->to_remove == NULL) in __md_stop()
5904 mddev->to_remove = &md_redundancy_group; in __md_stop()
5906 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in __md_stop()
5909 void md_stop(struct mddev *mddev) in md_stop() argument
5914 __md_stop(mddev); in md_stop()
5915 if (mddev->flush_bio_pool) { in md_stop()
5916 mempool_destroy(mddev->flush_bio_pool); in md_stop()
5917 mddev->flush_bio_pool = NULL; in md_stop()
5919 if (mddev->flush_pool) { in md_stop()
5920 mempool_destroy(mddev->flush_pool); in md_stop()
5921 mddev->flush_pool = NULL; in md_stop()
5923 bioset_exit(&mddev->bio_set); in md_stop()
5924 bioset_exit(&mddev->sync_set); in md_stop()
5929 static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) in md_set_readonly() argument
5934 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { in md_set_readonly()
5936 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
5937 md_wakeup_thread(mddev->thread); in md_set_readonly()
5939 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in md_set_readonly()
5940 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_set_readonly()
5941 if (mddev->sync_thread) in md_set_readonly()
5944 wake_up_process(mddev->sync_thread->tsk); in md_set_readonly()
5946 if (mddev->external && test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) in md_set_readonly()
5948 mddev_unlock(mddev); in md_set_readonly()
5950 &mddev->recovery)); in md_set_readonly()
5951 wait_event(mddev->sb_wait, in md_set_readonly()
5952 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_set_readonly()
5953 mddev_lock_nointr(mddev); in md_set_readonly()
5955 mutex_lock(&mddev->open_mutex); in md_set_readonly()
5956 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || in md_set_readonly()
5957 mddev->sync_thread || in md_set_readonly()
5958 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { in md_set_readonly()
5959 pr_warn("md: %s still in use.\n",mdname(mddev)); in md_set_readonly()
5961 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
5962 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_set_readonly()
5963 md_wakeup_thread(mddev->thread); in md_set_readonly()
5968 if (mddev->pers) { in md_set_readonly()
5969 __md_stop_writes(mddev); in md_set_readonly()
5972 if (mddev->ro==1) in md_set_readonly()
5974 mddev->ro = 1; in md_set_readonly()
5975 set_disk_ro(mddev->gendisk, 1); in md_set_readonly()
5976 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in md_set_readonly()
5977 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_set_readonly()
5978 md_wakeup_thread(mddev->thread); in md_set_readonly()
5979 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_set_readonly()
5983 mutex_unlock(&mddev->open_mutex); in md_set_readonly()
5991 static int do_md_stop(struct mddev *mddev, int mode, in do_md_stop() argument
5994 struct gendisk *disk = mddev->gendisk; in do_md_stop()
5998 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { in do_md_stop()
6000 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in do_md_stop()
6001 md_wakeup_thread(mddev->thread); in do_md_stop()
6003 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in do_md_stop()
6004 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in do_md_stop()
6005 if (mddev->sync_thread) in do_md_stop()
6008 wake_up_process(mddev->sync_thread->tsk); in do_md_stop()
6010 mddev_unlock(mddev); in do_md_stop()
6011 wait_event(resync_wait, (mddev->sync_thread == NULL && in do_md_stop()
6013 &mddev->recovery))); in do_md_stop()
6014 mddev_lock_nointr(mddev); in do_md_stop()
6016 mutex_lock(&mddev->open_mutex); in do_md_stop()
6017 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || in do_md_stop()
6018 mddev->sysfs_active || in do_md_stop()
6019 mddev->sync_thread || in do_md_stop()
6020 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { in do_md_stop()
6021 pr_warn("md: %s still in use.\n",mdname(mddev)); in do_md_stop()
6022 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6024 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); in do_md_stop()
6025 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in do_md_stop()
6026 md_wakeup_thread(mddev->thread); in do_md_stop()
6030 if (mddev->pers) { in do_md_stop()
6031 if (mddev->ro) in do_md_stop()
6034 __md_stop_writes(mddev); in do_md_stop()
6035 __md_stop(mddev); in do_md_stop()
6036 mddev->queue->backing_dev_info->congested_fn = NULL; in do_md_stop()
6039 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_stop()
6041 rdev_for_each(rdev, mddev) in do_md_stop()
6043 sysfs_unlink_rdev(mddev, rdev); in do_md_stop()
6046 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6047 mddev->changed = 1; in do_md_stop()
6050 if (mddev->ro) in do_md_stop()
6051 mddev->ro = 0; in do_md_stop()
6053 mutex_unlock(&mddev->open_mutex); in do_md_stop()
6058 pr_info("md: %s stopped.\n", mdname(mddev)); in do_md_stop()
6060 if (mddev->bitmap_info.file) { in do_md_stop()
6061 struct file *f = mddev->bitmap_info.file; in do_md_stop()
6062 spin_lock(&mddev->lock); in do_md_stop()
6063 mddev->bitmap_info.file = NULL; in do_md_stop()
6064 spin_unlock(&mddev->lock); in do_md_stop()
6067 mddev->bitmap_info.offset = 0; in do_md_stop()
6069 export_array(mddev); in do_md_stop()
6071 md_clean(mddev); in do_md_stop()
6072 if (mddev->hold_active == UNTIL_STOP) in do_md_stop()
6073 mddev->hold_active = 0; in do_md_stop()
6075 md_new_event(mddev); in do_md_stop()
6076 sysfs_notify_dirent_safe(mddev->sysfs_state); in do_md_stop()
6081 static void autorun_array(struct mddev *mddev) in autorun_array() argument
6086 if (list_empty(&mddev->disks)) in autorun_array()
6091 rdev_for_each(rdev, mddev) { in autorun_array()
6097 err = do_md_run(mddev); in autorun_array()
6100 do_md_stop(mddev, 0, NULL); in autorun_array()
6119 struct mddev *mddev; in autorun_devices() local
6158 mddev = mddev_find(dev); in autorun_devices()
6159 if (!mddev || !mddev->gendisk) { in autorun_devices()
6160 if (mddev) in autorun_devices()
6161 mddev_put(mddev); in autorun_devices()
6164 if (mddev_lock(mddev)) in autorun_devices()
6165 pr_warn("md: %s locked, cannot run\n", mdname(mddev)); in autorun_devices()
6166 else if (mddev->raid_disks || mddev->major_version in autorun_devices()
6167 || !list_empty(&mddev->disks)) { in autorun_devices()
6169 mdname(mddev), bdevname(rdev0->bdev,b)); in autorun_devices()
6170 mddev_unlock(mddev); in autorun_devices()
6172 pr_debug("md: created %s\n", mdname(mddev)); in autorun_devices()
6173 mddev->persistent = 1; in autorun_devices()
6176 if (bind_rdev_to_array(rdev, mddev)) in autorun_devices()
6179 autorun_array(mddev); in autorun_devices()
6180 mddev_unlock(mddev); in autorun_devices()
6189 mddev_put(mddev); in autorun_devices()
6209 static int get_array_info(struct mddev *mddev, void __user *arg) in get_array_info() argument
6217 rdev_for_each_rcu(rdev, mddev) { in get_array_info()
6234 info.major_version = mddev->major_version; in get_array_info()
6235 info.minor_version = mddev->minor_version; in get_array_info()
6237 info.ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX); in get_array_info()
6238 info.level = mddev->level; in get_array_info()
6239 info.size = mddev->dev_sectors / 2; in get_array_info()
6240 if (info.size != mddev->dev_sectors / 2) /* overflow */ in get_array_info()
6243 info.raid_disks = mddev->raid_disks; in get_array_info()
6244 info.md_minor = mddev->md_minor; in get_array_info()
6245 info.not_persistent= !mddev->persistent; in get_array_info()
6247 info.utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX); in get_array_info()
6249 if (mddev->in_sync) in get_array_info()
6251 if (mddev->bitmap && mddev->bitmap_info.offset) in get_array_info()
6253 if (mddev_is_clustered(mddev)) in get_array_info()
6260 info.layout = mddev->layout; in get_array_info()
6261 info.chunk_size = mddev->chunk_sectors << 9; in get_array_info()
6269 static int get_bitmap_file(struct mddev *mddev, void __user * arg) in get_bitmap_file() argument
6280 spin_lock(&mddev->lock); in get_bitmap_file()
6282 if (mddev->bitmap_info.file) { in get_bitmap_file()
6283 ptr = file_path(mddev->bitmap_info.file, file->pathname, in get_bitmap_file()
6291 spin_unlock(&mddev->lock); in get_bitmap_file()
6301 static int get_disk_info(struct mddev *mddev, void __user * arg) in get_disk_info() argument
6310 rdev = md_find_rdev_nr_rcu(mddev, info.number); in get_disk_info()
6341 static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info) in add_new_disk() argument
6347 if (mddev_is_clustered(mddev) && in add_new_disk()
6350 mdname(mddev)); in add_new_disk()
6357 if (!mddev->raid_disks) { in add_new_disk()
6360 rdev = md_import_device(dev, mddev->major_version, mddev->minor_version); in add_new_disk()
6366 if (!list_empty(&mddev->disks)) { in add_new_disk()
6368 = list_entry(mddev->disks.next, in add_new_disk()
6370 err = super_types[mddev->major_version] in add_new_disk()
6371 .load_super(rdev, rdev0, mddev->minor_version); in add_new_disk()
6380 err = bind_rdev_to_array(rdev, mddev); in add_new_disk()
6391 if (mddev->pers) { in add_new_disk()
6393 if (!mddev->pers->hot_add_disk) { in add_new_disk()
6395 mdname(mddev)); in add_new_disk()
6398 if (mddev->persistent) in add_new_disk()
6399 rdev = md_import_device(dev, mddev->major_version, in add_new_disk()
6400 mddev->minor_version); in add_new_disk()
6409 if (!mddev->persistent) { in add_new_disk()
6411 info->raid_disk < mddev->raid_disks) { in add_new_disk()
6419 super_types[mddev->major_version]. in add_new_disk()
6420 validate_super(mddev, rdev); in add_new_disk()
6445 rdev_for_each(rdev2, mddev) { in add_new_disk()
6451 if (has_journal || mddev->bitmap) { in add_new_disk()
6460 if (mddev_is_clustered(mddev)) { in add_new_disk()
6465 err = md_cluster_ops->add_new_disk(mddev, rdev); in add_new_disk()
6474 err = bind_rdev_to_array(rdev, mddev); in add_new_disk()
6479 if (mddev_is_clustered(mddev)) { in add_new_disk()
6482 err = md_cluster_ops->new_disk_ack(mddev, in add_new_disk()
6489 md_cluster_ops->add_new_disk_cancel(mddev); in add_new_disk()
6503 if (mddev->major_version != 0) { in add_new_disk()
6504 pr_warn("%s: ADD_NEW_DISK not supported\n", mdname(mddev)); in add_new_disk()
6517 if (info->raid_disk < mddev->raid_disks) in add_new_disk()
6522 if (rdev->raid_disk < mddev->raid_disks) in add_new_disk()
6531 if (!mddev->persistent) { in add_new_disk()
6538 err = bind_rdev_to_array(rdev, mddev); in add_new_disk()
6548 static int hot_remove_disk(struct mddev *mddev, dev_t dev) in hot_remove_disk() argument
6553 if (!mddev->pers) in hot_remove_disk()
6556 rdev = find_rdev(mddev, dev); in hot_remove_disk()
6564 remove_and_add_spares(mddev, rdev); in hot_remove_disk()
6570 if (mddev_is_clustered(mddev)) in hot_remove_disk()
6571 md_cluster_ops->remove_disk(mddev, rdev); in hot_remove_disk()
6574 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in hot_remove_disk()
6575 if (mddev->thread) in hot_remove_disk()
6576 md_wakeup_thread(mddev->thread); in hot_remove_disk()
6578 md_update_sb(mddev, 1); in hot_remove_disk()
6579 md_new_event(mddev); in hot_remove_disk()
6584 bdevname(rdev->bdev,b), mdname(mddev)); in hot_remove_disk()
6588 static int hot_add_disk(struct mddev *mddev, dev_t dev) in hot_add_disk() argument
6594 if (!mddev->pers) in hot_add_disk()
6597 if (mddev->major_version != 0) { in hot_add_disk()
6599 mdname(mddev)); in hot_add_disk()
6602 if (!mddev->pers->hot_add_disk) { in hot_add_disk()
6604 mdname(mddev)); in hot_add_disk()
6615 if (mddev->persistent) in hot_add_disk()
6624 bdevname(rdev->bdev,b), mdname(mddev)); in hot_add_disk()
6632 err = bind_rdev_to_array(rdev, mddev); in hot_add_disk()
6643 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in hot_add_disk()
6644 if (!mddev->thread) in hot_add_disk()
6645 md_update_sb(mddev, 1); in hot_add_disk()
6650 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in hot_add_disk()
6651 md_wakeup_thread(mddev->thread); in hot_add_disk()
6652 md_new_event(mddev); in hot_add_disk()
6660 static int set_bitmap_file(struct mddev *mddev, int fd) in set_bitmap_file() argument
6664 if (mddev->pers) { in set_bitmap_file()
6665 if (!mddev->pers->quiesce || !mddev->thread) in set_bitmap_file()
6667 if (mddev->recovery || mddev->sync_thread) in set_bitmap_file()
6676 if (mddev->bitmap || mddev->bitmap_info.file) in set_bitmap_file()
6682 mdname(mddev)); in set_bitmap_file()
6689 mdname(mddev)); in set_bitmap_file()
6693 mdname(mddev)); in set_bitmap_file()
6697 mdname(mddev)); in set_bitmap_file()
6704 mddev->bitmap_info.file = f; in set_bitmap_file()
6705 mddev->bitmap_info.offset = 0; /* file overrides offset */ in set_bitmap_file()
6706 } else if (mddev->bitmap == NULL) in set_bitmap_file()
6709 if (mddev->pers) { in set_bitmap_file()
6713 bitmap = md_bitmap_create(mddev, -1); in set_bitmap_file()
6714 mddev_suspend(mddev); in set_bitmap_file()
6716 mddev->bitmap = bitmap; in set_bitmap_file()
6717 err = md_bitmap_load(mddev); in set_bitmap_file()
6721 md_bitmap_destroy(mddev); in set_bitmap_file()
6724 mddev_resume(mddev); in set_bitmap_file()
6726 mddev_suspend(mddev); in set_bitmap_file()
6727 md_bitmap_destroy(mddev); in set_bitmap_file()
6728 mddev_resume(mddev); in set_bitmap_file()
6732 struct file *f = mddev->bitmap_info.file; in set_bitmap_file()
6734 spin_lock(&mddev->lock); in set_bitmap_file()
6735 mddev->bitmap_info.file = NULL; in set_bitmap_file()
6736 spin_unlock(&mddev->lock); in set_bitmap_file()
6757 static int set_array_info(struct mddev *mddev, mdu_array_info_t *info) in set_array_info() argument
6770 mddev->major_version = info->major_version; in set_array_info()
6771 mddev->minor_version = info->minor_version; in set_array_info()
6772 mddev->patch_version = info->patch_version; in set_array_info()
6773 mddev->persistent = !info->not_persistent; in set_array_info()
6777 mddev->ctime = ktime_get_real_seconds(); in set_array_info()
6780 mddev->major_version = MD_MAJOR_VERSION; in set_array_info()
6781 mddev->minor_version = MD_MINOR_VERSION; in set_array_info()
6782 mddev->patch_version = MD_PATCHLEVEL_VERSION; in set_array_info()
6783 mddev->ctime = ktime_get_real_seconds(); in set_array_info()
6785 mddev->level = info->level; in set_array_info()
6786 mddev->clevel[0] = 0; in set_array_info()
6787 mddev->dev_sectors = 2 * (sector_t)info->size; in set_array_info()
6788 mddev->raid_disks = info->raid_disks; in set_array_info()
6793 mddev->recovery_cp = MaxSector; in set_array_info()
6795 mddev->recovery_cp = 0; in set_array_info()
6796 mddev->persistent = ! info->not_persistent; in set_array_info()
6797 mddev->external = 0; in set_array_info()
6799 mddev->layout = info->layout; in set_array_info()
6800 mddev->chunk_sectors = info->chunk_size >> 9; in set_array_info()
6802 if (mddev->persistent) { in set_array_info()
6803 mddev->max_disks = MD_SB_DISKS; in set_array_info()
6804 mddev->flags = 0; in set_array_info()
6805 mddev->sb_flags = 0; in set_array_info()
6807 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in set_array_info()
6809 mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9; in set_array_info()
6810 mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9); in set_array_info()
6811 mddev->bitmap_info.offset = 0; in set_array_info()
6813 mddev->reshape_position = MaxSector; in set_array_info()
6818 get_random_bytes(mddev->uuid, 16); in set_array_info()
6820 mddev->new_level = mddev->level; in set_array_info()
6821 mddev->new_chunk_sectors = mddev->chunk_sectors; in set_array_info()
6822 mddev->new_layout = mddev->layout; in set_array_info()
6823 mddev->delta_disks = 0; in set_array_info()
6824 mddev->reshape_backwards = 0; in set_array_info()
6829 void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors) in md_set_array_sectors() argument
6831 lockdep_assert_held(&mddev->reconfig_mutex); in md_set_array_sectors()
6833 if (mddev->external_size) in md_set_array_sectors()
6836 mddev->array_sectors = array_sectors; in md_set_array_sectors()
6840 static int update_size(struct mddev *mddev, sector_t num_sectors) in update_size() argument
6845 sector_t old_dev_sectors = mddev->dev_sectors; in update_size()
6847 if (mddev->pers->resize == NULL) in update_size()
6858 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in update_size()
6859 mddev->sync_thread) in update_size()
6861 if (mddev->ro) in update_size()
6864 rdev_for_each(rdev, mddev) { in update_size()
6872 rv = mddev->pers->resize(mddev, num_sectors); in update_size()
6874 if (mddev_is_clustered(mddev)) in update_size()
6875 md_cluster_ops->update_size(mddev, old_dev_sectors); in update_size()
6876 else if (mddev->queue) { in update_size()
6877 set_capacity(mddev->gendisk, mddev->array_sectors); in update_size()
6878 revalidate_disk(mddev->gendisk); in update_size()
6884 static int update_raid_disks(struct mddev *mddev, int raid_disks) in update_raid_disks() argument
6889 if (mddev->pers->check_reshape == NULL) in update_raid_disks()
6891 if (mddev->ro) in update_raid_disks()
6894 (mddev->max_disks && raid_disks >= mddev->max_disks)) in update_raid_disks()
6896 if (mddev->sync_thread || in update_raid_disks()
6897 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || in update_raid_disks()
6898 mddev->reshape_position != MaxSector) in update_raid_disks()
6901 rdev_for_each(rdev, mddev) { in update_raid_disks()
6902 if (mddev->raid_disks < raid_disks && in update_raid_disks()
6905 if (mddev->raid_disks > raid_disks && in update_raid_disks()
6910 mddev->delta_disks = raid_disks - mddev->raid_disks; in update_raid_disks()
6911 if (mddev->delta_disks < 0) in update_raid_disks()
6912 mddev->reshape_backwards = 1; in update_raid_disks()
6913 else if (mddev->delta_disks > 0) in update_raid_disks()
6914 mddev->reshape_backwards = 0; in update_raid_disks()
6916 rv = mddev->pers->check_reshape(mddev); in update_raid_disks()
6918 mddev->delta_disks = 0; in update_raid_disks()
6919 mddev->reshape_backwards = 0; in update_raid_disks()
6932 static int update_array_info(struct mddev *mddev, mdu_array_info_t *info) in update_array_info() argument
6939 if (mddev->bitmap && mddev->bitmap_info.offset) in update_array_info()
6942 if (mddev->major_version != info->major_version || in update_array_info()
6943 mddev->minor_version != info->minor_version || in update_array_info()
6945 mddev->ctime != info->ctime || in update_array_info()
6946 mddev->level != info->level || in update_array_info()
6948 mddev->persistent != !info->not_persistent || in update_array_info()
6949 mddev->chunk_sectors != info->chunk_size >> 9 || in update_array_info()
6955 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) in update_array_info()
6957 if (mddev->raid_disks != info->raid_disks) in update_array_info()
6959 if (mddev->layout != info->layout) in update_array_info()
6968 if (mddev->layout != info->layout) { in update_array_info()
6973 if (mddev->pers->check_reshape == NULL) in update_array_info()
6976 mddev->new_layout = info->layout; in update_array_info()
6977 rv = mddev->pers->check_reshape(mddev); in update_array_info()
6979 mddev->new_layout = mddev->layout; in update_array_info()
6983 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) in update_array_info()
6984 rv = update_size(mddev, (sector_t)info->size * 2); in update_array_info()
6986 if (mddev->raid_disks != info->raid_disks) in update_array_info()
6987 rv = update_raid_disks(mddev, info->raid_disks); in update_array_info()
6990 if (mddev->pers->quiesce == NULL || mddev->thread == NULL) { in update_array_info()
6994 if (mddev->recovery || mddev->sync_thread) { in update_array_info()
7001 if (mddev->bitmap) { in update_array_info()
7005 if (mddev->bitmap_info.default_offset == 0) { in update_array_info()
7009 mddev->bitmap_info.offset = in update_array_info()
7010 mddev->bitmap_info.default_offset; in update_array_info()
7011 mddev->bitmap_info.space = in update_array_info()
7012 mddev->bitmap_info.default_space; in update_array_info()
7013 bitmap = md_bitmap_create(mddev, -1); in update_array_info()
7014 mddev_suspend(mddev); in update_array_info()
7016 mddev->bitmap = bitmap; in update_array_info()
7017 rv = md_bitmap_load(mddev); in update_array_info()
7021 md_bitmap_destroy(mddev); in update_array_info()
7022 mddev_resume(mddev); in update_array_info()
7025 if (!mddev->bitmap) { in update_array_info()
7029 if (mddev->bitmap->storage.file) { in update_array_info()
7033 if (mddev->bitmap_info.nodes) { in update_array_info()
7035 if (md_cluster_ops->lock_all_bitmaps(mddev) <= 0) { in update_array_info()
7038 md_cluster_ops->unlock_all_bitmaps(mddev); in update_array_info()
7042 mddev->bitmap_info.nodes = 0; in update_array_info()
7043 md_cluster_ops->leave(mddev); in update_array_info()
7045 mddev_suspend(mddev); in update_array_info()
7046 md_bitmap_destroy(mddev); in update_array_info()
7047 mddev_resume(mddev); in update_array_info()
7048 mddev->bitmap_info.offset = 0; in update_array_info()
7051 md_update_sb(mddev, 1); in update_array_info()
7057 static int set_disk_faulty(struct mddev *mddev, dev_t dev) in set_disk_faulty() argument
7062 if (mddev->pers == NULL) in set_disk_faulty()
7066 rdev = md_find_rdev_rcu(mddev, dev); in set_disk_faulty()
7070 md_error(mddev, rdev); in set_disk_faulty()
7086 struct mddev *mddev = bdev->bd_disk->private_data; in md_getgeo() local
7090 geo->cylinders = mddev->array_sectors / 8; in md_getgeo()
7125 struct mddev *mddev = NULL; in md_ioctl() local
7164 mddev = bdev->bd_disk->private_data; in md_ioctl()
7166 if (!mddev) { in md_ioctl()
7174 if (!mddev->raid_disks && !mddev->external) in md_ioctl()
7177 err = get_array_info(mddev, argp); in md_ioctl()
7181 if (!mddev->raid_disks && !mddev->external) in md_ioctl()
7184 err = get_disk_info(mddev, argp); in md_ioctl()
7188 err = set_disk_faulty(mddev, new_decode_dev(arg)); in md_ioctl()
7192 err = get_bitmap_file(mddev, argp); in md_ioctl()
7203 wait_event_interruptible_timeout(mddev->sb_wait, in md_ioctl()
7205 &mddev->recovery), in md_ioctl()
7211 mutex_lock(&mddev->open_mutex); in md_ioctl()
7212 if (mddev->pers && atomic_read(&mddev->openers) > 1) { in md_ioctl()
7213 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7217 WARN_ON_ONCE(test_bit(MD_CLOSING, &mddev->flags)); in md_ioctl()
7218 set_bit(MD_CLOSING, &mddev->flags); in md_ioctl()
7220 mutex_unlock(&mddev->open_mutex); in md_ioctl()
7223 err = mddev_lock(mddev); in md_ioctl()
7238 if (mddev->pers) { in md_ioctl()
7239 err = update_array_info(mddev, &info); in md_ioctl()
7246 if (!list_empty(&mddev->disks)) { in md_ioctl()
7247 pr_warn("md: array %s already has disks!\n", mdname(mddev)); in md_ioctl()
7251 if (mddev->raid_disks) { in md_ioctl()
7252 pr_warn("md: array %s already initialised!\n", mdname(mddev)); in md_ioctl()
7256 err = set_array_info(mddev, &info); in md_ioctl()
7269 if ((!mddev->raid_disks && !mddev->external) in md_ioctl()
7282 err = restart_array(mddev); in md_ioctl()
7286 err = do_md_stop(mddev, 0, bdev); in md_ioctl()
7290 err = md_set_readonly(mddev, bdev); in md_ioctl()
7294 err = hot_remove_disk(mddev, new_decode_dev(arg)); in md_ioctl()
7302 if (mddev->pers) { in md_ioctl()
7310 err = add_new_disk(mddev, &info); in md_ioctl()
7329 if (mddev->ro != 1) in md_ioctl()
7335 if (mddev->pers) { in md_ioctl()
7336 err = restart_array(mddev); in md_ioctl()
7338 mddev->ro = 2; in md_ioctl()
7339 set_disk_ro(mddev->gendisk, 0); in md_ioctl()
7349 if (mddev->ro && mddev->pers) { in md_ioctl()
7350 if (mddev->ro == 2) { in md_ioctl()
7351 mddev->ro = 0; in md_ioctl()
7352 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_ioctl()
7353 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_ioctl()
7358 if (test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) { in md_ioctl()
7359 mddev_unlock(mddev); in md_ioctl()
7360 wait_event(mddev->sb_wait, in md_ioctl()
7361 !test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags) && in md_ioctl()
7362 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_ioctl()
7363 mddev_lock_nointr(mddev); in md_ioctl()
7378 err = add_new_disk(mddev, &info); in md_ioctl()
7383 if (mddev_is_clustered(mddev)) in md_ioctl()
7384 md_cluster_ops->new_disk_ack(mddev, false); in md_ioctl()
7390 err = hot_add_disk(mddev, new_decode_dev(arg)); in md_ioctl()
7394 err = do_md_run(mddev); in md_ioctl()
7398 err = set_bitmap_file(mddev, (int)arg); in md_ioctl()
7407 if (mddev->hold_active == UNTIL_IOCTL && in md_ioctl()
7409 mddev->hold_active = 0; in md_ioctl()
7410 mddev_unlock(mddev); in md_ioctl()
7413 clear_bit(MD_CLOSING, &mddev->flags); in md_ioctl()
7442 struct mddev *mddev = mddev_find(bdev->bd_dev); in md_open() local
7445 if (!mddev) in md_open()
7448 if (mddev->gendisk != bdev->bd_disk) { in md_open()
7452 mddev_put(mddev); in md_open()
7458 BUG_ON(mddev != bdev->bd_disk->private_data); in md_open()
7460 if ((err = mutex_lock_interruptible(&mddev->open_mutex))) in md_open()
7463 if (test_bit(MD_CLOSING, &mddev->flags)) { in md_open()
7464 mutex_unlock(&mddev->open_mutex); in md_open()
7470 atomic_inc(&mddev->openers); in md_open()
7471 mutex_unlock(&mddev->open_mutex); in md_open()
7476 mddev_put(mddev); in md_open()
7482 struct mddev *mddev = disk->private_data; in md_release() local
7484 BUG_ON(!mddev); in md_release()
7485 atomic_dec(&mddev->openers); in md_release()
7486 mddev_put(mddev); in md_release()
7491 struct mddev *mddev = disk->private_data; in md_media_changed() local
7493 return mddev->changed; in md_media_changed()
7498 struct mddev *mddev = disk->private_data; in md_revalidate() local
7500 mddev->changed = 0; in md_revalidate()
7571 struct mddev *mddev, const char *name) in md_register_thread() argument
7582 thread->mddev = mddev; in md_register_thread()
7586 mdname(thread->mddev), in md_register_thread()
7614 void md_error(struct mddev *mddev, struct md_rdev *rdev) in md_error() argument
7619 if (!mddev->pers || !mddev->pers->error_handler) in md_error()
7621 mddev->pers->error_handler(mddev,rdev); in md_error()
7622 if (mddev->degraded) in md_error()
7623 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_error()
7625 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_error()
7626 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_error()
7627 md_wakeup_thread(mddev->thread); in md_error()
7628 if (mddev->event_work.func) in md_error()
7629 queue_work(md_misc_wq, &mddev->event_work); in md_error()
7630 md_new_event(mddev); in md_error()
7655 static int status_resync(struct seq_file *seq, struct mddev *mddev) in status_resync() argument
7663 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in status_resync()
7664 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in status_resync()
7665 max_sectors = mddev->resync_max_sectors; in status_resync()
7667 max_sectors = mddev->dev_sectors; in status_resync()
7669 resync = mddev->curr_resync; in status_resync()
7671 if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) in status_resync()
7677 resync -= atomic_read(&mddev->recovery_active); in status_resync()
7680 if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery)) { in status_resync()
7683 rdev_for_each(rdev, mddev) in status_resync()
7691 if (mddev->reshape_position != MaxSector) in status_resync()
7697 if (mddev->recovery_cp < MaxSector) { in status_resync()
7734 (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)? in status_resync()
7736 (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)? in status_resync()
7738 (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ? in status_resync()
7758 dt = ((jiffies - mddev->resync_mark) / HZ); in status_resync()
7760 db = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)) in status_resync()
7761 - mddev->resync_mark_cnt; in status_resync()
7779 struct mddev *mddev; in md_seq_start() local
7790 mddev = list_entry(tmp, struct mddev, all_mddevs); in md_seq_start()
7791 mddev_get(mddev); in md_seq_start()
7793 return mddev; in md_seq_start()
7804 struct mddev *next_mddev, *mddev = v; in md_seq_next() local
7814 tmp = mddev->all_mddevs.next; in md_seq_next()
7816 next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs)); in md_seq_next()
7824 mddev_put(mddev); in md_seq_next()
7831 struct mddev *mddev = v; in md_seq_stop() local
7833 if (mddev && v != (void*)1 && v != (void*)2) in md_seq_stop()
7834 mddev_put(mddev); in md_seq_stop()
7839 struct mddev *mddev = v; in md_seq_show() local
7860 spin_lock(&mddev->lock); in md_seq_show()
7861 if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) { in md_seq_show()
7862 seq_printf(seq, "%s : %sactive", mdname(mddev), in md_seq_show()
7863 mddev->pers ? "" : "in"); in md_seq_show()
7864 if (mddev->pers) { in md_seq_show()
7865 if (mddev->ro==1) in md_seq_show()
7867 if (mddev->ro==2) in md_seq_show()
7869 seq_printf(seq, " %s", mddev->pers->name); in md_seq_show()
7874 rdev_for_each_rcu(rdev, mddev) { in md_seq_show()
7894 if (!list_empty(&mddev->disks)) { in md_seq_show()
7895 if (mddev->pers) in md_seq_show()
7898 mddev->array_sectors / 2); in md_seq_show()
7903 if (mddev->persistent) { in md_seq_show()
7904 if (mddev->major_version != 0 || in md_seq_show()
7905 mddev->minor_version != 90) { in md_seq_show()
7907 mddev->major_version, in md_seq_show()
7908 mddev->minor_version); in md_seq_show()
7910 } else if (mddev->external) in md_seq_show()
7912 mddev->metadata_type); in md_seq_show()
7916 if (mddev->pers) { in md_seq_show()
7917 mddev->pers->status(seq, mddev); in md_seq_show()
7919 if (mddev->pers->sync_request) { in md_seq_show()
7920 if (status_resync(seq, mddev)) in md_seq_show()
7926 md_bitmap_status(seq, mddev->bitmap); in md_seq_show()
7930 spin_unlock(&mddev->lock); in md_seq_show()
8029 int md_setup_cluster(struct mddev *mddev, int nodes) in md_setup_cluster() argument
8042 return md_cluster_ops->join(mddev, nodes); in md_setup_cluster()
8045 void md_cluster_stop(struct mddev *mddev) in md_cluster_stop() argument
8049 md_cluster_ops->leave(mddev); in md_cluster_stop()
8053 static int is_mddev_idle(struct mddev *mddev, int init) in is_mddev_idle() argument
8061 rdev_for_each_rcu(rdev, mddev) { in is_mddev_idle()
8096 void md_done_sync(struct mddev *mddev, int blocks, int ok) in md_done_sync() argument
8099 atomic_sub(blocks, &mddev->recovery_active); in md_done_sync()
8100 wake_up(&mddev->recovery_wait); in md_done_sync()
8102 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_done_sync()
8103 set_bit(MD_RECOVERY_ERROR, &mddev->recovery); in md_done_sync()
8104 md_wakeup_thread(mddev->thread); in md_done_sync()
8117 bool md_write_start(struct mddev *mddev, struct bio *bi) in md_write_start() argument
8124 BUG_ON(mddev->ro == 1); in md_write_start()
8125 if (mddev->ro == 2) { in md_write_start()
8127 mddev->ro = 0; in md_write_start()
8128 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_write_start()
8129 md_wakeup_thread(mddev->thread); in md_write_start()
8130 md_wakeup_thread(mddev->sync_thread); in md_write_start()
8134 percpu_ref_get(&mddev->writes_pending); in md_write_start()
8136 if (mddev->safemode == 1) in md_write_start()
8137 mddev->safemode = 0; in md_write_start()
8139 if (mddev->in_sync || mddev->sync_checkers) { in md_write_start()
8140 spin_lock(&mddev->lock); in md_write_start()
8141 if (mddev->in_sync) { in md_write_start()
8142 mddev->in_sync = 0; in md_write_start()
8143 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_write_start()
8144 set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_write_start()
8145 md_wakeup_thread(mddev->thread); in md_write_start()
8148 spin_unlock(&mddev->lock); in md_write_start()
8152 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_write_start()
8153 if (!mddev->has_superblocks) in md_write_start()
8155 wait_event(mddev->sb_wait, in md_write_start()
8156 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags) || in md_write_start()
8157 mddev->suspended); in md_write_start()
8158 if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in md_write_start()
8159 percpu_ref_put(&mddev->writes_pending); in md_write_start()
8174 void md_write_inc(struct mddev *mddev, struct bio *bi) in md_write_inc() argument
8178 WARN_ON_ONCE(mddev->in_sync || mddev->ro); in md_write_inc()
8179 percpu_ref_get(&mddev->writes_pending); in md_write_inc()
8183 void md_write_end(struct mddev *mddev) in md_write_end() argument
8185 percpu_ref_put(&mddev->writes_pending); in md_write_end()
8187 if (mddev->safemode == 2) in md_write_end()
8188 md_wakeup_thread(mddev->thread); in md_write_end()
8189 else if (mddev->safemode_delay) in md_write_end()
8193 mod_timer(&mddev->safemode_timer, in md_write_end()
8194 roundup(jiffies, mddev->safemode_delay) + in md_write_end()
8195 mddev->safemode_delay); in md_write_end()
8206 void md_allow_write(struct mddev *mddev) in md_allow_write() argument
8208 if (!mddev->pers) in md_allow_write()
8210 if (mddev->ro) in md_allow_write()
8212 if (!mddev->pers->sync_request) in md_allow_write()
8215 spin_lock(&mddev->lock); in md_allow_write()
8216 if (mddev->in_sync) { in md_allow_write()
8217 mddev->in_sync = 0; in md_allow_write()
8218 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_allow_write()
8219 set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_allow_write()
8220 if (mddev->safemode_delay && in md_allow_write()
8221 mddev->safemode == 0) in md_allow_write()
8222 mddev->safemode = 1; in md_allow_write()
8223 spin_unlock(&mddev->lock); in md_allow_write()
8224 md_update_sb(mddev, 0); in md_allow_write()
8225 sysfs_notify_dirent_safe(mddev->sysfs_state); in md_allow_write()
8227 wait_event(mddev->sb_wait, in md_allow_write()
8228 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in md_allow_write()
8230 spin_unlock(&mddev->lock); in md_allow_write()
8239 struct mddev *mddev = thread->mddev; in md_do_sync() local
8240 struct mddev *mddev2; in md_do_sync()
8257 if (test_bit(MD_RECOVERY_DONE, &mddev->recovery) || in md_do_sync()
8258 test_bit(MD_RECOVERY_WAIT, &mddev->recovery)) in md_do_sync()
8260 if (mddev->ro) {/* never try to sync a read-only array */ in md_do_sync()
8261 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_do_sync()
8265 if (mddev_is_clustered(mddev)) { in md_do_sync()
8266 ret = md_cluster_ops->resync_start(mddev); in md_do_sync()
8270 set_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags); in md_do_sync()
8271 if (!(test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in md_do_sync()
8272 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) || in md_do_sync()
8273 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) in md_do_sync()
8274 && ((unsigned long long)mddev->curr_resync_completed in md_do_sync()
8275 < (unsigned long long)mddev->resync_max_sectors)) in md_do_sync()
8279 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8280 if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) { in md_do_sync()
8283 } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { in md_do_sync()
8288 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in md_do_sync()
8293 mddev->last_sync_action = action ?: desc; in md_do_sync()
8313 mddev->curr_resync = 2; in md_do_sync()
8316 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8319 if (mddev2 == mddev) in md_do_sync()
8321 if (!mddev->parallel_resync in md_do_sync()
8323 && match_mddev_units(mddev, mddev2)) { in md_do_sync()
8325 if (mddev < mddev2 && mddev->curr_resync == 2) { in md_do_sync()
8327 mddev->curr_resync = 1; in md_do_sync()
8330 if (mddev > mddev2 && mddev->curr_resync == 1) in md_do_sync()
8340 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8341 mddev2->curr_resync >= mddev->curr_resync) { in md_do_sync()
8345 desc, mdname(mddev), in md_do_sync()
8358 } while (mddev->curr_resync < 2); in md_do_sync()
8361 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8365 max_sectors = mddev->resync_max_sectors; in md_do_sync()
8366 atomic64_set(&mddev->resync_mismatches, 0); in md_do_sync()
8368 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
8369 j = mddev->resync_min; in md_do_sync()
8370 else if (!mddev->bitmap) in md_do_sync()
8371 j = mddev->recovery_cp; in md_do_sync()
8373 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in md_do_sync()
8374 max_sectors = mddev->resync_max_sectors; in md_do_sync()
8377 max_sectors = mddev->dev_sectors; in md_do_sync()
8380 rdev_for_each_rcu(rdev, mddev) in md_do_sync()
8397 if (mddev->bitmap) { in md_do_sync()
8398 mddev->pers->quiesce(mddev, 1); in md_do_sync()
8399 mddev->pers->quiesce(mddev, 0); in md_do_sync()
8403 pr_info("md: %s of RAID array %s\n", desc, mdname(mddev)); in md_do_sync()
8404 pr_debug("md: minimum _guaranteed_ speed: %d KB/sec/disk.\n", speed_min(mddev)); in md_do_sync()
8406 speed_max(mddev), desc); in md_do_sync()
8408 is_mddev_idle(mddev, 1); /* this initializes IO event counters */ in md_do_sync()
8416 mddev->resync_mark = mark[last_mark]; in md_do_sync()
8417 mddev->resync_mark_cnt = mark_cnt[last_mark]; in md_do_sync()
8426 atomic_set(&mddev->recovery_active, 0); in md_do_sync()
8431 desc, mdname(mddev)); in md_do_sync()
8432 mddev->curr_resync = j; in md_do_sync()
8434 mddev->curr_resync = 3; /* no longer delayed */ in md_do_sync()
8435 mddev->curr_resync_completed = j; in md_do_sync()
8436 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); in md_do_sync()
8437 md_new_event(mddev); in md_do_sync()
8446 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8447 ((mddev->curr_resync > mddev->curr_resync_completed && in md_do_sync()
8448 (mddev->curr_resync - mddev->curr_resync_completed) in md_do_sync()
8451 (j - mddev->curr_resync_completed)*2 in md_do_sync()
8452 >= mddev->resync_max - mddev->curr_resync_completed || in md_do_sync()
8453 mddev->curr_resync_completed > mddev->resync_max in md_do_sync()
8456 wait_event(mddev->recovery_wait, in md_do_sync()
8457 atomic_read(&mddev->recovery_active) == 0); in md_do_sync()
8458 mddev->curr_resync_completed = j; in md_do_sync()
8459 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && in md_do_sync()
8460 j > mddev->recovery_cp) in md_do_sync()
8461 mddev->recovery_cp = j; in md_do_sync()
8463 set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags); in md_do_sync()
8464 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); in md_do_sync()
8467 while (j >= mddev->resync_max && in md_do_sync()
8468 !test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
8474 wait_event_interruptible(mddev->recovery_wait, in md_do_sync()
8475 mddev->resync_max > j in md_do_sync()
8477 &mddev->recovery)); in md_do_sync()
8480 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8483 sectors = mddev->pers->sync_request(mddev, j, &skipped); in md_do_sync()
8485 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_do_sync()
8491 atomic_add(sectors, &mddev->recovery_active); in md_do_sync()
8494 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8502 mddev->curr_resync = j; in md_do_sync()
8503 mddev->curr_mark_cnt = io_sectors; in md_do_sync()
8508 md_new_event(mddev); in md_do_sync()
8519 mddev->resync_mark = mark[next]; in md_do_sync()
8520 mddev->resync_mark_cnt = mark_cnt[next]; in md_do_sync()
8522 mark_cnt[next] = io_sectors - atomic_read(&mddev->recovery_active); in md_do_sync()
8526 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8539 recovery_done = io_sectors - atomic_read(&mddev->recovery_active); in md_do_sync()
8540 currspeed = ((unsigned long)(recovery_done - mddev->resync_mark_cnt))/2 in md_do_sync()
8541 /((jiffies-mddev->resync_mark)/HZ +1) +1; in md_do_sync()
8543 if (currspeed > speed_min(mddev)) { in md_do_sync()
8544 if (currspeed > speed_max(mddev)) { in md_do_sync()
8548 if (!is_mddev_idle(mddev, 0)) { in md_do_sync()
8553 wait_event(mddev->recovery_wait, in md_do_sync()
8554 !atomic_read(&mddev->recovery_active)); in md_do_sync()
8558 pr_info("md: %s: %s %s.\n",mdname(mddev), desc, in md_do_sync()
8559 test_bit(MD_RECOVERY_INTR, &mddev->recovery) in md_do_sync()
8565 wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); in md_do_sync()
8567 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8568 !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8569 mddev->curr_resync > 3) { in md_do_sync()
8570 mddev->curr_resync_completed = mddev->curr_resync; in md_do_sync()
8571 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); in md_do_sync()
8573 mddev->pers->sync_request(mddev, max_sectors, &skipped); in md_do_sync()
8575 if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) && in md_do_sync()
8576 mddev->curr_resync > 3) { in md_do_sync()
8577 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in md_do_sync()
8578 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
8579 if (mddev->curr_resync >= mddev->recovery_cp) { in md_do_sync()
8581 desc, mdname(mddev)); in md_do_sync()
8583 &mddev->recovery)) in md_do_sync()
8584 mddev->recovery_cp = in md_do_sync()
8585 mddev->curr_resync_completed; in md_do_sync()
8587 mddev->recovery_cp = in md_do_sync()
8588 mddev->curr_resync; in md_do_sync()
8591 mddev->recovery_cp = MaxSector; in md_do_sync()
8593 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in md_do_sync()
8594 mddev->curr_resync = MaxSector; in md_do_sync()
8595 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8596 test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) { in md_do_sync()
8598 rdev_for_each_rcu(rdev, mddev) in md_do_sync()
8600 mddev->delta_disks >= 0 && in md_do_sync()
8604 rdev->recovery_offset < mddev->curr_resync) in md_do_sync()
8605 rdev->recovery_offset = mddev->curr_resync; in md_do_sync()
8614 set_mask_bits(&mddev->sb_flags, 0, in md_do_sync()
8617 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_do_sync()
8618 !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_do_sync()
8619 mddev->delta_disks > 0 && in md_do_sync()
8620 mddev->pers->finish_reshape && in md_do_sync()
8621 mddev->pers->size && in md_do_sync()
8622 mddev->queue) { in md_do_sync()
8623 mddev_lock_nointr(mddev); in md_do_sync()
8624 md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0)); in md_do_sync()
8625 mddev_unlock(mddev); in md_do_sync()
8626 set_capacity(mddev->gendisk, mddev->array_sectors); in md_do_sync()
8627 revalidate_disk(mddev->gendisk); in md_do_sync()
8630 spin_lock(&mddev->lock); in md_do_sync()
8631 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in md_do_sync()
8633 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
8634 mddev->resync_min = 0; in md_do_sync()
8635 mddev->resync_max = MaxSector; in md_do_sync()
8636 } else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) in md_do_sync()
8637 mddev->resync_min = mddev->curr_resync_completed; in md_do_sync()
8638 set_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_do_sync()
8639 mddev->curr_resync = 0; in md_do_sync()
8640 spin_unlock(&mddev->lock); in md_do_sync()
8643 md_wakeup_thread(mddev->thread); in md_do_sync()
8648 static int remove_and_add_spares(struct mddev *mddev, in remove_and_add_spares() argument
8656 if (this && test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in remove_and_add_spares()
8660 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
8678 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
8686 if (mddev->pers->hot_remove_disk( in remove_and_add_spares()
8687 mddev, rdev) == 0) { in remove_and_add_spares()
8688 sysfs_unlink_rdev(mddev, rdev); in remove_and_add_spares()
8698 if (removed && mddev->kobj.sd) in remove_and_add_spares()
8699 sysfs_notify(&mddev->kobj, NULL, "degraded"); in remove_and_add_spares()
8704 rdev_for_each(rdev, mddev) { in remove_and_add_spares()
8719 if (mddev->ro && in remove_and_add_spares()
8726 if (mddev->pers-> in remove_and_add_spares()
8727 hot_add_disk(mddev, rdev) == 0) { in remove_and_add_spares()
8728 if (sysfs_link_rdev(mddev, rdev)) in remove_and_add_spares()
8732 md_new_event(mddev); in remove_and_add_spares()
8733 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in remove_and_add_spares()
8738 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in remove_and_add_spares()
8744 struct mddev *mddev = container_of(ws, struct mddev, del_work); in md_start_sync() local
8746 mddev->sync_thread = md_register_thread(md_do_sync, in md_start_sync()
8747 mddev, in md_start_sync()
8749 if (!mddev->sync_thread) { in md_start_sync()
8751 mdname(mddev)); in md_start_sync()
8753 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_start_sync()
8754 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_start_sync()
8755 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_start_sync()
8756 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_start_sync()
8757 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_start_sync()
8760 &mddev->recovery)) in md_start_sync()
8761 if (mddev->sysfs_action) in md_start_sync()
8762 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_start_sync()
8764 md_wakeup_thread(mddev->sync_thread); in md_start_sync()
8765 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_start_sync()
8766 md_new_event(mddev); in md_start_sync()
8791 void md_check_recovery(struct mddev *mddev) in md_check_recovery() argument
8793 if (mddev->suspended) in md_check_recovery()
8796 if (mddev->bitmap) in md_check_recovery()
8797 md_bitmap_daemon_work(mddev); in md_check_recovery()
8800 if (mddev->pers->sync_request && !mddev->external) { in md_check_recovery()
8802 mdname(mddev)); in md_check_recovery()
8803 mddev->safemode = 2; in md_check_recovery()
8808 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) in md_check_recovery()
8811 (mddev->sb_flags & ~ (1<<MD_SB_CHANGE_PENDING)) || in md_check_recovery()
8812 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || in md_check_recovery()
8813 test_bit(MD_RECOVERY_DONE, &mddev->recovery) || in md_check_recovery()
8814 (mddev->external == 0 && mddev->safemode == 1) || in md_check_recovery()
8815 (mddev->safemode == 2 in md_check_recovery()
8816 && !mddev->in_sync && mddev->recovery_cp == MaxSector) in md_check_recovery()
8820 if (mddev_trylock(mddev)) { in md_check_recovery()
8823 if (!mddev->external && mddev->safemode == 1) in md_check_recovery()
8824 mddev->safemode = 0; in md_check_recovery()
8826 if (mddev->ro) { in md_check_recovery()
8828 if (!mddev->external && mddev->in_sync) in md_check_recovery()
8834 rdev_for_each(rdev, mddev) in md_check_recovery()
8843 remove_and_add_spares(mddev, NULL); in md_check_recovery()
8847 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_check_recovery()
8848 md_reap_sync_thread(mddev); in md_check_recovery()
8849 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
8850 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_check_recovery()
8851 clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); in md_check_recovery()
8855 if (mddev_is_clustered(mddev)) { in md_check_recovery()
8860 rdev_for_each(rdev, mddev) { in md_check_recovery()
8867 if (!mddev->external && !mddev->in_sync) { in md_check_recovery()
8868 spin_lock(&mddev->lock); in md_check_recovery()
8869 set_in_sync(mddev); in md_check_recovery()
8870 spin_unlock(&mddev->lock); in md_check_recovery()
8873 if (mddev->sb_flags) in md_check_recovery()
8874 md_update_sb(mddev, 0); in md_check_recovery()
8876 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && in md_check_recovery()
8877 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) { in md_check_recovery()
8879 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_check_recovery()
8882 if (mddev->sync_thread) { in md_check_recovery()
8883 md_reap_sync_thread(mddev); in md_check_recovery()
8889 mddev->curr_resync_completed = 0; in md_check_recovery()
8890 spin_lock(&mddev->lock); in md_check_recovery()
8891 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_check_recovery()
8892 spin_unlock(&mddev->lock); in md_check_recovery()
8896 clear_bit(MD_RECOVERY_INTR, &mddev->recovery); in md_check_recovery()
8897 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_check_recovery()
8899 if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || in md_check_recovery()
8900 test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) in md_check_recovery()
8909 if (mddev->reshape_position != MaxSector) { in md_check_recovery()
8910 if (mddev->pers->check_reshape == NULL || in md_check_recovery()
8911 mddev->pers->check_reshape(mddev) != 0) in md_check_recovery()
8914 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_check_recovery()
8915 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
8916 } else if ((spares = remove_and_add_spares(mddev, NULL))) { in md_check_recovery()
8917 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_check_recovery()
8918 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_check_recovery()
8919 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_check_recovery()
8920 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
8921 } else if (mddev->recovery_cp < MaxSector) { in md_check_recovery()
8922 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_check_recovery()
8923 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); in md_check_recovery()
8924 } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) in md_check_recovery()
8928 if (mddev->pers->sync_request) { in md_check_recovery()
8934 md_bitmap_write_all(mddev->bitmap); in md_check_recovery()
8936 INIT_WORK(&mddev->del_work, md_start_sync); in md_check_recovery()
8937 queue_work(md_misc_wq, &mddev->del_work); in md_check_recovery()
8941 if (!mddev->sync_thread) { in md_check_recovery()
8942 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_check_recovery()
8945 &mddev->recovery)) in md_check_recovery()
8946 if (mddev->sysfs_action) in md_check_recovery()
8947 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_check_recovery()
8950 wake_up(&mddev->sb_wait); in md_check_recovery()
8951 mddev_unlock(mddev); in md_check_recovery()
8952 } else if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags) && mddev->sb_flags) { in md_check_recovery()
8956 set_bit(MD_UPDATING_SB, &mddev->flags); in md_check_recovery()
8958 if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags)) in md_check_recovery()
8959 md_update_sb(mddev, 0); in md_check_recovery()
8960 clear_bit_unlock(MD_UPDATING_SB, &mddev->flags); in md_check_recovery()
8961 wake_up(&mddev->sb_wait); in md_check_recovery()
8966 void md_reap_sync_thread(struct mddev *mddev) in md_reap_sync_thread() argument
8971 md_unregister_thread(&mddev->sync_thread); in md_reap_sync_thread()
8972 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && in md_reap_sync_thread()
8973 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { in md_reap_sync_thread()
8976 if (mddev->pers->spare_active(mddev)) { in md_reap_sync_thread()
8977 sysfs_notify(&mddev->kobj, NULL, in md_reap_sync_thread()
8979 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in md_reap_sync_thread()
8982 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in md_reap_sync_thread()
8983 mddev->pers->finish_reshape) in md_reap_sync_thread()
8984 mddev->pers->finish_reshape(mddev); in md_reap_sync_thread()
8989 if (!mddev->degraded) in md_reap_sync_thread()
8990 rdev_for_each(rdev, mddev) in md_reap_sync_thread()
8993 md_update_sb(mddev, 1); in md_reap_sync_thread()
8997 if (test_and_clear_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags)) in md_reap_sync_thread()
8998 md_cluster_ops->resync_finish(mddev); in md_reap_sync_thread()
8999 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in md_reap_sync_thread()
9000 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in md_reap_sync_thread()
9001 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in md_reap_sync_thread()
9002 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in md_reap_sync_thread()
9003 clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); in md_reap_sync_thread()
9004 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in md_reap_sync_thread()
9007 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in md_reap_sync_thread()
9008 sysfs_notify_dirent_safe(mddev->sysfs_action); in md_reap_sync_thread()
9009 md_new_event(mddev); in md_reap_sync_thread()
9010 if (mddev->event_work.func) in md_reap_sync_thread()
9011 queue_work(md_misc_wq, &mddev->event_work); in md_reap_sync_thread()
9015 void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev) in md_wait_for_blocked_rdev() argument
9022 rdev_dec_pending(rdev, mddev); in md_wait_for_blocked_rdev()
9026 void md_finish_reshape(struct mddev *mddev) in md_finish_reshape() argument
9031 rdev_for_each(rdev, mddev) { in md_finish_reshape()
9047 struct mddev *mddev = rdev->mddev; in rdev_set_badblocks() local
9060 set_mask_bits(&mddev->sb_flags, 0, in rdev_set_badblocks()
9062 md_wakeup_thread(rdev->mddev->thread); in rdev_set_badblocks()
9088 struct mddev *mddev; in md_notify_reboot() local
9091 for_each_mddev(mddev, tmp) { in md_notify_reboot()
9092 if (mddev_trylock(mddev)) { in md_notify_reboot()
9093 if (mddev->pers) in md_notify_reboot()
9094 __md_stop_writes(mddev); in md_notify_reboot()
9095 if (mddev->persistent) in md_notify_reboot()
9096 mddev->safemode = 2; in md_notify_reboot()
9097 mddev_unlock(mddev); in md_notify_reboot()
9166 static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev) in check_sb_changes() argument
9177 if (mddev->dev_sectors != le64_to_cpu(sb->size)) { in check_sb_changes()
9178 ret = mddev->pers->resize(mddev, le64_to_cpu(sb->size)); in check_sb_changes()
9182 md_bitmap_update_sb(mddev->bitmap); in check_sb_changes()
9186 rdev_for_each(rdev2, mddev) { in check_sb_changes()
9207 ret = remove_and_add_spares(mddev, rdev2); in check_sb_changes()
9212 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in check_sb_changes()
9213 md_wakeup_thread(mddev->thread); in check_sb_changes()
9222 md_error(mddev, rdev2); in check_sb_changes()
9228 if (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) in check_sb_changes()
9229 update_raid_disks(mddev, le32_to_cpu(sb->raid_disks)); in check_sb_changes()
9232 mddev->events = le64_to_cpu(sb->events); in check_sb_changes()
9235 static int read_rdev(struct mddev *mddev, struct md_rdev *rdev) in read_rdev() argument
9249 err = super_types[mddev->major_version]. in read_rdev()
9250 load_super(rdev, NULL, mddev->minor_version); in read_rdev()
9275 mddev->pers->spare_active(mddev)) in read_rdev()
9276 sysfs_notify(&mddev->kobj, NULL, "degraded"); in read_rdev()
9282 void md_reload_sb(struct mddev *mddev, int nr) in md_reload_sb() argument
9288 rdev_for_each_rcu(rdev, mddev) { in md_reload_sb()
9298 err = read_rdev(mddev, rdev); in md_reload_sb()
9302 check_sb_changes(mddev, rdev); in md_reload_sb()
9305 rdev_for_each_rcu(rdev, mddev) { in md_reload_sb()
9307 read_rdev(mddev, rdev); in md_reload_sb()
9383 struct mddev *mddev; in md_exit() local
9407 for_each_mddev(mddev, tmp) { in md_exit()
9408 export_array(mddev); in md_exit()
9409 mddev->ctime = 0; in md_exit()
9410 mddev->hold_active = 0; in md_exit()