Lines Matching refs:mddev

104 static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
106 static void reshape_request_write(struct mddev *mddev, struct r10bio *r10_bio);
167 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || in r10buf_pool_alloc()
168 test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) in r10buf_pool_alloc()
212 &conf->mddev->recovery)) { in r10buf_pool_alloc()
293 struct r10conf *conf = r10_bio->mddev->private; in free_r10bio()
301 struct r10conf *conf = r10_bio->mddev->private; in put_buf()
311 struct mddev *mddev = r10_bio->mddev; in reschedule_retry() local
312 struct r10conf *conf = mddev->private; in reschedule_retry()
322 md_wakeup_thread(mddev->thread); in reschedule_retry()
333 struct r10conf *conf = r10_bio->mddev->private; in raid_end_bio_io()
353 struct r10conf *conf = r10_bio->mddev->private; in update_head_pos()
393 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_read_request()
425 rdev_dec_pending(rdev, conf->mddev); in raid10_end_read_request()
432 mdname(conf->mddev), in raid10_end_read_request()
443 md_bitmap_endwrite(r10_bio->mddev->bitmap, r10_bio->sector, in close_write()
447 md_write_end(r10_bio->mddev); in close_write()
470 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_write_request()
495 md_error(rdev->mddev, rdev); in raid10_end_write_request()
500 &rdev->mddev->recovery); in raid10_end_write_request()
505 md_error(rdev->mddev, rdev); in raid10_end_write_request()
567 rdev_dec_pending(rdev, conf->mddev); in raid10_end_write_request()
666 conf->mddev->reshape_backwards)) { in raid10_find_phys()
767 if ((conf->mddev->recovery_cp < MaxSector in read_balance()
769 (mddev_is_clustered(conf->mddev) && in read_balance()
770 md_cluster_ops->area_resyncing(conf->mddev, READ, this_sector, in read_balance()
866 static int raid10_congested(struct mddev *mddev, int bits) in raid10_congested() argument
868 struct r10conf *conf = mddev->private; in raid10_congested()
920 md_bitmap_unplug(conf->mddev->bitmap); in flush_pending_writes()
1008 raid10_log(conf->mddev, "wait barrier"); in wait_barrier()
1071 if (!test_bit(MD_RECOVERY_RESHAPE, &rdev->mddev->recovery) || in choose_data_offset()
1088 struct mddev *mddev = plug->cb.data; in raid10_unplug() local
1089 struct r10conf *conf = mddev->private; in raid10_unplug()
1098 md_wakeup_thread(mddev->thread); in raid10_unplug()
1105 md_bitmap_unplug(mddev->bitmap); in raid10_unplug()
1126 static void raid10_read_request(struct mddev *mddev, struct bio *bio, in raid10_read_request() argument
1129 struct r10conf *conf = mddev->private; in raid10_read_request()
1176 while (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in raid10_read_request()
1183 raid10_log(conf->mddev, "wait reshape"); in raid10_read_request()
1196 mdname(mddev), b, in raid10_read_request()
1204 mdname(mddev), in raid10_read_request()
1218 read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set); in raid10_read_request()
1233 if (mddev->gendisk) in raid10_read_request()
1235 read_bio, disk_devt(mddev->gendisk), in raid10_read_request()
1241 static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio, in raid10_write_one_disk() argument
1251 struct r10conf *conf = mddev->private; in raid10_write_one_disk()
1266 mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set); in raid10_write_one_disk()
1283 if (conf->mddev->gendisk) in raid10_write_one_disk()
1285 mbio, disk_devt(conf->mddev->gendisk), in raid10_write_one_disk()
1292 cb = blk_check_plugged(raid10_unplug, mddev, sizeof(*plug)); in raid10_write_one_disk()
1305 md_wakeup_thread(mddev->thread); in raid10_write_one_disk()
1309 static void raid10_write_request(struct mddev *mddev, struct bio *bio, in raid10_write_request() argument
1312 struct r10conf *conf = mddev->private; in raid10_write_request()
1318 if ((mddev_is_clustered(mddev) && in raid10_write_request()
1319 md_cluster_ops->area_resyncing(mddev, WRITE, in raid10_write_request()
1326 if (!md_cluster_ops->area_resyncing(mddev, WRITE, in raid10_write_request()
1342 while (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in raid10_write_request()
1349 raid10_log(conf->mddev, "wait reshape"); in raid10_write_request()
1358 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in raid10_write_request()
1359 (mddev->reshape_backwards in raid10_write_request()
1365 mddev->reshape_position = conf->reshape_progress; in raid10_write_request()
1366 set_mask_bits(&mddev->sb_flags, 0, in raid10_write_request()
1368 md_wakeup_thread(mddev->thread); in raid10_write_request()
1369 raid10_log(conf->mddev, "wait reshape metadata"); in raid10_write_request()
1370 wait_event(mddev->sb_wait, in raid10_write_request()
1371 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)); in raid10_write_request()
1373 conf->reshape_safe = mddev->reshape_position; in raid10_write_request()
1377 md_wakeup_thread(mddev->thread); in raid10_write_request()
1378 raid10_log(mddev, "wait queued"); in raid10_write_request()
1488 rdev_dec_pending(conf->mirrors[d].rdev, mddev); in raid10_write_request()
1499 rdev_dec_pending(rdev, mddev); in raid10_write_request()
1503 raid10_log(conf->mddev, "wait rdev %d blocked", blocked_rdev->raid_disk); in raid10_write_request()
1504 md_wait_for_blocked_rdev(blocked_rdev, mddev); in raid10_write_request()
1522 md_bitmap_startwrite(mddev->bitmap, r10_bio->sector, r10_bio->sectors, 0); in raid10_write_request()
1526 raid10_write_one_disk(mddev, r10_bio, bio, false, i); in raid10_write_request()
1528 raid10_write_one_disk(mddev, r10_bio, bio, true, i); in raid10_write_request()
1533 static void __make_request(struct mddev *mddev, struct bio *bio, int sectors) in __make_request() argument
1535 struct r10conf *conf = mddev->private; in __make_request()
1543 r10_bio->mddev = mddev; in __make_request()
1549 raid10_read_request(mddev, bio, r10_bio); in __make_request()
1551 raid10_write_request(mddev, bio, r10_bio); in __make_request()
1554 static bool raid10_make_request(struct mddev *mddev, struct bio *bio) in raid10_make_request() argument
1556 struct r10conf *conf = mddev->private; in raid10_make_request()
1562 md_flush_request(mddev, bio); in raid10_make_request()
1566 if (!md_write_start(mddev, bio)) in raid10_make_request()
1581 __make_request(mddev, bio, sectors); in raid10_make_request()
1588 static void raid10_status(struct seq_file *seq, struct mddev *mddev) in raid10_status() argument
1590 struct r10conf *conf = mddev->private; in raid10_status()
1594 seq_printf(seq, " %dK chunks", mddev->chunk_sectors / 2); in raid10_status()
1606 conf->geo.raid_disks - mddev->degraded); in raid10_status()
1668 static void raid10_error(struct mddev *mddev, struct md_rdev *rdev) in raid10_error() argument
1671 struct r10conf *conf = mddev->private; in raid10_error()
1690 mddev->degraded++; in raid10_error()
1694 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in raid10_error()
1697 set_mask_bits(&mddev->sb_flags, 0, in raid10_error()
1702 mdname(mddev), bdevname(rdev->bdev, b), in raid10_error()
1703 mdname(mddev), conf->geo.raid_disks - mddev->degraded); in raid10_error()
1716 pr_debug(" --- wd:%d rd:%d\n", conf->geo.raid_disks - conf->mddev->degraded, in print_conf()
1740 static int raid10_spare_active(struct mddev *mddev) in raid10_spare_active() argument
1743 struct r10conf *conf = mddev->private; in raid10_spare_active()
1781 mddev->degraded -= count; in raid10_spare_active()
1788 static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev) in raid10_add_disk() argument
1790 struct r10conf *conf = mddev->private; in raid10_add_disk()
1796 if (mddev->recovery_cp < MaxSector) in raid10_add_disk()
1804 if (md_integrity_add_rdev(rdev, mddev)) in raid10_add_disk()
1817 if (p->recovery_disabled == mddev->recovery_disabled) in raid10_add_disk()
1827 if (mddev->gendisk) in raid10_add_disk()
1828 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid10_add_disk()
1835 if (mddev->gendisk) in raid10_add_disk()
1836 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid10_add_disk()
1840 p->recovery_disabled = mddev->recovery_disabled - 1; in raid10_add_disk()
1848 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev))) in raid10_add_disk()
1849 blk_queue_flag_set(QUEUE_FLAG_DISCARD, mddev->queue); in raid10_add_disk()
1855 static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev) in raid10_remove_disk() argument
1857 struct r10conf *conf = mddev->private; in raid10_remove_disk()
1880 mddev->recovery_disabled != p->recovery_disabled && in raid10_remove_disk()
1908 err = md_integrity_register(mddev); in raid10_remove_disk()
1918 struct r10conf *conf = r10_bio->mddev->private; in __end_sync_read()
1932 rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev); in __end_sync_read()
1945 struct r10conf *conf = r10_bio->mddev->private; in end_sync_read()
1961 struct mddev *mddev = r10_bio->mddev; in end_sync_request() local
1972 md_done_sync(mddev, s, 1); in end_sync_request()
1989 struct mddev *mddev = r10_bio->mddev; in end_sync_write() local
1990 struct r10conf *conf = mddev->private; in end_sync_write()
2006 md_error(mddev, rdev); in end_sync_write()
2011 &rdev->mddev->recovery); in end_sync_write()
2020 rdev_dec_pending(rdev, mddev); in end_sync_write()
2041 static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio) in sync_request_write() argument
2043 struct r10conf *conf = mddev->private; in sync_request_write()
2100 atomic64_add(r10_bio->sectors, &mddev->resync_mismatches); in sync_request_write()
2101 if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) in sync_request_write()
2106 md_error(rdev->mddev, rdev); in sync_request_write()
2159 md_done_sync(mddev, r10_bio->sectors, 1); in sync_request_write()
2183 struct mddev *mddev = r10_bio->mddev; in fix_recovery_read_error() local
2184 struct r10conf *conf = mddev->private; in fix_recovery_read_error()
2222 &rdev->mddev->recovery); in fix_recovery_read_error()
2240 mdname(mddev)); in fix_recovery_read_error()
2243 = mddev->recovery_disabled; in fix_recovery_read_error()
2245 &mddev->recovery); in fix_recovery_read_error()
2257 static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) in recovery_request_write() argument
2259 struct r10conf *conf = mddev->private; in recovery_request_write()
2301 static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev) in check_decay_read_errors() argument
2347 &rdev->mddev->recovery); in r10_sync_page_io()
2351 md_error(rdev->mddev, rdev); in r10_sync_page_io()
2363 static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio) in fix_read_error() argument
2368 int max_read_errors = atomic_read(&mddev->max_corr_read_errors); in fix_read_error()
2381 check_decay_read_errors(mddev, rdev); in fix_read_error()
2388 mdname(mddev), b, in fix_read_error()
2391 mdname(mddev), b); in fix_read_error()
2392 md_error(mddev, rdev); in fix_read_error()
2426 rdev_dec_pending(rdev, mddev); in fix_read_error()
2450 md_error(mddev, rdev); in fix_read_error()
2482 mdname(mddev), s, in fix_read_error()
2489 mdname(mddev), in fix_read_error()
2492 rdev_dec_pending(rdev, mddev); in fix_read_error()
2519 mdname(mddev), s, in fix_read_error()
2525 mdname(mddev), in fix_read_error()
2530 mdname(mddev), s, in fix_read_error()
2538 rdev_dec_pending(rdev, mddev); in fix_read_error()
2551 struct mddev *mddev = r10_bio->mddev; in narrow_write_error() local
2552 struct r10conf *conf = mddev->private; in narrow_write_error()
2587 wbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set); in narrow_write_error()
2609 static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) in handle_read_error() argument
2613 struct r10conf *conf = mddev->private; in handle_read_error()
2628 if (mddev->ro) in handle_read_error()
2632 fix_read_error(conf, mddev, r10_bio); in handle_read_error()
2635 md_error(mddev, rdev); in handle_read_error()
2637 rdev_dec_pending(rdev, mddev); in handle_read_error()
2640 raid10_read_request(mddev, r10_bio->master_bio, r10_bio); in handle_read_error()
2672 md_error(conf->mddev, rdev); in handle_write_completed()
2689 md_error(conf->mddev, rdev); in handle_write_completed()
2704 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
2708 md_error(conf->mddev, rdev); in handle_write_completed()
2712 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
2721 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
2734 md_wakeup_thread(conf->mddev->thread); in handle_write_completed()
2746 struct mddev *mddev = thread->mddev; in raid10d() local
2749 struct r10conf *conf = mddev->private; in raid10d()
2753 md_check_recovery(mddev); in raid10d()
2756 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in raid10d()
2759 if (!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { in raid10d()
2770 if (mddev->degraded) in raid10d()
2795 mddev = r10_bio->mddev; in raid10d()
2796 conf = mddev->private; in raid10d()
2801 reshape_request_write(mddev, r10_bio); in raid10d()
2803 sync_request_write(mddev, r10_bio); in raid10d()
2805 recovery_request_write(mddev, r10_bio); in raid10d()
2807 handle_read_error(mddev, r10_bio); in raid10d()
2812 if (mddev->sb_flags & ~(1<<MD_SB_CHANGE_PENDING)) in raid10d()
2813 md_check_recovery(mddev); in raid10d()
2844 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || in raid10_alloc_init_r10buf()
2845 test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) in raid10_alloc_init_r10buf()
2891 window_size = (chunks + extra_chunk) * conf->mddev->chunk_sectors; in raid10_set_cluster_sync_high()
2934 static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr, in raid10_sync_request() argument
2937 struct r10conf *conf = mddev->private; in raid10_sync_request()
2957 if (mddev->bitmap == NULL && in raid10_sync_request()
2958 mddev->recovery_cp == MaxSector && in raid10_sync_request()
2959 mddev->reshape_position == MaxSector && in raid10_sync_request()
2960 !test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && in raid10_sync_request()
2961 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && in raid10_sync_request()
2962 !test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && in raid10_sync_request()
2965 return mddev->dev_sectors - sector_nr; in raid10_sync_request()
2969 max_sector = mddev->dev_sectors; in raid10_sync_request()
2970 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || in raid10_sync_request()
2971 test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in raid10_sync_request()
2972 max_sector = mddev->resync_max_sectors; in raid10_sync_request()
2986 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) { in raid10_sync_request()
2992 if (mddev->curr_resync < max_sector) { /* aborted */ in raid10_sync_request()
2993 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) in raid10_sync_request()
2994 md_bitmap_end_sync(mddev->bitmap, mddev->curr_resync, in raid10_sync_request()
2998 raid10_find_virt(conf, mddev->curr_resync, i); in raid10_sync_request()
2999 md_bitmap_end_sync(mddev->bitmap, sect, in raid10_sync_request()
3004 if ((!mddev->bitmap || conf->fullsync) in raid10_sync_request()
3006 && test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3021 md_bitmap_close_sync(mddev->bitmap); in raid10_sync_request()
3027 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) in raid10_sync_request()
3028 return reshape_request(mddev, sector_nr, skipped); in raid10_sync_request()
3038 if (max_sector > mddev->resync_max) in raid10_sync_request()
3039 max_sector = mddev->resync_max; /* Don't do IO beyond here */ in raid10_sync_request()
3071 if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3102 if (sect >= mddev->resync_max_sectors) { in raid10_sync_request()
3115 must_sync = md_bitmap_start_sync(mddev->bitmap, sect, in raid10_sync_request()
3142 r10_bio->mddev = mddev; in raid10_sync_request()
3161 must_sync = md_bitmap_start_sync(mddev->bitmap, sect, in raid10_sync_request()
3282 &mddev->recovery)) in raid10_sync_request()
3284 mdname(mddev)); in raid10_sync_request()
3286 = mddev->recovery_disabled; in raid10_sync_request()
3292 rdev_dec_pending(mrdev, mddev); in raid10_sync_request()
3294 rdev_dec_pending(mreplace, mddev); in raid10_sync_request()
3297 rdev_dec_pending(mrdev, mddev); in raid10_sync_request()
3299 rdev_dec_pending(mreplace, mddev); in raid10_sync_request()
3338 md_bitmap_cond_end_sync(mddev->bitmap, sector_nr, in raid10_sync_request()
3339 mddev_is_clustered(mddev) && in raid10_sync_request()
3342 if (!md_bitmap_start_sync(mddev->bitmap, sector_nr, in raid10_sync_request()
3343 &sync_blocks, mddev->degraded) && in raid10_sync_request()
3345 &mddev->recovery)) { in raid10_sync_request()
3355 r10_bio->mddev = mddev; in raid10_sync_request()
3437 mddev); in raid10_sync_request()
3442 mddev); in raid10_sync_request()
3474 if (mddev_is_clustered(mddev) && in raid10_sync_request()
3475 test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { in raid10_sync_request()
3478 conf->cluster_sync_low = mddev->curr_resync_completed; in raid10_sync_request()
3481 md_cluster_ops->resync_info_update(mddev, in raid10_sync_request()
3485 } else if (mddev_is_clustered(mddev)) { in raid10_sync_request()
3505 mddev->curr_resync_completed, i); in raid10_sync_request()
3514 md_cluster_ops->resync_info_update(mddev, in raid10_sync_request()
3539 md_done_sync(mddev, sectors_skipped, 1); in raid10_sync_request()
3557 raid10_size(struct mddev *mddev, sector_t sectors, int raid_disks) in raid10_size() argument
3560 struct r10conf *conf = mddev->private; in raid10_size()
3607 static int setup_geo(struct geom *geo, struct mddev *mddev, enum geo_type new) in setup_geo() argument
3613 layout = mddev->layout; in setup_geo()
3614 chunk = mddev->chunk_sectors; in setup_geo()
3615 disks = mddev->raid_disks - mddev->delta_disks; in setup_geo()
3618 layout = mddev->new_layout; in setup_geo()
3619 chunk = mddev->new_chunk_sectors; in setup_geo()
3620 disks = mddev->raid_disks; in setup_geo()
3625 layout = mddev->new_layout; in setup_geo()
3626 chunk = mddev->new_chunk_sectors; in setup_geo()
3627 disks = mddev->raid_disks + mddev->delta_disks; in setup_geo()
3663 static struct r10conf *setup_conf(struct mddev *mddev) in setup_conf() argument
3670 copies = setup_geo(&geo, mddev, geo_new); in setup_conf()
3674 mdname(mddev), PAGE_SIZE); in setup_conf()
3678 if (copies < 2 || copies > mddev->raid_disks) { in setup_conf()
3680 mdname(mddev), mddev->new_layout); in setup_conf()
3690 conf->mirrors = kcalloc(mddev->raid_disks + max(0, -mddev->delta_disks), in setup_conf()
3711 calc_sectors(conf, mddev->dev_sectors); in setup_conf()
3712 if (mddev->reshape_position == MaxSector) { in setup_conf()
3716 if (setup_geo(&conf->prev, mddev, geo_old) != conf->copies) { in setup_conf()
3720 conf->reshape_progress = mddev->reshape_position; in setup_conf()
3737 conf->thread = md_register_thread(raid10d, mddev, "raid10"); in setup_conf()
3741 conf->mddev = mddev; in setup_conf()
3755 static int raid10_run(struct mddev *mddev) in raid10_run() argument
3766 if (mddev_init_writes_pending(mddev) < 0) in raid10_run()
3769 if (mddev->private == NULL) { in raid10_run()
3770 conf = setup_conf(mddev); in raid10_run()
3773 mddev->private = conf; in raid10_run()
3775 conf = mddev->private; in raid10_run()
3779 if (mddev_is_clustered(conf->mddev)) { in raid10_run()
3782 fc = (mddev->layout >> 8) & 255; in raid10_run()
3783 fo = mddev->layout & (1<<16); in raid10_run()
3791 mddev->thread = conf->thread; in raid10_run()
3794 chunk_size = mddev->chunk_sectors << 9; in raid10_run()
3795 if (mddev->queue) { in raid10_run()
3796 blk_queue_max_discard_sectors(mddev->queue, in raid10_run()
3797 mddev->chunk_sectors); in raid10_run()
3798 blk_queue_max_write_same_sectors(mddev->queue, 0); in raid10_run()
3799 blk_queue_max_write_zeroes_sectors(mddev->queue, 0); in raid10_run()
3800 blk_queue_io_min(mddev->queue, chunk_size); in raid10_run()
3802 blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); in raid10_run()
3804 blk_queue_io_opt(mddev->queue, chunk_size * in raid10_run()
3808 rdev_for_each(rdev, mddev) { in raid10_run()
3829 if (!mddev->reshape_backwards) in raid10_run()
3836 if (mddev->gendisk) in raid10_run()
3837 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid10_run()
3847 if (mddev->queue) { in raid10_run()
3850 mddev->queue); in raid10_run()
3853 mddev->queue); in raid10_run()
3858 mdname(mddev)); in raid10_run()
3872 mddev->degraded = 0; in raid10_run()
3890 mddev->degraded++; in raid10_run()
3902 disk->recovery_disabled = mddev->recovery_disabled - 1; in raid10_run()
3905 if (mddev->recovery_cp != MaxSector) in raid10_run()
3907 mdname(mddev)); in raid10_run()
3909 mdname(mddev), conf->geo.raid_disks - mddev->degraded, in raid10_run()
3914 mddev->dev_sectors = conf->dev_sectors; in raid10_run()
3915 size = raid10_size(mddev, 0, 0); in raid10_run()
3916 md_set_array_sectors(mddev, size); in raid10_run()
3917 mddev->resync_max_sectors = size; in raid10_run()
3918 set_bit(MD_FAILFAST_SUPPORTED, &mddev->flags); in raid10_run()
3920 if (mddev->queue) { in raid10_run()
3922 ((mddev->chunk_sectors << 9) / PAGE_SIZE); in raid10_run()
3929 if (mddev->queue->backing_dev_info->ra_pages < 2 * stripe) in raid10_run()
3930 mddev->queue->backing_dev_info->ra_pages = 2 * stripe; in raid10_run()
3933 if (md_integrity_register(mddev)) in raid10_run()
3951 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in raid10_run()
3952 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in raid10_run()
3953 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in raid10_run()
3954 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in raid10_run()
3955 mddev->sync_thread = md_register_thread(md_do_sync, mddev, in raid10_run()
3962 md_unregister_thread(&mddev->thread); in raid10_run()
3967 mddev->private = NULL; in raid10_run()
3972 static void raid10_free(struct mddev *mddev, void *priv) in raid10_free() argument
3985 static void raid10_quiesce(struct mddev *mddev, int quiesce) in raid10_quiesce() argument
3987 struct r10conf *conf = mddev->private; in raid10_quiesce()
3995 static int raid10_resize(struct mddev *mddev, sector_t sectors) in raid10_resize() argument
4009 struct r10conf *conf = mddev->private; in raid10_resize()
4012 if (mddev->reshape_position != MaxSector) in raid10_resize()
4018 oldsize = raid10_size(mddev, 0, 0); in raid10_resize()
4019 size = raid10_size(mddev, sectors, 0); in raid10_resize()
4020 if (mddev->external_size && in raid10_resize()
4021 mddev->array_sectors > size) in raid10_resize()
4023 if (mddev->bitmap) { in raid10_resize()
4024 int ret = md_bitmap_resize(mddev->bitmap, size, 0, 0); in raid10_resize()
4028 md_set_array_sectors(mddev, size); in raid10_resize()
4029 if (sectors > mddev->dev_sectors && in raid10_resize()
4030 mddev->recovery_cp > oldsize) { in raid10_resize()
4031 mddev->recovery_cp = oldsize; in raid10_resize()
4032 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in raid10_resize()
4035 mddev->dev_sectors = conf->dev_sectors; in raid10_resize()
4036 mddev->resync_max_sectors = size; in raid10_resize()
4040 static void *raid10_takeover_raid0(struct mddev *mddev, sector_t size, int devs) in raid10_takeover_raid0() argument
4045 if (mddev->degraded > 0) { in raid10_takeover_raid0()
4047 mdname(mddev)); in raid10_takeover_raid0()
4053 mddev->new_level = 10; in raid10_takeover_raid0()
4055 mddev->new_layout = (1<<8) + 2; in raid10_takeover_raid0()
4056 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid10_takeover_raid0()
4057 mddev->delta_disks = mddev->raid_disks; in raid10_takeover_raid0()
4058 mddev->raid_disks *= 2; in raid10_takeover_raid0()
4060 mddev->recovery_cp = MaxSector; in raid10_takeover_raid0()
4061 mddev->dev_sectors = size; in raid10_takeover_raid0()
4063 conf = setup_conf(mddev); in raid10_takeover_raid0()
4065 rdev_for_each(rdev, mddev) in raid10_takeover_raid0()
4076 static void *raid10_takeover(struct mddev *mddev) in raid10_takeover() argument
4083 if (mddev->level == 0) { in raid10_takeover()
4085 raid0_conf = mddev->private; in raid10_takeover()
4088 mdname(mddev)); in raid10_takeover()
4091 return raid10_takeover_raid0(mddev, in raid10_takeover()
4098 static int raid10_check_reshape(struct mddev *mddev) in raid10_check_reshape() argument
4114 struct r10conf *conf = mddev->private; in raid10_check_reshape()
4120 if (setup_geo(&geo, mddev, geo_start) != conf->copies) in raid10_check_reshape()
4127 if (mddev->array_sectors & geo.chunk_mask) in raid10_check_reshape()
4136 if (mddev->delta_disks > 0) { in raid10_check_reshape()
4139 kcalloc(mddev->raid_disks + mddev->delta_disks, in raid10_check_reshape()
4205 static int raid10_start_reshape(struct mddev *mddev) in raid10_start_reshape() argument
4221 struct r10conf *conf = mddev->private; in raid10_start_reshape()
4226 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) in raid10_start_reshape()
4229 if (setup_geo(&new, mddev, geo_start) != conf->copies) in raid10_start_reshape()
4237 rdev_for_each(rdev, mddev) { in raid10_start_reshape()
4244 if (!mddev->reshape_backwards) in raid10_start_reshape()
4257 if (spares < mddev->delta_disks) in raid10_start_reshape()
4271 setup_geo(&conf->geo, mddev, geo_start); in raid10_start_reshape()
4273 if (mddev->reshape_backwards) { in raid10_start_reshape()
4274 sector_t size = raid10_size(mddev, 0, 0); in raid10_start_reshape()
4275 if (size < mddev->array_sectors) { in raid10_start_reshape()
4278 mdname(mddev)); in raid10_start_reshape()
4281 mddev->resync_max_sectors = size; in raid10_start_reshape()
4288 if (mddev->delta_disks && mddev->bitmap) { in raid10_start_reshape()
4289 ret = md_bitmap_resize(mddev->bitmap, in raid10_start_reshape()
4290 raid10_size(mddev, 0, conf->geo.raid_disks), in raid10_start_reshape()
4295 if (mddev->delta_disks > 0) { in raid10_start_reshape()
4296 rdev_for_each(rdev, mddev) in raid10_start_reshape()
4299 if (raid10_add_disk(mddev, rdev) == 0) { in raid10_start_reshape()
4306 if (sysfs_link_rdev(mddev, rdev)) in raid10_start_reshape()
4320 mddev->degraded = calc_degraded(conf); in raid10_start_reshape()
4322 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4323 mddev->reshape_position = conf->reshape_progress; in raid10_start_reshape()
4324 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in raid10_start_reshape()
4326 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); in raid10_start_reshape()
4327 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); in raid10_start_reshape()
4328 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); in raid10_start_reshape()
4329 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); in raid10_start_reshape()
4330 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); in raid10_start_reshape()
4332 mddev->sync_thread = md_register_thread(md_do_sync, mddev, in raid10_start_reshape()
4334 if (!mddev->sync_thread) { in raid10_start_reshape()
4339 md_wakeup_thread(mddev->sync_thread); in raid10_start_reshape()
4340 md_new_event(mddev); in raid10_start_reshape()
4344 mddev->recovery = 0; in raid10_start_reshape()
4347 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4348 rdev_for_each(rdev, mddev) in raid10_start_reshape()
4353 mddev->reshape_position = MaxSector; in raid10_start_reshape()
4389 static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, in reshape_request() argument
4429 struct r10conf *conf = mddev->private; in reshape_request()
4444 if (mddev->reshape_backwards && in reshape_request()
4445 conf->reshape_progress < raid10_size(mddev, 0, 0)) { in reshape_request()
4446 sector_nr = (raid10_size(mddev, 0, 0) in reshape_request()
4448 } else if (!mddev->reshape_backwards && in reshape_request()
4452 mddev->curr_resync_completed = sector_nr; in reshape_request()
4453 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); in reshape_request()
4463 if (mddev->reshape_backwards) { in reshape_request()
4513 mddev->reshape_position = conf->reshape_progress; in reshape_request()
4514 if (mddev->reshape_backwards) in reshape_request()
4515 mddev->curr_resync_completed = raid10_size(mddev, 0, 0) in reshape_request()
4518 mddev->curr_resync_completed = conf->reshape_progress; in reshape_request()
4520 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); in reshape_request()
4521 md_wakeup_thread(mddev->thread); in reshape_request()
4522 wait_event(mddev->sb_wait, mddev->sb_flags == 0 || in reshape_request()
4523 test_bit(MD_RECOVERY_INTR, &mddev->recovery)); in reshape_request()
4524 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { in reshape_request()
4528 conf->reshape_safe = mddev->reshape_position; in reshape_request()
4539 r10_bio->mddev = mddev; in reshape_request()
4552 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in reshape_request()
4556 read_bio = bio_alloc_mddev(GFP_KERNEL, RESYNC_PAGES, mddev); in reshape_request()
4638 if (mddev->reshape_backwards) in reshape_request()
4647 static int handle_reshape_read_error(struct mddev *mddev,
4649 static void reshape_request_write(struct mddev *mddev, struct r10bio *r10_bio) in reshape_request_write() argument
4656 struct r10conf *conf = mddev->private; in reshape_request_write()
4660 if (handle_reshape_read_error(mddev, r10_bio) < 0) { in reshape_request_write()
4662 md_done_sync(mddev, r10_bio->sectors, 0); in reshape_request_write()
4698 if (test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) in end_reshape()
4703 md_finish_reshape(conf->mddev); in end_reshape()
4712 if (conf->mddev->queue) { in end_reshape()
4714 ((conf->mddev->chunk_sectors << 9) / PAGE_SIZE); in end_reshape()
4716 if (conf->mddev->queue->backing_dev_info->ra_pages < 2 * stripe) in end_reshape()
4717 conf->mddev->queue->backing_dev_info->ra_pages = 2 * stripe; in end_reshape()
4722 static int handle_reshape_read_error(struct mddev *mddev, in handle_reshape_read_error() argument
4727 struct r10conf *conf = mddev->private; in handle_reshape_read_error()
4736 set_bit(MD_RECOVERY_INTR, &mddev->recovery); in handle_reshape_read_error()
4772 rdev_dec_pending(rdev, mddev); in handle_reshape_read_error()
4787 &mddev->recovery); in handle_reshape_read_error()
4801 struct mddev *mddev = r10_bio->mddev; in end_reshape_write() local
4802 struct r10conf *conf = mddev->private; in end_reshape_write()
4818 md_error(mddev, rdev); in end_reshape_write()
4821 rdev_dec_pending(rdev, mddev); in end_reshape_write()
4829 md_done_sync(r10_bio->mddev, r10_bio->sectors, 1); in end_reshape_request()
4834 static void raid10_finish_reshape(struct mddev *mddev) in raid10_finish_reshape() argument
4836 struct r10conf *conf = mddev->private; in raid10_finish_reshape()
4838 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) in raid10_finish_reshape()
4841 if (mddev->delta_disks > 0) { in raid10_finish_reshape()
4842 if (mddev->recovery_cp > mddev->resync_max_sectors) { in raid10_finish_reshape()
4843 mddev->recovery_cp = mddev->resync_max_sectors; in raid10_finish_reshape()
4844 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); in raid10_finish_reshape()
4846 mddev->resync_max_sectors = mddev->array_sectors; in raid10_finish_reshape()
4851 d < conf->geo.raid_disks - mddev->delta_disks; in raid10_finish_reshape()
4862 mddev->layout = mddev->new_layout; in raid10_finish_reshape()
4863 mddev->chunk_sectors = 1 << conf->geo.chunk_shift; in raid10_finish_reshape()
4864 mddev->reshape_position = MaxSector; in raid10_finish_reshape()
4865 mddev->delta_disks = 0; in raid10_finish_reshape()
4866 mddev->reshape_backwards = 0; in raid10_finish_reshape()