Lines Matching refs:conf

100 static void allow_barrier(struct r10conf *conf);
101 static void lower_barrier(struct r10conf *conf);
102 static int _enough(struct r10conf *conf, int previous, int ignore);
103 static int enough(struct r10conf *conf, int ignore);
108 static void end_reshape(struct r10conf *conf);
126 struct r10conf *conf = data; in r10bio_pool_alloc() local
127 int size = offsetof(struct r10bio, devs[conf->copies]); in r10bio_pool_alloc()
156 struct r10conf *conf = data; in r10buf_pool_alloc() local
163 r10_bio = r10bio_pool_alloc(gfp_flags, conf); in r10buf_pool_alloc()
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()
169 nalloc = conf->copies; /* resync */ in r10buf_pool_alloc()
174 if (!conf->have_replacement) in r10buf_pool_alloc()
190 if (!conf->have_replacement) in r10buf_pool_alloc()
212 &conf->mddev->recovery)) { in r10buf_pool_alloc()
244 r10bio_pool_free(r10_bio, conf); in r10buf_pool_alloc()
250 struct r10conf *conf = data; in r10buf_pool_free() local
255 for (j = conf->copies; j--; ) { in r10buf_pool_free()
272 r10bio_pool_free(r10bio, conf); in r10buf_pool_free()
275 static void put_all_bios(struct r10conf *conf, struct r10bio *r10_bio) in put_all_bios() argument
279 for (i = 0; i < conf->copies; i++) { in put_all_bios()
293 struct r10conf *conf = r10_bio->mddev->private; in free_r10bio() local
295 put_all_bios(conf, r10_bio); in free_r10bio()
296 mempool_free(r10_bio, &conf->r10bio_pool); in free_r10bio()
301 struct r10conf *conf = r10_bio->mddev->private; in put_buf() local
303 mempool_free(r10_bio, &conf->r10buf_pool); in put_buf()
305 lower_barrier(conf); in put_buf()
312 struct r10conf *conf = mddev->private; in reschedule_retry() local
314 spin_lock_irqsave(&conf->device_lock, flags); in reschedule_retry()
315 list_add(&r10_bio->retry_list, &conf->retry_list); in reschedule_retry()
316 conf->nr_queued ++; in reschedule_retry()
317 spin_unlock_irqrestore(&conf->device_lock, flags); in reschedule_retry()
320 wake_up(&conf->wait_barrier); in reschedule_retry()
333 struct r10conf *conf = r10_bio->mddev->private; in raid_end_bio_io() local
343 allow_barrier(conf); in raid_end_bio_io()
353 struct r10conf *conf = r10_bio->mddev->private; in update_head_pos() local
355 conf->mirrors[r10_bio->devs[slot].devnum].head_position = in update_head_pos()
362 static int find_bio_disk(struct r10conf *conf, struct r10bio *r10_bio, in find_bio_disk() argument
368 for (slot = 0; slot < conf->copies; slot++) { in find_bio_disk()
377 BUG_ON(slot == conf->copies); in find_bio_disk()
393 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_read_request() local
419 if (!_enough(conf, test_bit(R10BIO_Previous, &r10_bio->state), 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()
470 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_write_request() local
478 dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in raid10_end_write_request()
481 rdev = conf->mirrors[dev].replacement; in raid10_end_write_request()
485 rdev = conf->mirrors[dev].rdev; in raid10_end_write_request()
567 rdev_dec_pending(rdev, conf->mddev); in raid10_end_write_request()
660 static void raid10_find_phys(struct r10conf *conf, struct r10bio *r10bio) in raid10_find_phys() argument
662 struct geom *geo = &conf->geo; in raid10_find_phys()
664 if (conf->reshape_progress != MaxSector && in raid10_find_phys()
665 ((r10bio->sector >= conf->reshape_progress) != in raid10_find_phys()
666 conf->mddev->reshape_backwards)) { in raid10_find_phys()
668 geo = &conf->prev; in raid10_find_phys()
675 static sector_t raid10_find_virt(struct r10conf *conf, sector_t sector, int dev) in raid10_find_virt() argument
681 struct geom *geo = &conf->geo; in raid10_find_virt()
739 static struct md_rdev *read_balance(struct r10conf *conf, in read_balance() argument
751 struct geom *geo = &conf->geo; in read_balance()
753 raid10_find_phys(conf, r10_bio); in read_balance()
767 if ((conf->mddev->recovery_cp < MaxSector in read_balance()
768 && (this_sector + sectors >= conf->next_resync)) || 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()
774 for (slot = 0; slot < conf->copies ; slot++) { in read_balance()
782 rdev = rcu_dereference(conf->mirrors[disk].replacement); in read_balance()
785 rdev = rcu_dereference(conf->mirrors[disk].rdev); in read_balance()
843 conf->mirrors[disk].head_position); in read_balance()
850 if (slot >= conf->copies) { in read_balance()
868 struct r10conf *conf = mddev->private; in raid10_congested() local
872 conf->pending_count >= max_queued_requests) in raid10_congested()
877 (i < conf->geo.raid_disks || i < conf->prev.raid_disks) in raid10_congested()
880 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in raid10_congested()
891 static void flush_pending_writes(struct r10conf *conf) in flush_pending_writes() argument
896 spin_lock_irq(&conf->device_lock); in flush_pending_writes()
898 if (conf->pending_bio_list.head) { in flush_pending_writes()
902 bio = bio_list_get(&conf->pending_bio_list); in flush_pending_writes()
903 conf->pending_count = 0; in flush_pending_writes()
904 spin_unlock_irq(&conf->device_lock); in flush_pending_writes()
920 md_bitmap_unplug(conf->mddev->bitmap); in flush_pending_writes()
921 wake_up(&conf->wait_barrier); in flush_pending_writes()
940 spin_unlock_irq(&conf->device_lock); in flush_pending_writes()
965 static void raise_barrier(struct r10conf *conf, int force) in raise_barrier() argument
967 BUG_ON(force && !conf->barrier); in raise_barrier()
968 spin_lock_irq(&conf->resync_lock); in raise_barrier()
971 wait_event_lock_irq(conf->wait_barrier, force || !conf->nr_waiting, in raise_barrier()
972 conf->resync_lock); in raise_barrier()
975 conf->barrier++; in raise_barrier()
978 wait_event_lock_irq(conf->wait_barrier, in raise_barrier()
979 !atomic_read(&conf->nr_pending) && conf->barrier < RESYNC_DEPTH, in raise_barrier()
980 conf->resync_lock); in raise_barrier()
982 spin_unlock_irq(&conf->resync_lock); in raise_barrier()
985 static void lower_barrier(struct r10conf *conf) in lower_barrier() argument
988 spin_lock_irqsave(&conf->resync_lock, flags); in lower_barrier()
989 conf->barrier--; in lower_barrier()
990 spin_unlock_irqrestore(&conf->resync_lock, flags); in lower_barrier()
991 wake_up(&conf->wait_barrier); in lower_barrier()
994 static void wait_barrier(struct r10conf *conf) in wait_barrier() argument
996 spin_lock_irq(&conf->resync_lock); in wait_barrier()
997 if (conf->barrier) { in wait_barrier()
998 conf->nr_waiting++; in wait_barrier()
1008 raid10_log(conf->mddev, "wait barrier"); in wait_barrier()
1009 wait_event_lock_irq(conf->wait_barrier, in wait_barrier()
1010 !conf->barrier || in wait_barrier()
1011 (atomic_read(&conf->nr_pending) && in wait_barrier()
1015 conf->resync_lock); in wait_barrier()
1016 conf->nr_waiting--; in wait_barrier()
1017 if (!conf->nr_waiting) in wait_barrier()
1018 wake_up(&conf->wait_barrier); in wait_barrier()
1020 atomic_inc(&conf->nr_pending); in wait_barrier()
1021 spin_unlock_irq(&conf->resync_lock); in wait_barrier()
1024 static void allow_barrier(struct r10conf *conf) in allow_barrier() argument
1026 if ((atomic_dec_and_test(&conf->nr_pending)) || in allow_barrier()
1027 (conf->array_freeze_pending)) in allow_barrier()
1028 wake_up(&conf->wait_barrier); in allow_barrier()
1031 static void freeze_array(struct r10conf *conf, int extra) in freeze_array() argument
1045 spin_lock_irq(&conf->resync_lock); in freeze_array()
1046 conf->array_freeze_pending++; in freeze_array()
1047 conf->barrier++; in freeze_array()
1048 conf->nr_waiting++; in freeze_array()
1049 wait_event_lock_irq_cmd(conf->wait_barrier, in freeze_array()
1050 atomic_read(&conf->nr_pending) == conf->nr_queued+extra, in freeze_array()
1051 conf->resync_lock, in freeze_array()
1052 flush_pending_writes(conf)); in freeze_array()
1054 conf->array_freeze_pending--; in freeze_array()
1055 spin_unlock_irq(&conf->resync_lock); in freeze_array()
1058 static void unfreeze_array(struct r10conf *conf) in unfreeze_array() argument
1061 spin_lock_irq(&conf->resync_lock); in unfreeze_array()
1062 conf->barrier--; in unfreeze_array()
1063 conf->nr_waiting--; in unfreeze_array()
1064 wake_up(&conf->wait_barrier); in unfreeze_array()
1065 spin_unlock_irq(&conf->resync_lock); in unfreeze_array()
1089 struct r10conf *conf = mddev->private; in raid10_unplug() local
1093 spin_lock_irq(&conf->device_lock); in raid10_unplug()
1094 bio_list_merge(&conf->pending_bio_list, &plug->pending); in raid10_unplug()
1095 conf->pending_count += plug->pending_cnt; in raid10_unplug()
1096 spin_unlock_irq(&conf->device_lock); in raid10_unplug()
1097 wake_up(&conf->wait_barrier); in raid10_unplug()
1106 wake_up(&conf->wait_barrier); in raid10_unplug()
1129 struct r10conf *conf = mddev->private; in raid10_read_request() local
1158 err_rdev = rcu_dereference(conf->mirrors[disk].rdev); in raid10_read_request()
1173 wait_barrier(conf); in raid10_read_request()
1177 bio->bi_iter.bi_sector < conf->reshape_progress && in raid10_read_request()
1178 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) { in raid10_read_request()
1183 raid10_log(conf->mddev, "wait reshape"); in raid10_read_request()
1184 allow_barrier(conf); in raid10_read_request()
1185 wait_event(conf->wait_barrier, in raid10_read_request()
1186 conf->reshape_progress <= bio->bi_iter.bi_sector || in raid10_read_request()
1187 conf->reshape_progress >= bio->bi_iter.bi_sector + in raid10_read_request()
1189 wait_barrier(conf); in raid10_read_request()
1192 rdev = read_balance(conf, r10_bio, &max_sectors); in raid10_read_request()
1209 gfp, &conf->bio_split); in raid10_read_request()
1251 struct r10conf *conf = mddev->private; in raid10_write_one_disk() local
1257 rdev = conf->mirrors[devnum].replacement; in raid10_write_one_disk()
1261 rdev = conf->mirrors[devnum].rdev; in raid10_write_one_disk()
1264 rdev = conf->mirrors[devnum].rdev; in raid10_write_one_disk()
1278 &conf->mirrors[devnum].rdev->flags) in raid10_write_one_disk()
1279 && enough(conf, devnum)) 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()
1301 spin_lock_irqsave(&conf->device_lock, flags); in raid10_write_one_disk()
1302 bio_list_add(&conf->pending_bio_list, mbio); in raid10_write_one_disk()
1303 conf->pending_count++; in raid10_write_one_disk()
1304 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_write_one_disk()
1312 struct r10conf *conf = mddev->private; in raid10_write_request() local
1324 prepare_to_wait(&conf->wait_barrier, in raid10_write_request()
1331 finish_wait(&conf->wait_barrier, &w); in raid10_write_request()
1339 wait_barrier(conf); in raid10_write_request()
1343 bio->bi_iter.bi_sector < conf->reshape_progress && in raid10_write_request()
1344 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) { in raid10_write_request()
1349 raid10_log(conf->mddev, "wait reshape"); in raid10_write_request()
1350 allow_barrier(conf); in raid10_write_request()
1351 wait_event(conf->wait_barrier, in raid10_write_request()
1352 conf->reshape_progress <= bio->bi_iter.bi_sector || in raid10_write_request()
1353 conf->reshape_progress >= bio->bi_iter.bi_sector + in raid10_write_request()
1355 wait_barrier(conf); in raid10_write_request()
1360 ? (bio->bi_iter.bi_sector < conf->reshape_safe && in raid10_write_request()
1361 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) in raid10_write_request()
1362 : (bio->bi_iter.bi_sector + sectors > conf->reshape_safe && in raid10_write_request()
1363 bio->bi_iter.bi_sector < conf->reshape_progress))) { in raid10_write_request()
1365 mddev->reshape_position = conf->reshape_progress; in raid10_write_request()
1369 raid10_log(conf->mddev, "wait reshape metadata"); in raid10_write_request()
1373 conf->reshape_safe = mddev->reshape_position; in raid10_write_request()
1376 if (conf->pending_count >= max_queued_requests) { in raid10_write_request()
1379 wait_event(conf->wait_barrier, in raid10_write_request()
1380 conf->pending_count < max_queued_requests); in raid10_write_request()
1393 raid10_find_phys(conf, r10_bio); in raid10_write_request()
1399 for (i = 0; i < conf->copies; i++) { in raid10_write_request()
1401 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); in raid10_write_request()
1403 conf->mirrors[d].replacement); in raid10_write_request()
1488 rdev_dec_pending(conf->mirrors[d].rdev, mddev); in raid10_write_request()
1493 rdev = conf->mirrors[d].replacement; in raid10_write_request()
1497 rdev = conf->mirrors[d].rdev; in raid10_write_request()
1502 allow_barrier(conf); in raid10_write_request()
1503 raid10_log(conf->mddev, "wait rdev %d blocked", blocked_rdev->raid_disk); in raid10_write_request()
1505 wait_barrier(conf); in raid10_write_request()
1514 GFP_NOIO, &conf->bio_split); in raid10_write_request()
1524 for (i = 0; i < conf->copies; i++) { in raid10_write_request()
1535 struct r10conf *conf = mddev->private; in __make_request() local
1538 r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO); in __make_request()
1546 memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * conf->copies); in __make_request()
1556 struct r10conf *conf = mddev->private; in raid10_make_request() local
1557 sector_t chunk_mask = (conf->geo.chunk_mask & conf->prev.chunk_mask); in raid10_make_request()
1575 && (conf->geo.near_copies < conf->geo.raid_disks in raid10_make_request()
1576 || conf->prev.near_copies < in raid10_make_request()
1577 conf->prev.raid_disks))) in raid10_make_request()
1584 wake_up(&conf->wait_barrier); in raid10_make_request()
1590 struct r10conf *conf = mddev->private; in raid10_status() local
1593 if (conf->geo.near_copies < conf->geo.raid_disks) in raid10_status()
1595 if (conf->geo.near_copies > 1) in raid10_status()
1596 seq_printf(seq, " %d near-copies", conf->geo.near_copies); in raid10_status()
1597 if (conf->geo.far_copies > 1) { in raid10_status()
1598 if (conf->geo.far_offset) in raid10_status()
1599 seq_printf(seq, " %d offset-copies", conf->geo.far_copies); in raid10_status()
1601 seq_printf(seq, " %d far-copies", conf->geo.far_copies); in raid10_status()
1602 if (conf->geo.far_set_size != conf->geo.raid_disks) in raid10_status()
1603 seq_printf(seq, " %d devices per set", conf->geo.far_set_size); in raid10_status()
1605 seq_printf(seq, " [%d/%d] [", conf->geo.raid_disks, in raid10_status()
1606 conf->geo.raid_disks - mddev->degraded); in raid10_status()
1608 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_status()
1609 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in raid10_status()
1621 static int _enough(struct r10conf *conf, int previous, int ignore) in _enough() argument
1627 disks = conf->prev.raid_disks; in _enough()
1628 ncopies = conf->prev.near_copies; in _enough()
1630 disks = conf->geo.raid_disks; in _enough()
1631 ncopies = conf->geo.near_copies; in _enough()
1636 int n = conf->copies; in _enough()
1642 (rdev = rcu_dereference(conf->mirrors[this].rdev)) && in _enough()
1657 static int enough(struct r10conf *conf, int ignore) in enough() argument
1664 return _enough(conf, 0, ignore) && in enough()
1665 _enough(conf, 1, ignore); in enough()
1671 struct r10conf *conf = mddev->private; in raid10_error() local
1680 spin_lock_irqsave(&conf->device_lock, flags); in raid10_error()
1682 && !enough(conf, rdev->raid_disk)) { in raid10_error()
1686 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_error()
1699 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_error()
1703 mdname(mddev), conf->geo.raid_disks - mddev->degraded); in raid10_error()
1706 static void print_conf(struct r10conf *conf) in print_conf() argument
1712 if (!conf) { in print_conf()
1716 pr_debug(" --- wd:%d rd:%d\n", conf->geo.raid_disks - conf->mddev->degraded, in print_conf()
1717 conf->geo.raid_disks); in print_conf()
1721 for (i = 0; i < conf->geo.raid_disks; i++) { in print_conf()
1723 rdev = conf->mirrors[i].rdev; in print_conf()
1732 static void close_sync(struct r10conf *conf) in close_sync() argument
1734 wait_barrier(conf); in close_sync()
1735 allow_barrier(conf); in close_sync()
1737 mempool_exit(&conf->r10buf_pool); in close_sync()
1743 struct r10conf *conf = mddev->private; in raid10_spare_active() local
1752 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_spare_active()
1753 tmp = conf->mirrors + i; in raid10_spare_active()
1780 spin_lock_irqsave(&conf->device_lock, flags); in raid10_spare_active()
1782 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_spare_active()
1784 print_conf(conf); in raid10_spare_active()
1790 struct r10conf *conf = mddev->private; in raid10_add_disk() local
1794 int last = conf->geo.raid_disks - 1; in raid10_add_disk()
1801 if (rdev->saved_raid_disk < 0 && !_enough(conf, 1, -1)) in raid10_add_disk()
1811 conf->mirrors[rdev->saved_raid_disk].rdev == NULL) in raid10_add_disk()
1816 struct raid10_info *p = &conf->mirrors[mirror]; in raid10_add_disk()
1830 conf->fullsync = 1; in raid10_add_disk()
1844 conf->fullsync = 1; in raid10_add_disk()
1851 print_conf(conf); in raid10_add_disk()
1857 struct r10conf *conf = mddev->private; in raid10_remove_disk() local
1861 struct raid10_info *p = conf->mirrors + number; in raid10_remove_disk()
1863 print_conf(conf); in raid10_remove_disk()
1882 number < conf->geo.raid_disks && in raid10_remove_disk()
1883 enough(conf, -1)) { in raid10_remove_disk()
1912 print_conf(conf); in raid10_remove_disk()
1918 struct r10conf *conf = r10_bio->mddev->private; in __end_sync_read() local
1927 &conf->mirrors[d].rdev->corrected_errors); 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() local
1946 int d = find_bio_disk(conf, r10_bio, bio, NULL, NULL); in end_sync_read()
1990 struct r10conf *conf = mddev->private; in end_sync_write() local
1998 d = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in end_sync_write()
2000 rdev = conf->mirrors[d].replacement; in end_sync_write()
2002 rdev = conf->mirrors[d].rdev; in end_sync_write()
2043 struct r10conf *conf = mddev->private; in sync_request_write() local
2052 for (i=0; i<conf->copies; i++) in sync_request_write()
2056 if (i == conf->copies) in sync_request_write()
2067 for (i=0 ; i < conf->copies ; i++) { in sync_request_write()
2081 rdev = conf->mirrors[d].rdev; in sync_request_write()
2127 atomic_inc(&conf->mirrors[d].rdev->nr_pending); in sync_request_write()
2129 md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(tbio)); in sync_request_write()
2131 if (test_bit(FailFast, &conf->mirrors[d].rdev->flags)) in sync_request_write()
2133 tbio->bi_iter.bi_sector += conf->mirrors[d].rdev->data_offset; in sync_request_write()
2134 bio_set_dev(tbio, conf->mirrors[d].rdev->bdev); in sync_request_write()
2141 for (i = 0; i < conf->copies; i++) { in sync_request_write()
2152 md_sync_acct(conf->mirrors[d].replacement->bdev, in sync_request_write()
2184 struct r10conf *conf = mddev->private; in fix_recovery_read_error() local
2202 rdev = conf->mirrors[dr].rdev; in fix_recovery_read_error()
2210 rdev = conf->mirrors[dw].rdev; in fix_recovery_read_error()
2232 if (rdev != conf->mirrors[dw].rdev) { in fix_recovery_read_error()
2234 struct md_rdev *rdev2 = conf->mirrors[dw].rdev; in fix_recovery_read_error()
2242 conf->mirrors[dw].recovery_disabled in fix_recovery_read_error()
2259 struct r10conf *conf = mddev->private; in recovery_request_write() local
2283 atomic_inc(&conf->mirrors[d].rdev->nr_pending); in recovery_request_write()
2284 md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(wbio)); in recovery_request_write()
2288 atomic_inc(&conf->mirrors[d].replacement->nr_pending); in recovery_request_write()
2289 md_sync_acct(conf->mirrors[d].replacement->bdev, in recovery_request_write()
2363 static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio) in fix_read_error() argument
2374 rdev = conf->mirrors[d].rdev; in fix_read_error()
2412 rdev = rcu_dereference(conf->mirrors[d].rdev); in fix_read_error()
2424 conf->tmppage, in fix_read_error()
2432 if (sl == conf->copies) in fix_read_error()
2443 rdev = conf->mirrors[dn].rdev; in fix_read_error()
2464 sl = conf->copies; in fix_read_error()
2467 rdev = rcu_dereference(conf->mirrors[d].rdev); in fix_read_error()
2478 s, conf->tmppage, WRITE) in fix_read_error()
2500 sl = conf->copies; in fix_read_error()
2503 rdev = rcu_dereference(conf->mirrors[d].rdev); in fix_read_error()
2514 s, conf->tmppage, in fix_read_error()
2552 struct r10conf *conf = mddev->private; in narrow_write_error() local
2553 struct md_rdev *rdev = conf->mirrors[r10_bio->devs[i].devnum].rdev; in narrow_write_error()
2613 struct r10conf *conf = mddev->private; in handle_read_error() local
2631 freeze_array(conf, 1); in handle_read_error()
2632 fix_read_error(conf, mddev, r10_bio); in handle_read_error()
2633 unfreeze_array(conf); in handle_read_error()
2638 allow_barrier(conf); in handle_read_error()
2643 static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) in handle_write_completed() argument
2656 for (m = 0; m < conf->copies; m++) { in handle_write_completed()
2658 rdev = conf->mirrors[dev].rdev; in handle_write_completed()
2672 md_error(conf->mddev, rdev); in handle_write_completed()
2674 rdev = conf->mirrors[dev].replacement; in handle_write_completed()
2689 md_error(conf->mddev, rdev); in handle_write_completed()
2695 for (m = 0; m < conf->copies; m++) { in handle_write_completed()
2698 rdev = conf->mirrors[dev].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()
2715 rdev = conf->mirrors[dev].replacement; in handle_write_completed()
2721 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
2725 spin_lock_irq(&conf->device_lock); in handle_write_completed()
2726 list_add(&r10_bio->retry_list, &conf->bio_end_io_list); in handle_write_completed()
2727 conf->nr_queued++; in handle_write_completed()
2728 spin_unlock_irq(&conf->device_lock); in handle_write_completed()
2733 wake_up(&conf->wait_barrier); in handle_write_completed()
2734 md_wakeup_thread(conf->mddev->thread); in handle_write_completed()
2749 struct r10conf *conf = mddev->private; in raid10d() local
2750 struct list_head *head = &conf->retry_list; in raid10d()
2755 if (!list_empty_careful(&conf->bio_end_io_list) && in raid10d()
2758 spin_lock_irqsave(&conf->device_lock, flags); in raid10d()
2760 while (!list_empty(&conf->bio_end_io_list)) { in raid10d()
2761 list_move(conf->bio_end_io_list.prev, &tmp); in raid10d()
2762 conf->nr_queued--; in raid10d()
2765 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10d()
2783 flush_pending_writes(conf); in raid10d()
2785 spin_lock_irqsave(&conf->device_lock, flags); in raid10d()
2787 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10d()
2792 conf->nr_queued--; in raid10d()
2793 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10d()
2796 conf = mddev->private; in raid10d()
2799 handle_write_completed(conf, r10_bio); in raid10d()
2818 static int init_resync(struct r10conf *conf) in init_resync() argument
2823 BUG_ON(mempool_initialized(&conf->r10buf_pool)); in init_resync()
2824 conf->have_replacement = 0; in init_resync()
2825 for (i = 0; i < conf->geo.raid_disks; i++) in init_resync()
2826 if (conf->mirrors[i].replacement) in init_resync()
2827 conf->have_replacement = 1; in init_resync()
2828 ret = mempool_init(&conf->r10buf_pool, buffs, in init_resync()
2829 r10buf_pool_alloc, r10buf_pool_free, conf); in init_resync()
2832 conf->next_resync = 0; in init_resync()
2836 static struct r10bio *raid10_alloc_init_r10buf(struct r10conf *conf) in raid10_alloc_init_r10buf() argument
2838 struct r10bio *r10bio = mempool_alloc(&conf->r10buf_pool, GFP_NOIO); in raid10_alloc_init_r10buf()
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()
2846 nalloc = conf->copies; /* resync */ in raid10_alloc_init_r10buf()
2869 static void raid10_set_cluster_sync_high(struct r10conf *conf) in raid10_set_cluster_sync_high() argument
2886 chunks = conf->geo.raid_disks / conf->geo.near_copies; in raid10_set_cluster_sync_high()
2887 if (conf->geo.raid_disks % conf->geo.near_copies == 0) in raid10_set_cluster_sync_high()
2891 window_size = (chunks + extra_chunk) * conf->mddev->chunk_sectors; in raid10_set_cluster_sync_high()
2899 conf->cluster_sync_high = conf->cluster_sync_low + window_size; in raid10_set_cluster_sync_high()
2937 struct r10conf *conf = mddev->private; in raid10_sync_request() local
2946 sector_t chunk_mask = conf->geo.chunk_mask; in raid10_sync_request()
2949 if (!mempool_initialized(&conf->r10buf_pool)) in raid10_sync_request()
2950 if (init_resync(conf)) in raid10_sync_request()
2963 conf->fullsync == 0) { in raid10_sync_request()
2974 conf->cluster_sync_low = 0; in raid10_sync_request()
2975 conf->cluster_sync_high = 0; in raid10_sync_request()
2987 end_reshape(conf); in raid10_sync_request()
2988 close_sync(conf); in raid10_sync_request()
2996 else for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
2998 raid10_find_virt(conf, mddev->curr_resync, i); in raid10_sync_request()
3004 if ((!mddev->bitmap || conf->fullsync) in raid10_sync_request()
3005 && conf->have_replacement in raid10_sync_request()
3011 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3013 rcu_dereference(conf->mirrors[i].replacement); in raid10_sync_request()
3019 conf->fullsync = 0; in raid10_sync_request()
3022 close_sync(conf); in raid10_sync_request()
3030 if (chunks_skipped >= conf->geo.raid_disks) { in raid10_sync_request()
3044 if (conf->geo.near_copies < conf->geo.raid_disks && in raid10_sync_request()
3052 if (conf->nr_waiting) in raid10_sync_request()
3076 for (i = 0 ; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3082 struct raid10_info *mirror = &conf->mirrors[i]; in raid10_sync_request()
3101 sect = raid10_find_virt(conf, sector_nr, i); in raid10_sync_request()
3121 !conf->fullsync) { in raid10_sync_request()
3134 r10_bio = raid10_alloc_init_r10buf(conf); in raid10_sync_request()
3136 raise_barrier(conf, rb2 != NULL); in raid10_sync_request()
3146 raid10_find_phys(conf, r10_bio); in raid10_sync_request()
3152 for (j = 0; j < conf->geo.raid_disks; j++) { in raid10_sync_request()
3154 conf->mirrors[j].rdev); in raid10_sync_request()
3165 for (j=0; j<conf->copies;j++) { in raid10_sync_request()
3170 rcu_dereference(conf->mirrors[d].rdev); in raid10_sync_request()
3206 for (k=0; k<conf->copies; k++) in raid10_sync_request()
3209 BUG_ON(k == conf->copies); in raid10_sync_request()
3255 if (j == conf->copies) { in raid10_sync_request()
3263 for (k = 0; k < conf->copies; k++) in raid10_sync_request()
3306 for (; j < conf->copies; j++) { in raid10_sync_request()
3308 if (conf->mirrors[d].rdev && in raid10_sync_request()
3310 &conf->mirrors[d].rdev->flags)) in raid10_sync_request()
3340 (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high)); in raid10_sync_request()
3344 !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, in raid10_sync_request()
3352 r10_bio = raid10_alloc_init_r10buf(conf); in raid10_sync_request()
3357 raise_barrier(conf, 0); in raid10_sync_request()
3358 conf->next_resync = sector_nr; in raid10_sync_request()
3363 raid10_find_phys(conf, r10_bio); in raid10_sync_request()
3366 for (i = 0; i < conf->copies; i++) { in raid10_sync_request()
3378 rdev = rcu_dereference(conf->mirrors[d].rdev); in raid10_sync_request()
3408 rdev = rcu_dereference(conf->mirrors[d].replacement); in raid10_sync_request()
3433 for (i=0; i<conf->copies; i++) { in raid10_sync_request()
3436 rdev_dec_pending(conf->mirrors[d].rdev, in raid10_sync_request()
3441 conf->mirrors[d].replacement, in raid10_sync_request()
3477 if (conf->cluster_sync_high < sector_nr + nr_sectors) { in raid10_sync_request()
3478 conf->cluster_sync_low = mddev->curr_resync_completed; in raid10_sync_request()
3479 raid10_set_cluster_sync_high(conf); in raid10_sync_request()
3482 conf->cluster_sync_low, in raid10_sync_request()
3483 conf->cluster_sync_high); in raid10_sync_request()
3490 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3496 sect_va1 = raid10_find_virt(conf, sector_nr, i); in raid10_sync_request()
3498 if (conf->cluster_sync_high < sect_va1 + nr_sectors) { in raid10_sync_request()
3504 sect_va2 = raid10_find_virt(conf, in raid10_sync_request()
3507 if (conf->cluster_sync_low == 0 || in raid10_sync_request()
3508 conf->cluster_sync_low > sect_va2) in raid10_sync_request()
3509 conf->cluster_sync_low = sect_va2; in raid10_sync_request()
3513 raid10_set_cluster_sync_high(conf); in raid10_sync_request()
3515 conf->cluster_sync_low, in raid10_sync_request()
3516 conf->cluster_sync_high); in raid10_sync_request()
3560 struct r10conf *conf = mddev->private; in raid10_size() local
3563 raid_disks = min(conf->geo.raid_disks, in raid10_size()
3564 conf->prev.raid_disks); in raid10_size()
3566 sectors = conf->dev_sectors; in raid10_size()
3568 size = sectors >> conf->geo.chunk_shift; in raid10_size()
3569 sector_div(size, conf->geo.far_copies); in raid10_size()
3571 sector_div(size, conf->geo.near_copies); in raid10_size()
3573 return size << conf->geo.chunk_shift; in raid10_size()
3576 static void calc_sectors(struct r10conf *conf, sector_t size) in calc_sectors() argument
3583 size = size >> conf->geo.chunk_shift; in calc_sectors()
3584 sector_div(size, conf->geo.far_copies); in calc_sectors()
3585 size = size * conf->geo.raid_disks; in calc_sectors()
3586 sector_div(size, conf->geo.near_copies); in calc_sectors()
3589 size = size * conf->copies; in calc_sectors()
3594 size = DIV_ROUND_UP_SECTOR_T(size, conf->geo.raid_disks); in calc_sectors()
3596 conf->dev_sectors = size << conf->geo.chunk_shift; in calc_sectors()
3598 if (conf->geo.far_offset) in calc_sectors()
3599 conf->geo.stride = 1 << conf->geo.chunk_shift; in calc_sectors()
3601 sector_div(size, conf->geo.far_copies); in calc_sectors()
3602 conf->geo.stride = size << conf->geo.chunk_shift; in calc_sectors()
3665 struct r10conf *conf = NULL; in setup_conf() local
3685 conf = kzalloc(sizeof(struct r10conf), GFP_KERNEL); in setup_conf()
3686 if (!conf) in setup_conf()
3690 conf->mirrors = kcalloc(mddev->raid_disks + max(0, -mddev->delta_disks), in setup_conf()
3693 if (!conf->mirrors) in setup_conf()
3696 conf->tmppage = alloc_page(GFP_KERNEL); in setup_conf()
3697 if (!conf->tmppage) in setup_conf()
3700 conf->geo = geo; in setup_conf()
3701 conf->copies = copies; in setup_conf()
3702 err = mempool_init(&conf->r10bio_pool, NR_RAID10_BIOS, r10bio_pool_alloc, in setup_conf()
3703 r10bio_pool_free, conf); in setup_conf()
3707 err = bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0); in setup_conf()
3711 calc_sectors(conf, mddev->dev_sectors); in setup_conf()
3713 conf->prev = conf->geo; in setup_conf()
3714 conf->reshape_progress = 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()
3721 if (conf->prev.far_offset) in setup_conf()
3722 conf->prev.stride = 1 << conf->prev.chunk_shift; in setup_conf()
3725 conf->prev.stride = conf->dev_sectors; in setup_conf()
3727 conf->reshape_safe = conf->reshape_progress; in setup_conf()
3728 spin_lock_init(&conf->device_lock); in setup_conf()
3729 INIT_LIST_HEAD(&conf->retry_list); in setup_conf()
3730 INIT_LIST_HEAD(&conf->bio_end_io_list); in setup_conf()
3732 spin_lock_init(&conf->resync_lock); in setup_conf()
3733 init_waitqueue_head(&conf->wait_barrier); in setup_conf()
3734 atomic_set(&conf->nr_pending, 0); in setup_conf()
3737 conf->thread = md_register_thread(raid10d, mddev, "raid10"); in setup_conf()
3738 if (!conf->thread) in setup_conf()
3741 conf->mddev = mddev; in setup_conf()
3742 return conf; in setup_conf()
3745 if (conf) { in setup_conf()
3746 mempool_exit(&conf->r10bio_pool); in setup_conf()
3747 kfree(conf->mirrors); in setup_conf()
3748 safe_put_page(conf->tmppage); in setup_conf()
3749 bioset_exit(&conf->bio_split); in setup_conf()
3750 kfree(conf); in setup_conf()
3757 struct r10conf *conf; in raid10_run() local
3770 conf = setup_conf(mddev); in raid10_run()
3771 if (IS_ERR(conf)) in raid10_run()
3772 return PTR_ERR(conf); in raid10_run()
3773 mddev->private = conf; in raid10_run()
3775 conf = mddev->private; in raid10_run()
3776 if (!conf) in raid10_run()
3779 if (mddev_is_clustered(conf->mddev)) { in raid10_run()
3791 mddev->thread = conf->thread; in raid10_run()
3792 conf->thread = NULL; in raid10_run()
3801 if (conf->geo.raid_disks % conf->geo.near_copies) in raid10_run()
3802 blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); in raid10_run()
3805 (conf->geo.raid_disks / conf->geo.near_copies)); in raid10_run()
3814 if (disk_idx >= conf->geo.raid_disks && in raid10_run()
3815 disk_idx >= conf->prev.raid_disks) in raid10_run()
3817 disk = conf->mirrors + disk_idx; in raid10_run()
3856 if (!enough(conf, -1)) { in raid10_run()
3862 if (conf->reshape_progress != MaxSector) { in raid10_run()
3864 if (conf->geo.far_copies != 1 && in raid10_run()
3865 conf->geo.far_offset == 0) in raid10_run()
3867 if (conf->prev.far_copies != 1 && in raid10_run()
3868 conf->prev.far_offset == 0) in raid10_run()
3874 i < conf->geo.raid_disks in raid10_run()
3875 || i < conf->prev.raid_disks; in raid10_run()
3878 disk = conf->mirrors + i; in raid10_run()
3893 conf->fullsync = 1; in raid10_run()
3899 conf->fullsync = 1; in raid10_run()
3909 mdname(mddev), conf->geo.raid_disks - mddev->degraded, in raid10_run()
3910 conf->geo.raid_disks); in raid10_run()
3914 mddev->dev_sectors = conf->dev_sectors; in raid10_run()
3921 int stripe = conf->geo.raid_disks * in raid10_run()
3928 stripe /= conf->geo.near_copies; in raid10_run()
3936 if (conf->reshape_progress != MaxSector) { in raid10_run()
3939 before_length = ((1 << conf->prev.chunk_shift) * in raid10_run()
3940 conf->prev.far_copies); in raid10_run()
3941 after_length = ((1 << conf->geo.chunk_shift) * in raid10_run()
3942 conf->geo.far_copies); in raid10_run()
3949 conf->offset_diff = min_offset_diff; in raid10_run()
3963 mempool_exit(&conf->r10bio_pool); in raid10_run()
3964 safe_put_page(conf->tmppage); in raid10_run()
3965 kfree(conf->mirrors); in raid10_run()
3966 kfree(conf); in raid10_run()
3974 struct r10conf *conf = priv; in raid10_free() local
3976 mempool_exit(&conf->r10bio_pool); in raid10_free()
3977 safe_put_page(conf->tmppage); in raid10_free()
3978 kfree(conf->mirrors); in raid10_free()
3979 kfree(conf->mirrors_old); in raid10_free()
3980 kfree(conf->mirrors_new); in raid10_free()
3981 bioset_exit(&conf->bio_split); in raid10_free()
3982 kfree(conf); in raid10_free()
3987 struct r10conf *conf = mddev->private; in raid10_quiesce() local
3990 raise_barrier(conf, 0); in raid10_quiesce()
3992 lower_barrier(conf); in raid10_quiesce()
4009 struct r10conf *conf = mddev->private; in raid10_resize() local
4015 if (conf->geo.far_copies > 1 && !conf->geo.far_offset) in raid10_resize()
4034 calc_sectors(conf, sectors); in raid10_resize()
4035 mddev->dev_sectors = conf->dev_sectors; in raid10_resize()
4043 struct r10conf *conf; in raid10_takeover_raid0() local
4063 conf = setup_conf(mddev); in raid10_takeover_raid0()
4064 if (!IS_ERR(conf)) { in raid10_takeover_raid0()
4070 conf->barrier = 1; in raid10_takeover_raid0()
4073 return conf; in raid10_takeover_raid0()
4114 struct r10conf *conf = mddev->private; in raid10_check_reshape() local
4117 if (conf->geo.far_copies != 1 && !conf->geo.far_offset) in raid10_check_reshape()
4120 if (setup_geo(&geo, mddev, geo_start) != conf->copies) in raid10_check_reshape()
4131 if (!enough(conf, -1)) in raid10_check_reshape()
4134 kfree(conf->mirrors_new); in raid10_check_reshape()
4135 conf->mirrors_new = NULL; in raid10_check_reshape()
4138 conf->mirrors_new = in raid10_check_reshape()
4142 if (!conf->mirrors_new) in raid10_check_reshape()
4161 static int calc_degraded(struct r10conf *conf) in calc_degraded() argument
4169 for (i = 0; i < conf->prev.raid_disks; i++) { in calc_degraded()
4170 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in calc_degraded()
4181 if (conf->geo.raid_disks == conf->prev.raid_disks) in calc_degraded()
4185 for (i = 0; i < conf->geo.raid_disks; i++) { in calc_degraded()
4186 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in calc_degraded()
4195 if (conf->geo.raid_disks <= conf->prev.raid_disks) in calc_degraded()
4221 struct r10conf *conf = mddev->private; in raid10_start_reshape() local
4229 if (setup_geo(&new, mddev, geo_start) != conf->copies) in raid10_start_reshape()
4232 before_length = ((1 << conf->prev.chunk_shift) * in raid10_start_reshape()
4233 conf->prev.far_copies); in raid10_start_reshape()
4234 after_length = ((1 << conf->geo.chunk_shift) * in raid10_start_reshape()
4235 conf->geo.far_copies); in raid10_start_reshape()
4260 conf->offset_diff = min_offset_diff; in raid10_start_reshape()
4261 spin_lock_irq(&conf->device_lock); in raid10_start_reshape()
4262 if (conf->mirrors_new) { in raid10_start_reshape()
4263 memcpy(conf->mirrors_new, conf->mirrors, in raid10_start_reshape()
4264 sizeof(struct raid10_info)*conf->prev.raid_disks); in raid10_start_reshape()
4266 kfree(conf->mirrors_old); in raid10_start_reshape()
4267 conf->mirrors_old = conf->mirrors; in raid10_start_reshape()
4268 conf->mirrors = conf->mirrors_new; in raid10_start_reshape()
4269 conf->mirrors_new = NULL; in raid10_start_reshape()
4271 setup_geo(&conf->geo, mddev, geo_start); in raid10_start_reshape()
4276 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4282 conf->reshape_progress = size; in raid10_start_reshape()
4284 conf->reshape_progress = 0; in raid10_start_reshape()
4285 conf->reshape_safe = conf->reshape_progress; in raid10_start_reshape()
4286 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4290 raid10_size(mddev, 0, conf->geo.raid_disks), in raid10_start_reshape()
4301 conf->prev.raid_disks) in raid10_start_reshape()
4309 } else if (rdev->raid_disk >= conf->prev.raid_disks in raid10_start_reshape()
4319 spin_lock_irq(&conf->device_lock); in raid10_start_reshape()
4320 mddev->degraded = calc_degraded(conf); in raid10_start_reshape()
4321 spin_unlock_irq(&conf->device_lock); 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()
4338 conf->reshape_checkpoint = jiffies; in raid10_start_reshape()
4345 spin_lock_irq(&conf->device_lock); in raid10_start_reshape()
4346 conf->geo = conf->prev; in raid10_start_reshape()
4347 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4351 conf->reshape_progress = MaxSector; in raid10_start_reshape()
4352 conf->reshape_safe = MaxSector; in raid10_start_reshape()
4354 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4429 struct r10conf *conf = mddev->private; in reshape_request() local
4445 conf->reshape_progress < raid10_size(mddev, 0, 0)) { in reshape_request()
4447 - conf->reshape_progress); in reshape_request()
4449 conf->reshape_progress > 0) in reshape_request()
4450 sector_nr = conf->reshape_progress; in reshape_request()
4467 next = first_dev_address(conf->reshape_progress - 1, in reshape_request()
4468 &conf->geo); in reshape_request()
4473 safe = last_dev_address(conf->reshape_safe - 1, in reshape_request()
4474 &conf->prev); in reshape_request()
4476 if (next + conf->offset_diff < safe) in reshape_request()
4479 last = conf->reshape_progress - 1; in reshape_request()
4480 sector_nr = last & ~(sector_t)(conf->geo.chunk_mask in reshape_request()
4481 & conf->prev.chunk_mask); in reshape_request()
4488 next = last_dev_address(conf->reshape_progress, &conf->geo); in reshape_request()
4493 safe = first_dev_address(conf->reshape_safe, &conf->prev); in reshape_request()
4498 if (next > safe + conf->offset_diff) in reshape_request()
4501 sector_nr = conf->reshape_progress; in reshape_request()
4502 last = sector_nr | (conf->geo.chunk_mask in reshape_request()
4503 & conf->prev.chunk_mask); in reshape_request()
4510 time_after(jiffies, conf->reshape_checkpoint + 10*HZ)) { in reshape_request()
4512 wait_barrier(conf); in reshape_request()
4513 mddev->reshape_position = conf->reshape_progress; in reshape_request()
4516 - conf->reshape_progress; in reshape_request()
4518 mddev->curr_resync_completed = conf->reshape_progress; in reshape_request()
4519 conf->reshape_checkpoint = jiffies; in reshape_request()
4525 allow_barrier(conf); in reshape_request()
4528 conf->reshape_safe = mddev->reshape_position; in reshape_request()
4529 allow_barrier(conf); in reshape_request()
4532 raise_barrier(conf, 0); in reshape_request()
4535 r10_bio = raid10_alloc_init_r10buf(conf); in reshape_request()
4537 raise_barrier(conf, 1); in reshape_request()
4543 rdev = read_balance(conf, r10_bio, &max_sectors); in reshape_request()
4551 mempool_free(r10_bio, &conf->r10buf_pool); in reshape_request()
4572 __raid10_find_phys(&conf->geo, r10_bio); in reshape_request()
4578 for (s = 0; s < conf->copies*2; s++) { in reshape_request()
4583 rdev2 = rcu_dereference(conf->mirrors[d].replacement); in reshape_request()
4586 rdev2 = rcu_dereference(conf->mirrors[d].rdev); in reshape_request()
4633 lower_barrier(conf); in reshape_request()
4639 conf->reshape_progress -= sectors_done; in reshape_request()
4641 conf->reshape_progress += sectors_done; in reshape_request()
4656 struct r10conf *conf = mddev->private; in reshape_request_write() local
4670 for (s = 0; s < conf->copies*2; s++) { in reshape_request_write()
4676 rdev = rcu_dereference(conf->mirrors[d].replacement); in reshape_request_write()
4679 rdev = rcu_dereference(conf->mirrors[d].rdev); in reshape_request_write()
4696 static void end_reshape(struct r10conf *conf) in end_reshape() argument
4698 if (test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) in end_reshape()
4701 spin_lock_irq(&conf->device_lock); in end_reshape()
4702 conf->prev = conf->geo; in end_reshape()
4703 md_finish_reshape(conf->mddev); in end_reshape()
4705 conf->reshape_progress = MaxSector; in end_reshape()
4706 conf->reshape_safe = MaxSector; in end_reshape()
4707 spin_unlock_irq(&conf->device_lock); in end_reshape()
4712 if (conf->mddev->queue) { in end_reshape()
4713 int stripe = conf->geo.raid_disks * in end_reshape()
4714 ((conf->mddev->chunk_sectors << 9) / PAGE_SIZE); in end_reshape()
4715 stripe /= conf->geo.near_copies; 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()
4719 conf->fullsync = 0; in end_reshape()
4727 struct r10conf *conf = mddev->private; in handle_reshape_read_error() local
4734 sizeof(struct r10dev) * conf->copies, GFP_NOIO); in handle_reshape_read_error()
4744 __raid10_find_phys(&conf->prev, r10b); in handle_reshape_read_error()
4757 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); in handle_reshape_read_error()
4778 if (slot >= conf->copies) in handle_reshape_read_error()
4802 struct r10conf *conf = mddev->private; in end_reshape_write() local
4808 d = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in end_reshape_write()
4810 rdev = conf->mirrors[d].replacement; in end_reshape_write()
4813 rdev = conf->mirrors[d].rdev; in end_reshape_write()
4836 struct r10conf *conf = mddev->private; in raid10_finish_reshape() local
4850 for (d = conf->geo.raid_disks ; in raid10_finish_reshape()
4851 d < conf->geo.raid_disks - mddev->delta_disks; in raid10_finish_reshape()
4853 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); in raid10_finish_reshape()
4856 rdev = rcu_dereference(conf->mirrors[d].replacement); in raid10_finish_reshape()
4863 mddev->chunk_sectors = 1 << conf->geo.chunk_shift; in raid10_finish_reshape()