Lines Matching refs:mddev

71 static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
73 static void reshape_request_write(struct mddev *mddev, struct r10bio *r10_bio);
144 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || in r10buf_pool_alloc()
145 test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) in r10buf_pool_alloc()
191 &conf->mddev->recovery)) { in r10buf_pool_alloc()
277 struct r10conf *conf = r10_bio->mddev->private; in free_r10bio()
285 struct r10conf *conf = r10_bio->mddev->private; in put_buf()
301 struct mddev *mddev = r10_bio->mddev; in reschedule_retry() local
302 struct r10conf *conf = mddev->private; in reschedule_retry()
312 md_wakeup_thread(mddev->thread); in reschedule_retry()
323 struct r10conf *conf = r10_bio->mddev->private; in raid_end_bio_io()
343 struct r10conf *conf = r10_bio->mddev->private; in update_head_pos()
382 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_read_request()
414 rdev_dec_pending(rdev, conf->mddev); in raid10_end_read_request()
420 mdname(conf->mddev), in raid10_end_read_request()
431 md_bitmap_endwrite(r10_bio->mddev->bitmap, r10_bio->sector, in close_write()
435 md_write_end(r10_bio->mddev); in close_write()
458 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_write_request()
483 md_error(rdev->mddev, rdev); in raid10_end_write_request()
488 &rdev->mddev->recovery); in raid10_end_write_request()
493 md_error(rdev->mddev, rdev); in raid10_end_write_request()
557 rdev_dec_pending(rdev, conf->mddev); in raid10_end_write_request()
656 conf->mddev->reshape_backwards)) { in raid10_find_phys()
761 if ((conf->mddev->recovery_cp < MaxSector in read_balance()
763 (mddev_is_clustered(conf->mddev) && in read_balance()
764 md_cluster_ops->area_resyncing(conf->mddev, READ, this_sector, in read_balance()
911 raid1_prepare_flush_writes(conf->mddev->bitmap); in flush_pending_writes()
998 thread = rcu_dereference_protected(conf->mddev->thread, true); in stop_waiting_barrier()
1043 raid10_log(conf->mddev, "wait barrier"); in wait_barrier()
1101 if (!test_bit(MD_RECOVERY_RESHAPE, &rdev->mddev->recovery) || in choose_data_offset()
1111 struct mddev *mddev = plug->cb.data; in raid10_unplug() local
1112 struct r10conf *conf = mddev->private; in raid10_unplug()
1120 md_wakeup_thread(mddev->thread); in raid10_unplug()
1127 raid1_prepare_flush_writes(mddev->bitmap); in raid10_unplug()
1146 static bool regular_request_wait(struct mddev *mddev, struct r10conf *conf, in regular_request_wait() argument
1154 while (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in regular_request_wait()
1162 raid10_log(conf->mddev, "wait reshape"); in regular_request_wait()
1172 static void raid10_read_request(struct mddev *mddev, struct bio *bio, in raid10_read_request() argument
1175 struct r10conf *conf = mddev->private; in raid10_read_request()
1214 if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors)) in raid10_read_request()
1220 mdname(mddev), b, in raid10_read_request()
1228 mdname(mddev), in raid10_read_request()
1245 md_account_bio(mddev, &bio); in raid10_read_request()
1248 read_bio = bio_alloc_clone(rdev->bdev, bio, gfp, &mddev->bio_set); in raid10_read_request()
1262 if (mddev->gendisk) in raid10_read_request()
1263 trace_block_bio_remap(read_bio, disk_devt(mddev->gendisk), in raid10_read_request()
1269 static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio, in raid10_write_one_disk() argument
1277 struct r10conf *conf = mddev->private; in raid10_write_one_disk()
1292 mbio = bio_alloc_clone(rdev->bdev, bio, GFP_NOIO, &mddev->bio_set); in raid10_write_one_disk()
1308 if (conf->mddev->gendisk) in raid10_write_one_disk()
1309 trace_block_bio_remap(mbio, disk_devt(conf->mddev->gendisk), in raid10_write_one_disk()
1316 if (!raid1_add_bio_to_plug(mddev, mbio, raid10_unplug, conf->copies)) { in raid10_write_one_disk()
1320 md_wakeup_thread(mddev->thread); in raid10_write_one_disk()
1343 static void wait_blocked_dev(struct mddev *mddev, struct r10bio *r10_bio) in wait_blocked_dev() argument
1346 struct r10conf *conf = mddev->private; in wait_blocked_dev()
1399 raid10_log(conf->mddev, "%s wait rdev %d blocked", in wait_blocked_dev()
1401 md_wait_for_blocked_rdev(blocked_rdev, mddev); in wait_blocked_dev()
1407 static void raid10_write_request(struct mddev *mddev, struct bio *bio, in raid10_write_request() argument
1410 struct r10conf *conf = mddev->private; in raid10_write_request()
1415 if ((mddev_is_clustered(mddev) && in raid10_write_request()
1416 md_cluster_ops->area_resyncing(mddev, WRITE, in raid10_write_request()
1428 if (!md_cluster_ops->area_resyncing(mddev, WRITE, in raid10_write_request()
1437 if (!regular_request_wait(mddev, conf, bio, sectors)) in raid10_write_request()
1439 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in raid10_write_request()
1440 (mddev->reshape_backwards in raid10_write_request()
1446 mddev->reshape_position = conf->reshape_progress; in raid10_write_request()
1447 set_mask_bits(&mddev->sb_flags, 0, in raid10_write_request()
1449 md_wakeup_thread(mddev->thread); in raid10_write_request()
1455 raid10_log(conf->mddev, "wait reshape metadata"); in raid10_write_request()
1456 wait_event(mddev->sb_wait, in raid10_write_request()
1457 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in raid10_write_request()
1459 conf->reshape_safe = mddev->reshape_position; in raid10_write_request()
1475 wait_blocked_dev(mddev, r10_bio); in raid10_write_request()
1554 md_account_bio(mddev, &bio); in raid10_write_request()
1557 md_bitmap_startwrite(mddev->bitmap, r10_bio->sector, r10_bio->sectors, 0); in raid10_write_request()
1561 raid10_write_one_disk(mddev, r10_bio, bio, false, i); in raid10_write_request()
1563 raid10_write_one_disk(mddev, r10_bio, bio, true, i); in raid10_write_request()
1568 static void __make_request(struct mddev *mddev, struct bio *bio, int sectors) in __make_request() argument
1570 struct r10conf *conf = mddev->private; in __make_request()
1578 r10_bio->mddev = mddev; in __make_request()
1586 raid10_read_request(mddev, bio, r10_bio, true); in __make_request()
1588 raid10_write_request(mddev, bio, r10_bio); in __make_request()
1593 struct r10conf *conf = r10bio->mddev->private; in raid_end_discard_bio()
1605 md_write_end(r10bio->mddev); in raid_end_discard_bio()
1616 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_discard_request()
1641 rdev_dec_pending(rdev, conf->mddev); in raid10_end_discard_request()
1650 static int raid10_handle_discard(struct mddev *mddev, struct bio *bio) in raid10_handle_discard() argument
1652 struct r10conf *conf = mddev->private; in raid10_handle_discard()
1671 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in raid10_handle_discard()
1684 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in raid10_handle_discard()
1762 r10_bio->mddev = mddev; in raid10_handle_discard()
1766 wait_blocked_dev(mddev, r10_bio); in raid10_handle_discard()
1832 dev_start = (first_stripe_index + 1) * mddev->chunk_sectors; in raid10_handle_discard()
1834 dev_start = first_stripe_index * mddev->chunk_sectors; in raid10_handle_discard()
1839 dev_end = (last_stripe_index + 1) * mddev->chunk_sectors; in raid10_handle_discard()
1841 dev_end = last_stripe_index * mddev->chunk_sectors; in raid10_handle_discard()
1854 &mddev->bio_set); in raid10_handle_discard()
1860 md_submit_discard_bio(mddev, rdev, mbio, in raid10_handle_discard()
1868 &mddev->bio_set); in raid10_handle_discard()
1874 md_submit_discard_bio(mddev, rrdev, rbio, in raid10_handle_discard()
1900 static bool raid10_make_request(struct mddev *mddev, struct bio *bio) in raid10_make_request() argument
1902 struct r10conf *conf = mddev->private; in raid10_make_request()
1908 && md_flush_request(mddev, bio)) in raid10_make_request()
1911 if (!md_write_start(mddev, bio)) in raid10_make_request()
1915 if (!raid10_handle_discard(mddev, bio)) in raid10_make_request()
1930 __make_request(mddev, bio, sectors); in raid10_make_request()
1937 static void raid10_status(struct seq_file *seq, struct mddev *mddev) in raid10_status() argument
1939 struct r10conf *conf = mddev->private; in raid10_status()
1943 seq_printf(seq, " %dK chunks", mddev->chunk_sectors / 2); in raid10_status()
1955 conf->geo.raid_disks - mddev->degraded); in raid10_status()
2032 static void raid10_error(struct mddev *mddev, struct md_rdev *rdev) in raid10_error() argument
2034 struct r10conf *conf = mddev->private; in raid10_error()
2040 set_bit(MD_BROKEN, &mddev->flags); in raid10_error()
2042 if (!mddev->fail_last_dev) { in raid10_error()
2048 mddev->degraded++; in raid10_error()
2050 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in raid10_error()
2053 set_mask_bits(&mddev->sb_flags, 0, in raid10_error()
2058 mdname(mddev), rdev->bdev, in raid10_error()
2059 mdname(mddev), conf->geo.raid_disks - mddev->degraded); in raid10_error()
2072 pr_debug(" --- wd:%d rd:%d\n", conf->geo.raid_disks - conf->mddev->degraded, in print_conf()
2095 static int raid10_spare_active(struct mddev *mddev) in raid10_spare_active() argument
2098 struct r10conf *conf = mddev->private; in raid10_spare_active()
2136 mddev->degraded -= count; in raid10_spare_active()
2143 static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev) in raid10_add_disk() argument
2145 struct r10conf *conf = mddev->private; in raid10_add_disk()
2152 if (mddev->recovery_cp < MaxSector) in raid10_add_disk()
2160 if (md_integrity_add_rdev(rdev, mddev)) in raid10_add_disk()
2174 if (p->recovery_disabled == mddev->recovery_disabled) in raid10_add_disk()
2183 if (mddev->gendisk) in raid10_add_disk()
2184 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid10_add_disk()
2188 p->recovery_disabled = mddev->recovery_disabled - 1; in raid10_add_disk()
2203 if (mddev->gendisk) in raid10_add_disk()
2204 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid10_add_disk()
2214 static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev) in raid10_remove_disk() argument
2216 struct r10conf *conf = mddev->private; in raid10_remove_disk()
2223 if (unlikely(number >= mddev->raid_disks)) in raid10_remove_disk()
2242 mddev->recovery_disabled != p->recovery_disabled && in raid10_remove_disk()
2270 err = md_integrity_register(mddev); in raid10_remove_disk()
2280 struct r10conf *conf = r10_bio->mddev->private; in __end_sync_read()
2294 rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev); in __end_sync_read()
2307 struct r10conf *conf = r10_bio->mddev->private; in end_sync_read()
2323 struct mddev *mddev = r10_bio->mddev; in end_sync_request() local
2334 md_done_sync(mddev, s, 1); in end_sync_request()
2351 struct mddev *mddev = r10_bio->mddev; in end_sync_write() local
2352 struct r10conf *conf = mddev->private; in end_sync_write()
2368 md_error(mddev, rdev); in end_sync_write()
2373 &rdev->mddev->recovery); in end_sync_write()
2382 rdev_dec_pending(rdev, mddev); in end_sync_write()
2403 static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio) in sync_request_write() argument
2405 struct r10conf *conf = mddev->private; in sync_request_write()
2462 atomic64_add(r10_bio->sectors, &mddev->resync_mismatches); in sync_request_write()
2463 if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) in sync_request_write()
2468 md_error(rdev->mddev, rdev); in sync_request_write()
2519 md_done_sync(mddev, r10_bio->sectors, 1); in sync_request_write()
2543 struct mddev *mddev = r10_bio->mddev; in fix_recovery_read_error() local
2544 struct r10conf *conf = mddev->private; in fix_recovery_read_error()
2582 &rdev->mddev->recovery); in fix_recovery_read_error()
2600 mdname(mddev)); in fix_recovery_read_error()
2603 = mddev->recovery_disabled; in fix_recovery_read_error()
2605 &mddev->recovery); in fix_recovery_read_error()
2617 static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) in recovery_request_write() argument
2619 struct r10conf *conf = mddev->private; in recovery_request_write()
2664 static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev) in check_decay_read_errors() argument
2710 &rdev->mddev->recovery); in r10_sync_page_io()
2714 md_error(rdev->mddev, rdev); in r10_sync_page_io()
2726 static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio) in fix_read_error() argument
2731 int max_read_errors = atomic_read(&mddev->max_corr_read_errors); in fix_read_error()
2744 check_decay_read_errors(mddev, rdev); in fix_read_error()
2748 mdname(mddev), rdev->bdev, in fix_read_error()
2751 mdname(mddev), rdev->bdev); in fix_read_error()
2752 md_error(mddev, rdev); in fix_read_error()
2786 rdev_dec_pending(rdev, mddev); in fix_read_error()
2810 md_error(mddev, rdev); in fix_read_error()
2840 mdname(mddev), s, in fix_read_error()
2847 mdname(mddev), in fix_read_error()
2850 rdev_dec_pending(rdev, mddev); in fix_read_error()
2874 mdname(mddev), s, in fix_read_error()
2880 mdname(mddev), in fix_read_error()
2885 mdname(mddev), s, in fix_read_error()
2893 rdev_dec_pending(rdev, mddev); in fix_read_error()
2906 struct mddev *mddev = r10_bio->mddev; in narrow_write_error() local
2907 struct r10conf *conf = mddev->private; in narrow_write_error()
2943 &mddev->bio_set); in narrow_write_error()
2964 static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) in handle_read_error() argument
2968 struct r10conf *conf = mddev->private; in handle_read_error()
2983 if (mddev->ro) in handle_read_error()
2987 fix_read_error(conf, mddev, r10_bio); in handle_read_error()
2990 md_error(mddev, rdev); in handle_read_error()
2992 rdev_dec_pending(rdev, mddev); in handle_read_error()
2994 raid10_read_request(mddev, r10_bio->master_bio, r10_bio, false); in handle_read_error()
3031 md_error(conf->mddev, rdev); in handle_write_completed()
3048 md_error(conf->mddev, rdev); in handle_write_completed()
3063 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
3067 md_error(conf->mddev, rdev); in handle_write_completed()
3071 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
3080 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
3093 md_wakeup_thread(conf->mddev->thread); in handle_write_completed()
3105 struct mddev *mddev = thread->mddev; in raid10d() local
3108 struct r10conf *conf = mddev->private; in raid10d()
3112 md_check_recovery(mddev); in raid10d()
3115 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in raid10d()
3118 if (!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in raid10d()
3129 if (mddev->degraded) in raid10d()
3154 mddev = r10_bio->mddev; in raid10d()
3155 conf = mddev->private; in raid10d()
3160 reshape_request_write(mddev, r10_bio); in raid10d()
3162 sync_request_write(mddev, r10_bio); in raid10d()
3164 recovery_request_write(mddev, r10_bio); in raid10d()
3166 handle_read_error(mddev, r10_bio); in raid10d()
3171 if (mddev->sb_flags & ~(1<<MD_SB_CHANGE_PENDING)) in raid10d()
3172 md_check_recovery(mddev); in raid10d()
3203 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || in raid10_alloc_init_r10buf()
3204 test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) in raid10_alloc_init_r10buf()
3250 window_size = (chunks + extra_chunk) * conf->mddev->chunk_sectors; in raid10_set_cluster_sync_high()
3293 static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, in raid10_sync_request() argument
3296 struct r10conf *conf = mddev->private; in raid10_sync_request()
3313 if (mddev->bitmap == NULL && in raid10_sync_request()
3314 mddev->recovery_cp == MaxSector && in raid10_sync_request()
3315 mddev->reshape_position == MaxSector && in raid10_sync_request()
3316 !test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && in raid10_sync_request()
3317 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && in raid10_sync_request()
3318 !test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in raid10_sync_request()
3321 return mddev->dev_sectors - sector_nr; in raid10_sync_request()
3329 max_sector = mddev->dev_sectors; in raid10_sync_request()
3330 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in raid10_sync_request()
3331 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in raid10_sync_request()
3332 max_sector = mddev->resync_max_sectors; in raid10_sync_request()
3346 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) { in raid10_sync_request()
3352 if (mddev->curr_resync < max_sector) { /* aborted */ in raid10_sync_request()
3353 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) in raid10_sync_request()
3354 md_bitmap_end_sync(mddev->bitmap, mddev->curr_resync, in raid10_sync_request()
3358 raid10_find_virt(conf, mddev->curr_resync, i); in raid10_sync_request()
3359 md_bitmap_end_sync(mddev->bitmap, sect, in raid10_sync_request()
3364 if ((!mddev->bitmap || conf->fullsync) in raid10_sync_request()
3366 && test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3381 md_bitmap_close_sync(mddev->bitmap); in raid10_sync_request()
3387 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in raid10_sync_request()
3388 return reshape_request(mddev, sector_nr, skipped); in raid10_sync_request()
3391 pr_err("md/raid10:%s: %s fails\n", mdname(mddev), in raid10_sync_request()
3392 test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ? "resync" : "recovery"); in raid10_sync_request()
3394 !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3400 mddev->recovery_disabled; in raid10_sync_request()
3411 if (max_sector > mddev->resync_max) in raid10_sync_request()
3412 max_sector = mddev->resync_max; /* Don't do IO beyond here */ in raid10_sync_request()
3444 if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3477 if (sect >= mddev->resync_max_sectors) { in raid10_sync_request()
3488 must_sync = md_bitmap_start_sync(mddev->bitmap, sect, in raid10_sync_request()
3516 r10_bio->mddev = mddev; in raid10_sync_request()
3535 must_sync = md_bitmap_start_sync(mddev->bitmap, sect, in raid10_sync_request()
3651 &mddev->recovery)) in raid10_sync_request()
3653 mdname(mddev)); in raid10_sync_request()
3655 = mddev->recovery_disabled; in raid10_sync_request()
3664 rdev_dec_pending(mrdev, mddev); in raid10_sync_request()
3666 rdev_dec_pending(mreplace, mddev); in raid10_sync_request()
3670 rdev_dec_pending(mrdev, mddev); in raid10_sync_request()
3672 rdev_dec_pending(mreplace, mddev); in raid10_sync_request()
3711 md_bitmap_cond_end_sync(mddev->bitmap, sector_nr, in raid10_sync_request()
3712 mddev_is_clustered(mddev) && in raid10_sync_request()
3715 if (!md_bitmap_start_sync(mddev->bitmap, sector_nr, in raid10_sync_request()
3716 &sync_blocks, mddev->degraded) && in raid10_sync_request()
3718 &mddev->recovery)) { in raid10_sync_request()
3728 r10_bio->mddev = mddev; in raid10_sync_request()
3810 mddev); in raid10_sync_request()
3815 mddev); in raid10_sync_request()
3847 if (mddev_is_clustered(mddev) && in raid10_sync_request()
3848 test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3851 conf->cluster_sync_low = mddev->curr_resync_completed; in raid10_sync_request()
3854 md_cluster_ops->resync_info_update(mddev, in raid10_sync_request()
3858 } else if (mddev_is_clustered(mddev)) { in raid10_sync_request()
3878 mddev->curr_resync_completed, i); in raid10_sync_request()
3887 md_cluster_ops->resync_info_update(mddev, in raid10_sync_request()
3912 md_done_sync(mddev, sectors_skipped, 1); in raid10_sync_request()
3930 raid10_size(struct mddev *mddev, sector_t sectors, int raid_disks) in raid10_size() argument
3933 struct r10conf *conf = mddev->private; in raid10_size()
3980 static int setup_geo(struct geom *geo, struct mddev *mddev, enum geo_type new) in setup_geo() argument
3986 layout = mddev->layout; in setup_geo()
3987 chunk = mddev->chunk_sectors; in setup_geo()
3988 disks = mddev->raid_disks - mddev->delta_disks; in setup_geo()
3991 layout = mddev->new_layout; in setup_geo()
3992 chunk = mddev->new_chunk_sectors; in setup_geo()
3993 disks = mddev->raid_disks; in setup_geo()
3998 layout = mddev->new_layout; in setup_geo()
3999 chunk = mddev->new_chunk_sectors; in setup_geo()
4000 disks = mddev->raid_disks + mddev->delta_disks; in setup_geo()
4050 static struct r10conf *setup_conf(struct mddev *mddev) in setup_conf() argument
4057 copies = setup_geo(&geo, mddev, geo_new); in setup_conf()
4061 mdname(mddev), PAGE_SIZE); in setup_conf()
4065 if (copies < 2 || copies > mddev->raid_disks) { in setup_conf()
4067 mdname(mddev), mddev->new_layout); in setup_conf()
4077 conf->mirrors = kcalloc(mddev->raid_disks + max(0, -mddev->delta_disks), in setup_conf()
4098 calc_sectors(conf, mddev->dev_sectors); in setup_conf()
4099 if (mddev->reshape_position == MaxSector) { in setup_conf()
4103 if (setup_geo(&conf->prev, mddev, geo_old) != conf->copies) { in setup_conf()
4107 conf->reshape_progress = mddev->reshape_position; in setup_conf()
4125 md_register_thread(raid10d, mddev, "raid10")); in setup_conf()
4129 conf->mddev = mddev; in setup_conf()
4143 blk_queue_io_opt(conf->mddev->queue, (conf->mddev->chunk_sectors << 9) * in raid10_set_io_opt()
4147 static int raid10_run(struct mddev *mddev) in raid10_run() argument
4157 if (mddev_init_writes_pending(mddev) < 0) in raid10_run()
4160 if (mddev->private == NULL) { in raid10_run()
4161 conf = setup_conf(mddev); in raid10_run()
4164 mddev->private = conf; in raid10_run()
4166 conf = mddev->private; in raid10_run()
4170 rcu_assign_pointer(mddev->thread, conf->thread); in raid10_run()
4173 if (mddev_is_clustered(conf->mddev)) { in raid10_run()
4176 fc = (mddev->layout >> 8) & 255; in raid10_run()
4177 fo = mddev->layout & (1<<16); in raid10_run()
4185 if (mddev->queue) { in raid10_run()
4186 blk_queue_max_write_zeroes_sectors(mddev->queue, 0); in raid10_run()
4187 blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9); in raid10_run()
4191 rdev_for_each(rdev, mddev) { in raid10_run()
4212 if (!mddev->reshape_backwards) in raid10_run()
4219 if (mddev->gendisk) in raid10_run()
4220 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid10_run()
4230 mdname(mddev)); in raid10_run()
4244 mddev->degraded = 0; in raid10_run()
4262 mddev->degraded++; in raid10_run()
4274 disk->recovery_disabled = mddev->recovery_disabled - 1; in raid10_run()
4277 if (mddev->recovery_cp != MaxSector) in raid10_run()
4279 mdname(mddev)); in raid10_run()
4281 mdname(mddev), conf->geo.raid_disks - mddev->degraded, in raid10_run()
4286 mddev->dev_sectors = conf->dev_sectors; in raid10_run()
4287 size = raid10_size(mddev, 0, 0); in raid10_run()
4288 md_set_array_sectors(mddev, size); in raid10_run()
4289 mddev->resync_max_sectors = size; in raid10_run()
4290 set_bit(MD_FAILFAST_SUPPORTED, &mddev->flags); in raid10_run()
4292 if (md_integrity_register(mddev)) in raid10_run()
4310 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in raid10_run()
4311 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in raid10_run()
4312 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in raid10_run()
4313 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in raid10_run()
4314 rcu_assign_pointer(mddev->sync_thread, in raid10_run()
4315 md_register_thread(md_do_sync, mddev, "reshape")); in raid10_run()
4316 if (!mddev->sync_thread) in raid10_run()
4323 md_unregister_thread(mddev, &mddev->thread); in raid10_run()
4325 mddev->private = NULL; in raid10_run()
4330 static void raid10_free(struct mddev *mddev, void *priv) in raid10_free() argument
4335 static void raid10_quiesce(struct mddev *mddev, int quiesce) in raid10_quiesce() argument
4337 struct r10conf *conf = mddev->private; in raid10_quiesce()
4345 static int raid10_resize(struct mddev *mddev, sector_t sectors) in raid10_resize() argument
4359 struct r10conf *conf = mddev->private; in raid10_resize()
4362 if (mddev->reshape_position != MaxSector) in raid10_resize()
4368 oldsize = raid10_size(mddev, 0, 0); in raid10_resize()
4369 size = raid10_size(mddev, sectors, 0); in raid10_resize()
4370 if (mddev->external_size && in raid10_resize()
4371 mddev->array_sectors > size) in raid10_resize()
4373 if (mddev->bitmap) { in raid10_resize()
4374 int ret = md_bitmap_resize(mddev->bitmap, size, 0, 0); in raid10_resize()
4378 md_set_array_sectors(mddev, size); in raid10_resize()
4379 if (sectors > mddev->dev_sectors && in raid10_resize()
4380 mddev->recovery_cp > oldsize) { in raid10_resize()
4381 mddev->recovery_cp = oldsize; in raid10_resize()
4382 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in raid10_resize()
4385 mddev->dev_sectors = conf->dev_sectors; in raid10_resize()
4386 mddev->resync_max_sectors = size; in raid10_resize()
4390 static void *raid10_takeover_raid0(struct mddev *mddev, sector_t size, int devs) in raid10_takeover_raid0() argument
4395 if (mddev->degraded > 0) { in raid10_takeover_raid0()
4397 mdname(mddev)); in raid10_takeover_raid0()
4403 mddev->new_level = 10; in raid10_takeover_raid0()
4405 mddev->new_layout = (1<<8) + 2; in raid10_takeover_raid0()
4406 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid10_takeover_raid0()
4407 mddev->delta_disks = mddev->raid_disks; in raid10_takeover_raid0()
4408 mddev->raid_disks *= 2; in raid10_takeover_raid0()
4410 mddev->recovery_cp = MaxSector; in raid10_takeover_raid0()
4411 mddev->dev_sectors = size; in raid10_takeover_raid0()
4413 conf = setup_conf(mddev); in raid10_takeover_raid0()
4415 rdev_for_each(rdev, mddev) in raid10_takeover_raid0()
4425 static void *raid10_takeover(struct mddev *mddev) in raid10_takeover() argument
4432 if (mddev->level == 0) { in raid10_takeover()
4434 raid0_conf = mddev->private; in raid10_takeover()
4437 mdname(mddev)); in raid10_takeover()
4440 return raid10_takeover_raid0(mddev, in raid10_takeover()
4447 static int raid10_check_reshape(struct mddev *mddev) in raid10_check_reshape() argument
4463 struct r10conf *conf = mddev->private; in raid10_check_reshape()
4469 if (setup_geo(&geo, mddev, geo_start) != conf->copies) in raid10_check_reshape()
4476 if (mddev->array_sectors & geo.chunk_mask) in raid10_check_reshape()
4485 if (mddev->delta_disks > 0) { in raid10_check_reshape()
4488 kcalloc(mddev->raid_disks + mddev->delta_disks, in raid10_check_reshape()
4554 static int raid10_start_reshape(struct mddev *mddev) in raid10_start_reshape() argument
4570 struct r10conf *conf = mddev->private; in raid10_start_reshape()
4575 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in raid10_start_reshape()
4578 if (setup_geo(&new, mddev, geo_start) != conf->copies) in raid10_start_reshape()
4586 rdev_for_each(rdev, mddev) { in raid10_start_reshape()
4593 if (!mddev->reshape_backwards) in raid10_start_reshape()
4606 if (spares < mddev->delta_disks) in raid10_start_reshape()
4620 setup_geo(&conf->geo, mddev, geo_start); in raid10_start_reshape()
4622 if (mddev->reshape_backwards) { in raid10_start_reshape()
4623 sector_t size = raid10_size(mddev, 0, 0); in raid10_start_reshape()
4624 if (size < mddev->array_sectors) { in raid10_start_reshape()
4627 mdname(mddev)); in raid10_start_reshape()
4630 mddev->resync_max_sectors = size; in raid10_start_reshape()
4637 if (mddev->delta_disks && mddev->bitmap) { in raid10_start_reshape()
4641 oldsize = raid10_size(mddev, 0, 0); in raid10_start_reshape()
4642 newsize = raid10_size(mddev, 0, conf->geo.raid_disks); in raid10_start_reshape()
4644 if (!mddev_is_clustered(mddev)) { in raid10_start_reshape()
4645 ret = md_bitmap_resize(mddev->bitmap, newsize, 0, 0); in raid10_start_reshape()
4652 rdev_for_each(rdev, mddev) { in raid10_start_reshape()
4667 ret = md_bitmap_resize(mddev->bitmap, newsize, 0, 0); in raid10_start_reshape()
4671 ret = md_cluster_ops->resize_bitmaps(mddev, newsize, oldsize); in raid10_start_reshape()
4673 md_bitmap_resize(mddev->bitmap, oldsize, 0, 0); in raid10_start_reshape()
4678 if (mddev->delta_disks > 0) { in raid10_start_reshape()
4679 rdev_for_each(rdev, mddev) in raid10_start_reshape()
4682 if (raid10_add_disk(mddev, rdev) == 0) { in raid10_start_reshape()
4690 sysfs_link_rdev(mddev, rdev); in raid10_start_reshape()
4703 mddev->degraded = calc_degraded(conf); in raid10_start_reshape()
4705 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4706 mddev->reshape_position = conf->reshape_progress; in raid10_start_reshape()
4707 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in raid10_start_reshape()
4709 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in raid10_start_reshape()
4710 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in raid10_start_reshape()
4711 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in raid10_start_reshape()
4712 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in raid10_start_reshape()
4713 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in raid10_start_reshape()
4715 rcu_assign_pointer(mddev->sync_thread, in raid10_start_reshape()
4716 md_register_thread(md_do_sync, mddev, "reshape")); in raid10_start_reshape()
4717 if (!mddev->sync_thread) { in raid10_start_reshape()
4722 md_wakeup_thread(mddev->sync_thread); in raid10_start_reshape()
4727 mddev->recovery = 0; in raid10_start_reshape()
4730 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4731 rdev_for_each(rdev, mddev) in raid10_start_reshape()
4736 mddev->reshape_position = MaxSector; in raid10_start_reshape()
4772 static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, in reshape_request() argument
4812 struct r10conf *conf = mddev->private; in reshape_request()
4827 if (mddev->reshape_backwards && in reshape_request()
4828 conf->reshape_progress < raid10_size(mddev, 0, 0)) { in reshape_request()
4829 sector_nr = (raid10_size(mddev, 0, 0) in reshape_request()
4831 } else if (!mddev->reshape_backwards && in reshape_request()
4835 mddev->curr_resync_completed = sector_nr; in reshape_request()
4836 sysfs_notify_dirent_safe(mddev->sysfs_completed); in reshape_request()
4846 if (mddev->reshape_backwards) { in reshape_request()
4896 mddev->reshape_position = conf->reshape_progress; in reshape_request()
4897 if (mddev->reshape_backwards) in reshape_request()
4898 mddev->curr_resync_completed = raid10_size(mddev, 0, 0) in reshape_request()
4901 mddev->curr_resync_completed = conf->reshape_progress; in reshape_request()
4903 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in reshape_request()
4904 md_wakeup_thread(mddev->thread); in reshape_request()
4905 wait_event(mddev->sb_wait, mddev->sb_flags == 0 || in reshape_request()
4906 test_bit(MD_RECOVERY_INTR, &mddev->recovery)); in reshape_request()
4907 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in reshape_request()
4911 conf->reshape_safe = mddev->reshape_position; in reshape_request()
4922 r10_bio->mddev = mddev; in reshape_request()
4935 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in reshape_request()
4940 GFP_KERNEL, &mddev->bio_set); in reshape_request()
4952 if (mddev_is_clustered(mddev) && conf->cluster_sync_high <= sector_nr) { in reshape_request()
4970 md_cluster_ops->resync_info_update(mddev, conf->cluster_sync_low, in reshape_request()
5040 if (mddev->reshape_backwards) in reshape_request()
5049 static int handle_reshape_read_error(struct mddev *mddev,
5051 static void reshape_request_write(struct mddev *mddev, struct r10bio *r10_bio) in reshape_request_write() argument
5058 struct r10conf *conf = mddev->private; in reshape_request_write()
5062 if (handle_reshape_read_error(mddev, r10_bio) < 0) { in reshape_request_write()
5064 md_done_sync(mddev, r10_bio->sectors, 0); in reshape_request_write()
5100 if (test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) in end_reshape()
5105 md_finish_reshape(conf->mddev); in end_reshape()
5111 if (conf->mddev->queue) in end_reshape()
5116 static void raid10_update_reshape_pos(struct mddev *mddev) in raid10_update_reshape_pos() argument
5118 struct r10conf *conf = mddev->private; in raid10_update_reshape_pos()
5121 md_cluster_ops->resync_info_get(mddev, &lo, &hi); in raid10_update_reshape_pos()
5122 if (((mddev->reshape_position <= hi) && (mddev->reshape_position >= lo)) in raid10_update_reshape_pos()
5123 || mddev->reshape_position == MaxSector) in raid10_update_reshape_pos()
5124 conf->reshape_progress = mddev->reshape_position; in raid10_update_reshape_pos()
5129 static int handle_reshape_read_error(struct mddev *mddev, in handle_reshape_read_error() argument
5134 struct r10conf *conf = mddev->private; in handle_reshape_read_error()
5142 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in handle_reshape_read_error()
5178 rdev_dec_pending(rdev, mddev); in handle_reshape_read_error()
5193 &mddev->recovery); in handle_reshape_read_error()
5207 struct mddev *mddev = r10_bio->mddev; in end_reshape_write() local
5208 struct r10conf *conf = mddev->private; in end_reshape_write()
5224 md_error(mddev, rdev); in end_reshape_write()
5227 rdev_dec_pending(rdev, mddev); in end_reshape_write()
5235 md_done_sync(r10_bio->mddev, r10_bio->sectors, 1); in end_reshape_request()
5240 static void raid10_finish_reshape(struct mddev *mddev) in raid10_finish_reshape() argument
5242 struct r10conf *conf = mddev->private; in raid10_finish_reshape()
5244 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in raid10_finish_reshape()
5247 if (mddev->delta_disks > 0) { in raid10_finish_reshape()
5248 if (mddev->recovery_cp > mddev->resync_max_sectors) { in raid10_finish_reshape()
5249 mddev->recovery_cp = mddev->resync_max_sectors; in raid10_finish_reshape()
5250 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in raid10_finish_reshape()
5252 mddev->resync_max_sectors = mddev->array_sectors; in raid10_finish_reshape()
5257 d < conf->geo.raid_disks - mddev->delta_disks; in raid10_finish_reshape()
5268 mddev->layout = mddev->new_layout; in raid10_finish_reshape()
5269 mddev->chunk_sectors = 1 << conf->geo.chunk_shift; in raid10_finish_reshape()
5270 mddev->reshape_position = MaxSector; in raid10_finish_reshape()
5271 mddev->delta_disks = 0; in raid10_finish_reshape()
5272 mddev->reshape_backwards = 0; in raid10_finish_reshape()