Lines Matching refs:conf
67 static void allow_barrier(struct r10conf *conf);
68 static void lower_barrier(struct r10conf *conf);
69 static int _enough(struct r10conf *conf, int previous, int ignore);
70 static int enough(struct r10conf *conf, int ignore);
75 static void end_reshape(struct r10conf *conf);
93 struct r10conf *conf = data; in r10bio_pool_alloc() local
94 int size = offsetof(struct r10bio, devs[conf->geo.raid_disks]); in r10bio_pool_alloc()
118 struct r10conf *conf = data; in r10buf_pool_alloc() local
125 r10_bio = r10bio_pool_alloc(gfp_flags, conf); in r10buf_pool_alloc()
129 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || in r10buf_pool_alloc()
130 test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) in r10buf_pool_alloc()
131 nalloc = conf->copies; /* resync */ in r10buf_pool_alloc()
136 if (!conf->have_replacement) in r10buf_pool_alloc()
152 if (!conf->have_replacement) in r10buf_pool_alloc()
174 &conf->mddev->recovery)) { in r10buf_pool_alloc()
206 rbio_pool_free(r10_bio, conf); in r10buf_pool_alloc()
212 struct r10conf *conf = data; in r10buf_pool_free() local
217 for (j = conf->copies; j--; ) { in r10buf_pool_free()
234 rbio_pool_free(r10bio, conf); in r10buf_pool_free()
237 static void put_all_bios(struct r10conf *conf, struct r10bio *r10_bio) in put_all_bios() argument
241 for (i = 0; i < conf->geo.raid_disks; i++) { in put_all_bios()
255 struct r10conf *conf = r10_bio->mddev->private; in free_r10bio() local
257 put_all_bios(conf, r10_bio); in free_r10bio()
258 mempool_free(r10_bio, &conf->r10bio_pool); in free_r10bio()
263 struct r10conf *conf = r10_bio->mddev->private; in put_buf() local
265 mempool_free(r10_bio, &conf->r10buf_pool); in put_buf()
267 lower_barrier(conf); in put_buf()
274 struct r10conf *conf = mddev->private; in reschedule_retry() local
276 spin_lock_irqsave(&conf->device_lock, flags); in reschedule_retry()
277 list_add(&r10_bio->retry_list, &conf->retry_list); in reschedule_retry()
278 conf->nr_queued ++; in reschedule_retry()
279 spin_unlock_irqrestore(&conf->device_lock, flags); in reschedule_retry()
282 wake_up(&conf->wait_barrier); in reschedule_retry()
295 struct r10conf *conf = r10_bio->mddev->private; in raid_end_bio_io() local
307 allow_barrier(conf); in raid_end_bio_io()
317 struct r10conf *conf = r10_bio->mddev->private; in update_head_pos() local
319 conf->mirrors[r10_bio->devs[slot].devnum].head_position = in update_head_pos()
326 static int find_bio_disk(struct r10conf *conf, struct r10bio *r10_bio, in find_bio_disk() argument
332 for (slot = 0; slot < conf->geo.raid_disks; slot++) { in find_bio_disk()
356 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_read_request() local
382 if (!_enough(conf, test_bit(R10BIO_Previous, &r10_bio->state), in raid10_end_read_request()
388 rdev_dec_pending(rdev, conf->mddev); in raid10_end_read_request()
395 mdname(conf->mddev), in raid10_end_read_request()
433 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_write_request() local
441 dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in raid10_end_write_request()
444 rdev = conf->mirrors[dev].replacement; in raid10_end_write_request()
448 rdev = conf->mirrors[dev].rdev; in raid10_end_write_request()
532 rdev_dec_pending(rdev, conf->mddev); in raid10_end_write_request()
625 static void raid10_find_phys(struct r10conf *conf, struct r10bio *r10bio) in raid10_find_phys() argument
627 struct geom *geo = &conf->geo; in raid10_find_phys()
629 if (conf->reshape_progress != MaxSector && in raid10_find_phys()
630 ((r10bio->sector >= conf->reshape_progress) != in raid10_find_phys()
631 conf->mddev->reshape_backwards)) { in raid10_find_phys()
633 geo = &conf->prev; in raid10_find_phys()
640 static sector_t raid10_find_virt(struct r10conf *conf, sector_t sector, int dev) in raid10_find_virt() argument
646 struct geom *geo = &conf->geo; in raid10_find_virt()
704 static struct md_rdev *read_balance(struct r10conf *conf, in read_balance() argument
718 struct geom *geo = &conf->geo; in read_balance()
720 raid10_find_phys(conf, r10_bio); in read_balance()
736 if ((conf->mddev->recovery_cp < MaxSector in read_balance()
737 && (this_sector + sectors >= conf->next_resync)) || in read_balance()
738 (mddev_is_clustered(conf->mddev) && in read_balance()
739 md_cluster_ops->area_resyncing(conf->mddev, READ, this_sector, in read_balance()
743 for (slot = 0; slot < conf->copies ; slot++) { in read_balance()
753 rdev = rcu_dereference(conf->mirrors[disk].replacement); in read_balance()
756 rdev = rcu_dereference(conf->mirrors[disk].rdev); in read_balance()
823 conf->mirrors[disk].head_position); in read_balance()
831 if (slot >= conf->copies) { in read_balance()
852 static void flush_pending_writes(struct r10conf *conf) in flush_pending_writes() argument
857 spin_lock_irq(&conf->device_lock); in flush_pending_writes()
859 if (conf->pending_bio_list.head) { in flush_pending_writes()
863 bio = bio_list_get(&conf->pending_bio_list); in flush_pending_writes()
864 conf->pending_count = 0; in flush_pending_writes()
865 spin_unlock_irq(&conf->device_lock); in flush_pending_writes()
881 md_bitmap_unplug(conf->mddev->bitmap); in flush_pending_writes()
882 wake_up(&conf->wait_barrier); in flush_pending_writes()
901 spin_unlock_irq(&conf->device_lock); in flush_pending_writes()
926 static void raise_barrier(struct r10conf *conf, int force) in raise_barrier() argument
928 BUG_ON(force && !conf->barrier); in raise_barrier()
929 spin_lock_irq(&conf->resync_lock); in raise_barrier()
932 wait_event_lock_irq(conf->wait_barrier, force || !conf->nr_waiting, in raise_barrier()
933 conf->resync_lock); in raise_barrier()
936 conf->barrier++; in raise_barrier()
939 wait_event_lock_irq(conf->wait_barrier, in raise_barrier()
940 !atomic_read(&conf->nr_pending) && conf->barrier < RESYNC_DEPTH, in raise_barrier()
941 conf->resync_lock); in raise_barrier()
943 spin_unlock_irq(&conf->resync_lock); in raise_barrier()
946 static void lower_barrier(struct r10conf *conf) in lower_barrier() argument
949 spin_lock_irqsave(&conf->resync_lock, flags); in lower_barrier()
950 conf->barrier--; in lower_barrier()
951 spin_unlock_irqrestore(&conf->resync_lock, flags); in lower_barrier()
952 wake_up(&conf->wait_barrier); in lower_barrier()
955 static void wait_barrier(struct r10conf *conf) in wait_barrier() argument
957 spin_lock_irq(&conf->resync_lock); in wait_barrier()
958 if (conf->barrier) { in wait_barrier()
960 conf->nr_waiting++; in wait_barrier()
970 raid10_log(conf->mddev, "wait barrier"); in wait_barrier()
971 wait_event_lock_irq(conf->wait_barrier, in wait_barrier()
972 !conf->barrier || in wait_barrier()
973 (atomic_read(&conf->nr_pending) && in wait_barrier()
980 (conf->mddev->thread->tsk == current && in wait_barrier()
982 &conf->mddev->recovery) && in wait_barrier()
983 conf->nr_queued > 0), in wait_barrier()
984 conf->resync_lock); in wait_barrier()
985 conf->nr_waiting--; in wait_barrier()
986 if (!conf->nr_waiting) in wait_barrier()
987 wake_up(&conf->wait_barrier); in wait_barrier()
989 atomic_inc(&conf->nr_pending); in wait_barrier()
990 spin_unlock_irq(&conf->resync_lock); in wait_barrier()
993 static void allow_barrier(struct r10conf *conf) in allow_barrier() argument
995 if ((atomic_dec_and_test(&conf->nr_pending)) || in allow_barrier()
996 (conf->array_freeze_pending)) in allow_barrier()
997 wake_up(&conf->wait_barrier); in allow_barrier()
1000 static void freeze_array(struct r10conf *conf, int extra) in freeze_array() argument
1014 spin_lock_irq(&conf->resync_lock); in freeze_array()
1015 conf->array_freeze_pending++; in freeze_array()
1016 conf->barrier++; in freeze_array()
1017 conf->nr_waiting++; in freeze_array()
1018 wait_event_lock_irq_cmd(conf->wait_barrier, in freeze_array()
1019 atomic_read(&conf->nr_pending) == conf->nr_queued+extra, in freeze_array()
1020 conf->resync_lock, in freeze_array()
1021 flush_pending_writes(conf)); in freeze_array()
1023 conf->array_freeze_pending--; in freeze_array()
1024 spin_unlock_irq(&conf->resync_lock); in freeze_array()
1027 static void unfreeze_array(struct r10conf *conf) in unfreeze_array() argument
1030 spin_lock_irq(&conf->resync_lock); in unfreeze_array()
1031 conf->barrier--; in unfreeze_array()
1032 conf->nr_waiting--; in unfreeze_array()
1033 wake_up(&conf->wait_barrier); in unfreeze_array()
1034 spin_unlock_irq(&conf->resync_lock); in unfreeze_array()
1058 struct r10conf *conf = mddev->private; in raid10_unplug() local
1062 spin_lock_irq(&conf->device_lock); in raid10_unplug()
1063 bio_list_merge(&conf->pending_bio_list, &plug->pending); in raid10_unplug()
1064 conf->pending_count += plug->pending_cnt; in raid10_unplug()
1065 spin_unlock_irq(&conf->device_lock); in raid10_unplug()
1066 wake_up(&conf->wait_barrier); in raid10_unplug()
1075 wake_up(&conf->wait_barrier); in raid10_unplug()
1101 static void regular_request_wait(struct mddev *mddev, struct r10conf *conf, in regular_request_wait() argument
1104 wait_barrier(conf); in regular_request_wait()
1106 bio->bi_iter.bi_sector < conf->reshape_progress && in regular_request_wait()
1107 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) { in regular_request_wait()
1108 raid10_log(conf->mddev, "wait reshape"); in regular_request_wait()
1109 allow_barrier(conf); in regular_request_wait()
1110 wait_event(conf->wait_barrier, in regular_request_wait()
1111 conf->reshape_progress <= bio->bi_iter.bi_sector || in regular_request_wait()
1112 conf->reshape_progress >= bio->bi_iter.bi_sector + in regular_request_wait()
1114 wait_barrier(conf); in regular_request_wait()
1121 struct r10conf *conf = mddev->private; in raid10_read_request() local
1149 err_rdev = rcu_dereference(conf->mirrors[disk].rdev); in raid10_read_request()
1160 regular_request_wait(mddev, conf, bio, r10_bio->sectors); in raid10_read_request()
1161 rdev = read_balance(conf, r10_bio, &max_sectors); in raid10_read_request()
1178 gfp, &conf->bio_split); in raid10_read_request()
1180 allow_barrier(conf); in raid10_read_request()
1182 wait_barrier(conf); in raid10_read_request()
1223 struct r10conf *conf = mddev->private; in raid10_write_one_disk() local
1229 rdev = conf->mirrors[devnum].replacement; in raid10_write_one_disk()
1233 rdev = conf->mirrors[devnum].rdev; in raid10_write_one_disk()
1236 rdev = conf->mirrors[devnum].rdev; in raid10_write_one_disk()
1250 &conf->mirrors[devnum].rdev->flags) in raid10_write_one_disk()
1251 && enough(conf, devnum)) in raid10_write_one_disk()
1255 if (conf->mddev->gendisk) in raid10_write_one_disk()
1256 trace_block_bio_remap(mbio, disk_devt(conf->mddev->gendisk), in raid10_write_one_disk()
1272 spin_lock_irqsave(&conf->device_lock, flags); in raid10_write_one_disk()
1273 bio_list_add(&conf->pending_bio_list, mbio); in raid10_write_one_disk()
1274 conf->pending_count++; in raid10_write_one_disk()
1275 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_write_one_disk()
1283 struct r10conf *conf = mddev->private; in wait_blocked_dev() local
1289 for (i = 0; i < conf->copies; i++) { in wait_blocked_dev()
1290 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in wait_blocked_dev()
1292 conf->mirrors[i].replacement); in wait_blocked_dev()
1337 allow_barrier(conf); in wait_blocked_dev()
1338 raid10_log(conf->mddev, "%s wait rdev %d blocked", in wait_blocked_dev()
1341 wait_barrier(conf); in wait_blocked_dev()
1349 struct r10conf *conf = mddev->private; in raid10_write_request() local
1360 prepare_to_wait(&conf->wait_barrier, in raid10_write_request()
1367 finish_wait(&conf->wait_barrier, &w); in raid10_write_request()
1371 regular_request_wait(mddev, conf, bio, sectors); in raid10_write_request()
1374 ? (bio->bi_iter.bi_sector < conf->reshape_safe && in raid10_write_request()
1375 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) in raid10_write_request()
1376 : (bio->bi_iter.bi_sector + sectors > conf->reshape_safe && in raid10_write_request()
1377 bio->bi_iter.bi_sector < conf->reshape_progress))) { in raid10_write_request()
1379 mddev->reshape_position = conf->reshape_progress; in raid10_write_request()
1383 raid10_log(conf->mddev, "wait reshape metadata"); in raid10_write_request()
1387 conf->reshape_safe = mddev->reshape_position; in raid10_write_request()
1390 if (conf->pending_count >= max_queued_requests) { in raid10_write_request()
1393 wait_event(conf->wait_barrier, in raid10_write_request()
1394 conf->pending_count < max_queued_requests); in raid10_write_request()
1407 raid10_find_phys(conf, r10_bio); in raid10_write_request()
1414 for (i = 0; i < conf->copies; i++) { in raid10_write_request()
1416 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); in raid10_write_request()
1418 conf->mirrors[d].replacement); in raid10_write_request()
1481 GFP_NOIO, &conf->bio_split); in raid10_write_request()
1483 allow_barrier(conf); in raid10_write_request()
1485 wait_barrier(conf); in raid10_write_request()
1495 for (i = 0; i < conf->copies; i++) { in raid10_write_request()
1506 struct r10conf *conf = mddev->private; in __make_request() local
1509 r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO); in __make_request()
1519 conf->geo.raid_disks); in __make_request()
1529 struct r10conf *conf = r10bio->mddev->private; in raid_end_discard_bio() local
1534 allow_barrier(conf); in raid_end_discard_bio()
1552 struct r10conf *conf = r10_bio->mddev->private; in raid10_end_discard_request() local
1563 dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in raid10_end_discard_request()
1565 rdev = conf->mirrors[dev].replacement; in raid10_end_discard_request()
1573 rdev = conf->mirrors[dev].rdev; in raid10_end_discard_request()
1577 rdev_dec_pending(rdev, conf->mddev); in raid10_end_discard_request()
1588 struct r10conf *conf = mddev->private; in raid10_handle_discard() local
1589 struct geom *geo = &conf->geo; in raid10_handle_discard()
1610 wait_barrier(conf); in raid10_handle_discard()
1647 split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split); in raid10_handle_discard()
1649 allow_barrier(conf); in raid10_handle_discard()
1652 wait_barrier(conf); in raid10_handle_discard()
1657 split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split); in raid10_handle_discard()
1659 allow_barrier(conf); in raid10_handle_discard()
1663 wait_barrier(conf); in raid10_handle_discard()
1693 r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO); in raid10_handle_discard()
1722 struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev); in raid10_handle_discard()
1724 conf->mirrors[disk].replacement); in raid10_handle_discard()
1785 struct md_rdev *rdev = conf->mirrors[disk].rdev; in raid10_handle_discard()
1798 struct md_rdev *rrdev = conf->mirrors[disk].replacement; in raid10_handle_discard()
1819 wait_barrier(conf); in raid10_handle_discard()
1827 allow_barrier(conf); in raid10_handle_discard()
1833 struct r10conf *conf = mddev->private; in raid10_make_request() local
1834 sector_t chunk_mask = (conf->geo.chunk_mask & conf->prev.chunk_mask); in raid10_make_request()
1855 && (conf->geo.near_copies < conf->geo.raid_disks in raid10_make_request()
1856 || conf->prev.near_copies < in raid10_make_request()
1857 conf->prev.raid_disks))) in raid10_make_request()
1864 wake_up(&conf->wait_barrier); in raid10_make_request()
1870 struct r10conf *conf = mddev->private; in raid10_status() local
1873 if (conf->geo.near_copies < conf->geo.raid_disks) in raid10_status()
1875 if (conf->geo.near_copies > 1) in raid10_status()
1876 seq_printf(seq, " %d near-copies", conf->geo.near_copies); in raid10_status()
1877 if (conf->geo.far_copies > 1) { in raid10_status()
1878 if (conf->geo.far_offset) in raid10_status()
1879 seq_printf(seq, " %d offset-copies", conf->geo.far_copies); in raid10_status()
1881 seq_printf(seq, " %d far-copies", conf->geo.far_copies); in raid10_status()
1882 if (conf->geo.far_set_size != conf->geo.raid_disks) in raid10_status()
1883 seq_printf(seq, " %d devices per set", conf->geo.far_set_size); in raid10_status()
1885 seq_printf(seq, " [%d/%d] [", conf->geo.raid_disks, in raid10_status()
1886 conf->geo.raid_disks - mddev->degraded); in raid10_status()
1888 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_status()
1889 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in raid10_status()
1901 static int _enough(struct r10conf *conf, int previous, int ignore) in _enough() argument
1907 disks = conf->prev.raid_disks; in _enough()
1908 ncopies = conf->prev.near_copies; in _enough()
1910 disks = conf->geo.raid_disks; in _enough()
1911 ncopies = conf->geo.near_copies; in _enough()
1916 int n = conf->copies; in _enough()
1922 (rdev = rcu_dereference(conf->mirrors[this].rdev)) && in _enough()
1937 static int enough(struct r10conf *conf, int ignore) in enough() argument
1944 return _enough(conf, 0, ignore) && in enough()
1945 _enough(conf, 1, ignore); in enough()
1951 struct r10conf *conf = mddev->private; in raid10_error() local
1960 spin_lock_irqsave(&conf->device_lock, flags); in raid10_error()
1962 && !enough(conf, rdev->raid_disk)) { in raid10_error()
1966 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_error()
1979 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_error()
1983 mdname(mddev), conf->geo.raid_disks - mddev->degraded); in raid10_error()
1986 static void print_conf(struct r10conf *conf) in print_conf() argument
1992 if (!conf) { in print_conf()
1996 pr_debug(" --- wd:%d rd:%d\n", conf->geo.raid_disks - conf->mddev->degraded, in print_conf()
1997 conf->geo.raid_disks); in print_conf()
2001 for (i = 0; i < conf->geo.raid_disks; i++) { in print_conf()
2003 rdev = conf->mirrors[i].rdev; in print_conf()
2012 static void close_sync(struct r10conf *conf) in close_sync() argument
2014 wait_barrier(conf); in close_sync()
2015 allow_barrier(conf); in close_sync()
2017 mempool_exit(&conf->r10buf_pool); in close_sync()
2023 struct r10conf *conf = mddev->private; in raid10_spare_active() local
2032 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_spare_active()
2033 tmp = conf->mirrors + i; in raid10_spare_active()
2060 spin_lock_irqsave(&conf->device_lock, flags); in raid10_spare_active()
2062 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10_spare_active()
2064 print_conf(conf); in raid10_spare_active()
2070 struct r10conf *conf = mddev->private; in raid10_add_disk() local
2074 int last = conf->geo.raid_disks - 1; in raid10_add_disk()
2081 if (rdev->saved_raid_disk < 0 && !_enough(conf, 1, -1)) in raid10_add_disk()
2091 rdev->saved_raid_disk < conf->geo.raid_disks && in raid10_add_disk()
2092 conf->mirrors[rdev->saved_raid_disk].rdev == NULL) in raid10_add_disk()
2097 struct raid10_info *p = &conf->mirrors[mirror]; in raid10_add_disk()
2111 conf->fullsync = 1; in raid10_add_disk()
2125 conf->fullsync = 1; in raid10_add_disk()
2132 print_conf(conf); in raid10_add_disk()
2138 struct r10conf *conf = mddev->private; in raid10_remove_disk() local
2142 struct raid10_info *p = conf->mirrors + number; in raid10_remove_disk()
2144 print_conf(conf); in raid10_remove_disk()
2163 number < conf->geo.raid_disks && in raid10_remove_disk()
2164 enough(conf, -1)) { in raid10_remove_disk()
2193 print_conf(conf); in raid10_remove_disk()
2199 struct r10conf *conf = r10_bio->mddev->private; in __end_sync_read() local
2208 &conf->mirrors[d].rdev->corrected_errors); in __end_sync_read()
2213 rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev); in __end_sync_read()
2226 struct r10conf *conf = r10_bio->mddev->private; in end_sync_read() local
2227 int d = find_bio_disk(conf, r10_bio, bio, NULL, NULL); in end_sync_read()
2271 struct r10conf *conf = mddev->private; in end_sync_write() local
2279 d = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in end_sync_write()
2281 rdev = conf->mirrors[d].replacement; in end_sync_write()
2283 rdev = conf->mirrors[d].rdev; in end_sync_write()
2324 struct r10conf *conf = mddev->private; in sync_request_write() local
2333 for (i=0; i<conf->copies; i++) in sync_request_write()
2337 if (i == conf->copies) in sync_request_write()
2348 for (i=0 ; i < conf->copies ; i++) { in sync_request_write()
2362 rdev = conf->mirrors[d].rdev; in sync_request_write()
2408 atomic_inc(&conf->mirrors[d].rdev->nr_pending); in sync_request_write()
2410 md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(tbio)); in sync_request_write()
2412 if (test_bit(FailFast, &conf->mirrors[d].rdev->flags)) in sync_request_write()
2414 tbio->bi_iter.bi_sector += conf->mirrors[d].rdev->data_offset; in sync_request_write()
2415 bio_set_dev(tbio, conf->mirrors[d].rdev->bdev); in sync_request_write()
2422 for (i = 0; i < conf->copies; i++) { in sync_request_write()
2433 md_sync_acct(conf->mirrors[d].replacement->bdev, in sync_request_write()
2465 struct r10conf *conf = mddev->private; in fix_recovery_read_error() local
2483 rdev = conf->mirrors[dr].rdev; in fix_recovery_read_error()
2491 rdev = conf->mirrors[dw].rdev; in fix_recovery_read_error()
2513 if (rdev != conf->mirrors[dw].rdev) { in fix_recovery_read_error()
2515 struct md_rdev *rdev2 = conf->mirrors[dw].rdev; in fix_recovery_read_error()
2523 conf->mirrors[dw].recovery_disabled in fix_recovery_read_error()
2540 struct r10conf *conf = mddev->private; in recovery_request_write() local
2564 atomic_inc(&conf->mirrors[d].rdev->nr_pending); in recovery_request_write()
2565 md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(wbio)); in recovery_request_write()
2569 atomic_inc(&conf->mirrors[d].replacement->nr_pending); in recovery_request_write()
2570 md_sync_acct(conf->mirrors[d].replacement->bdev, in recovery_request_write()
2644 static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio) in fix_read_error() argument
2655 rdev = conf->mirrors[d].rdev; in fix_read_error()
2693 rdev = rcu_dereference(conf->mirrors[d].rdev); in fix_read_error()
2705 conf->tmppage, in fix_read_error()
2713 if (sl == conf->copies) in fix_read_error()
2724 rdev = conf->mirrors[dn].rdev; in fix_read_error()
2745 sl = conf->copies; in fix_read_error()
2748 rdev = rcu_dereference(conf->mirrors[d].rdev); in fix_read_error()
2759 s, conf->tmppage, WRITE) in fix_read_error()
2781 sl = conf->copies; in fix_read_error()
2784 rdev = rcu_dereference(conf->mirrors[d].rdev); in fix_read_error()
2795 s, conf->tmppage, in fix_read_error()
2833 struct r10conf *conf = mddev->private; in narrow_write_error() local
2834 struct md_rdev *rdev = conf->mirrors[r10_bio->devs[i].devnum].rdev; in narrow_write_error()
2894 struct r10conf *conf = mddev->private; in handle_read_error() local
2912 freeze_array(conf, 1); in handle_read_error()
2913 fix_read_error(conf, mddev, r10_bio); in handle_read_error()
2914 unfreeze_array(conf); in handle_read_error()
2919 allow_barrier(conf); in handle_read_error()
2924 static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) in handle_write_completed() argument
2937 for (m = 0; m < conf->copies; m++) { in handle_write_completed()
2939 rdev = conf->mirrors[dev].rdev; in handle_write_completed()
2953 md_error(conf->mddev, rdev); in handle_write_completed()
2955 rdev = conf->mirrors[dev].replacement; in handle_write_completed()
2970 md_error(conf->mddev, rdev); in handle_write_completed()
2976 for (m = 0; m < conf->copies; m++) { in handle_write_completed()
2979 rdev = conf->mirrors[dev].rdev; in handle_write_completed()
2985 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
2989 md_error(conf->mddev, rdev); in handle_write_completed()
2993 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
2996 rdev = conf->mirrors[dev].replacement; in handle_write_completed()
3002 rdev_dec_pending(rdev, conf->mddev); in handle_write_completed()
3006 spin_lock_irq(&conf->device_lock); in handle_write_completed()
3007 list_add(&r10_bio->retry_list, &conf->bio_end_io_list); in handle_write_completed()
3008 conf->nr_queued++; in handle_write_completed()
3009 spin_unlock_irq(&conf->device_lock); in handle_write_completed()
3014 wake_up(&conf->wait_barrier); in handle_write_completed()
3015 md_wakeup_thread(conf->mddev->thread); in handle_write_completed()
3030 struct r10conf *conf = mddev->private; in raid10d() local
3031 struct list_head *head = &conf->retry_list; in raid10d()
3036 if (!list_empty_careful(&conf->bio_end_io_list) && in raid10d()
3039 spin_lock_irqsave(&conf->device_lock, flags); in raid10d()
3041 while (!list_empty(&conf->bio_end_io_list)) { in raid10d()
3042 list_move(conf->bio_end_io_list.prev, &tmp); in raid10d()
3043 conf->nr_queued--; in raid10d()
3046 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10d()
3064 flush_pending_writes(conf); in raid10d()
3066 spin_lock_irqsave(&conf->device_lock, flags); in raid10d()
3068 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10d()
3073 conf->nr_queued--; in raid10d()
3074 spin_unlock_irqrestore(&conf->device_lock, flags); in raid10d()
3077 conf = mddev->private; in raid10d()
3080 handle_write_completed(conf, r10_bio); in raid10d()
3099 static int init_resync(struct r10conf *conf) in init_resync() argument
3104 BUG_ON(mempool_initialized(&conf->r10buf_pool)); in init_resync()
3105 conf->have_replacement = 0; in init_resync()
3106 for (i = 0; i < conf->geo.raid_disks; i++) in init_resync()
3107 if (conf->mirrors[i].replacement) in init_resync()
3108 conf->have_replacement = 1; in init_resync()
3109 ret = mempool_init(&conf->r10buf_pool, buffs, in init_resync()
3110 r10buf_pool_alloc, r10buf_pool_free, conf); in init_resync()
3113 conf->next_resync = 0; in init_resync()
3117 static struct r10bio *raid10_alloc_init_r10buf(struct r10conf *conf) in raid10_alloc_init_r10buf() argument
3119 struct r10bio *r10bio = mempool_alloc(&conf->r10buf_pool, GFP_NOIO); in raid10_alloc_init_r10buf()
3125 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || in raid10_alloc_init_r10buf()
3126 test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) in raid10_alloc_init_r10buf()
3127 nalloc = conf->copies; /* resync */ in raid10_alloc_init_r10buf()
3150 static void raid10_set_cluster_sync_high(struct r10conf *conf) in raid10_set_cluster_sync_high() argument
3167 chunks = conf->geo.raid_disks / conf->geo.near_copies; in raid10_set_cluster_sync_high()
3168 if (conf->geo.raid_disks % conf->geo.near_copies == 0) in raid10_set_cluster_sync_high()
3172 window_size = (chunks + extra_chunk) * conf->mddev->chunk_sectors; in raid10_set_cluster_sync_high()
3180 conf->cluster_sync_high = conf->cluster_sync_low + window_size; in raid10_set_cluster_sync_high()
3218 struct r10conf *conf = mddev->private; in raid10_sync_request() local
3227 sector_t chunk_mask = conf->geo.chunk_mask; in raid10_sync_request()
3230 if (!mempool_initialized(&conf->r10buf_pool)) in raid10_sync_request()
3231 if (init_resync(conf)) in raid10_sync_request()
3244 conf->fullsync == 0) { in raid10_sync_request()
3255 conf->cluster_sync_low = 0; in raid10_sync_request()
3256 conf->cluster_sync_high = 0; in raid10_sync_request()
3268 end_reshape(conf); in raid10_sync_request()
3269 close_sync(conf); in raid10_sync_request()
3277 else for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3279 raid10_find_virt(conf, mddev->curr_resync, i); in raid10_sync_request()
3285 if ((!mddev->bitmap || conf->fullsync) in raid10_sync_request()
3286 && conf->have_replacement in raid10_sync_request()
3292 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3294 rcu_dereference(conf->mirrors[i].replacement); in raid10_sync_request()
3300 conf->fullsync = 0; in raid10_sync_request()
3303 close_sync(conf); in raid10_sync_request()
3311 if (chunks_skipped >= conf->geo.raid_disks) { in raid10_sync_request()
3325 if (conf->geo.near_copies < conf->geo.raid_disks && in raid10_sync_request()
3333 if (conf->nr_waiting) in raid10_sync_request()
3357 for (i = 0 ; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3365 struct raid10_info *mirror = &conf->mirrors[i]; in raid10_sync_request()
3388 sect = raid10_find_virt(conf, sector_nr, i); in raid10_sync_request()
3408 !conf->fullsync) { in raid10_sync_request()
3421 r10_bio = raid10_alloc_init_r10buf(conf); in raid10_sync_request()
3423 raise_barrier(conf, rb2 != NULL); in raid10_sync_request()
3433 raid10_find_phys(conf, r10_bio); in raid10_sync_request()
3439 for (j = 0; j < conf->geo.raid_disks; j++) { in raid10_sync_request()
3441 conf->mirrors[j].rdev); in raid10_sync_request()
3452 for (j=0; j<conf->copies;j++) { in raid10_sync_request()
3457 rcu_dereference(conf->mirrors[d].rdev); in raid10_sync_request()
3493 for (k=0; k<conf->copies; k++) in raid10_sync_request()
3496 BUG_ON(k == conf->copies); in raid10_sync_request()
3537 if (j == conf->copies) { in raid10_sync_request()
3545 for (k = 0; k < conf->copies; k++) in raid10_sync_request()
3588 for (; j < conf->copies; j++) { in raid10_sync_request()
3590 if (conf->mirrors[d].rdev && in raid10_sync_request()
3592 &conf->mirrors[d].rdev->flags)) in raid10_sync_request()
3622 (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high)); in raid10_sync_request()
3626 !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, in raid10_sync_request()
3634 r10_bio = raid10_alloc_init_r10buf(conf); in raid10_sync_request()
3639 raise_barrier(conf, 0); in raid10_sync_request()
3640 conf->next_resync = sector_nr; in raid10_sync_request()
3645 raid10_find_phys(conf, r10_bio); in raid10_sync_request()
3648 for (i = 0; i < conf->copies; i++) { in raid10_sync_request()
3660 rdev = rcu_dereference(conf->mirrors[d].rdev); in raid10_sync_request()
3690 rdev = rcu_dereference(conf->mirrors[d].replacement); in raid10_sync_request()
3715 for (i=0; i<conf->copies; i++) { in raid10_sync_request()
3718 rdev_dec_pending(conf->mirrors[d].rdev, in raid10_sync_request()
3723 conf->mirrors[d].replacement, in raid10_sync_request()
3759 if (conf->cluster_sync_high < sector_nr + nr_sectors) { in raid10_sync_request()
3760 conf->cluster_sync_low = mddev->curr_resync_completed; in raid10_sync_request()
3761 raid10_set_cluster_sync_high(conf); in raid10_sync_request()
3764 conf->cluster_sync_low, in raid10_sync_request()
3765 conf->cluster_sync_high); in raid10_sync_request()
3772 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3778 sect_va1 = raid10_find_virt(conf, sector_nr, i); in raid10_sync_request()
3780 if (conf->cluster_sync_high < sect_va1 + nr_sectors) { in raid10_sync_request()
3786 sect_va2 = raid10_find_virt(conf, in raid10_sync_request()
3789 if (conf->cluster_sync_low == 0 || in raid10_sync_request()
3790 conf->cluster_sync_low > sect_va2) in raid10_sync_request()
3791 conf->cluster_sync_low = sect_va2; in raid10_sync_request()
3795 raid10_set_cluster_sync_high(conf); in raid10_sync_request()
3797 conf->cluster_sync_low, in raid10_sync_request()
3798 conf->cluster_sync_high); in raid10_sync_request()
3842 struct r10conf *conf = mddev->private; in raid10_size() local
3845 raid_disks = min(conf->geo.raid_disks, in raid10_size()
3846 conf->prev.raid_disks); in raid10_size()
3848 sectors = conf->dev_sectors; in raid10_size()
3850 size = sectors >> conf->geo.chunk_shift; in raid10_size()
3851 sector_div(size, conf->geo.far_copies); in raid10_size()
3853 sector_div(size, conf->geo.near_copies); in raid10_size()
3855 return size << conf->geo.chunk_shift; in raid10_size()
3858 static void calc_sectors(struct r10conf *conf, sector_t size) in calc_sectors() argument
3865 size = size >> conf->geo.chunk_shift; in calc_sectors()
3866 sector_div(size, conf->geo.far_copies); in calc_sectors()
3867 size = size * conf->geo.raid_disks; in calc_sectors()
3868 sector_div(size, conf->geo.near_copies); in calc_sectors()
3871 size = size * conf->copies; in calc_sectors()
3876 size = DIV_ROUND_UP_SECTOR_T(size, conf->geo.raid_disks); in calc_sectors()
3878 conf->dev_sectors = size << conf->geo.chunk_shift; in calc_sectors()
3880 if (conf->geo.far_offset) in calc_sectors()
3881 conf->geo.stride = 1 << conf->geo.chunk_shift; in calc_sectors()
3883 sector_div(size, conf->geo.far_copies); in calc_sectors()
3884 conf->geo.stride = size << conf->geo.chunk_shift; in calc_sectors()
3947 struct r10conf *conf = NULL; in setup_conf() local
3967 conf = kzalloc(sizeof(struct r10conf), GFP_KERNEL); in setup_conf()
3968 if (!conf) in setup_conf()
3972 conf->mirrors = kcalloc(mddev->raid_disks + max(0, -mddev->delta_disks), in setup_conf()
3975 if (!conf->mirrors) in setup_conf()
3978 conf->tmppage = alloc_page(GFP_KERNEL); in setup_conf()
3979 if (!conf->tmppage) in setup_conf()
3982 conf->geo = geo; in setup_conf()
3983 conf->copies = copies; in setup_conf()
3984 err = mempool_init(&conf->r10bio_pool, NR_RAID_BIOS, r10bio_pool_alloc, in setup_conf()
3985 rbio_pool_free, conf); in setup_conf()
3989 err = bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0); in setup_conf()
3993 calc_sectors(conf, mddev->dev_sectors); in setup_conf()
3995 conf->prev = conf->geo; in setup_conf()
3996 conf->reshape_progress = MaxSector; in setup_conf()
3998 if (setup_geo(&conf->prev, mddev, geo_old) != conf->copies) { in setup_conf()
4002 conf->reshape_progress = mddev->reshape_position; in setup_conf()
4003 if (conf->prev.far_offset) in setup_conf()
4004 conf->prev.stride = 1 << conf->prev.chunk_shift; in setup_conf()
4007 conf->prev.stride = conf->dev_sectors; in setup_conf()
4009 conf->reshape_safe = conf->reshape_progress; in setup_conf()
4010 spin_lock_init(&conf->device_lock); in setup_conf()
4011 INIT_LIST_HEAD(&conf->retry_list); in setup_conf()
4012 INIT_LIST_HEAD(&conf->bio_end_io_list); in setup_conf()
4014 spin_lock_init(&conf->resync_lock); in setup_conf()
4015 init_waitqueue_head(&conf->wait_barrier); in setup_conf()
4016 atomic_set(&conf->nr_pending, 0); in setup_conf()
4019 conf->thread = md_register_thread(raid10d, mddev, "raid10"); in setup_conf()
4020 if (!conf->thread) in setup_conf()
4023 conf->mddev = mddev; in setup_conf()
4024 return conf; in setup_conf()
4027 if (conf) { in setup_conf()
4028 mempool_exit(&conf->r10bio_pool); in setup_conf()
4029 kfree(conf->mirrors); in setup_conf()
4030 safe_put_page(conf->tmppage); in setup_conf()
4031 bioset_exit(&conf->bio_split); in setup_conf()
4032 kfree(conf); in setup_conf()
4037 static void raid10_set_io_opt(struct r10conf *conf) in raid10_set_io_opt() argument
4039 int raid_disks = conf->geo.raid_disks; in raid10_set_io_opt()
4041 if (!(conf->geo.raid_disks % conf->geo.near_copies)) in raid10_set_io_opt()
4042 raid_disks /= conf->geo.near_copies; in raid10_set_io_opt()
4043 blk_queue_io_opt(conf->mddev->queue, (conf->mddev->chunk_sectors << 9) * in raid10_set_io_opt()
4049 struct r10conf *conf; in raid10_run() local
4062 conf = setup_conf(mddev); in raid10_run()
4063 if (IS_ERR(conf)) in raid10_run()
4064 return PTR_ERR(conf); in raid10_run()
4065 mddev->private = conf; in raid10_run()
4067 conf = mddev->private; in raid10_run()
4068 if (!conf) in raid10_run()
4071 if (mddev_is_clustered(conf->mddev)) { in raid10_run()
4083 mddev->thread = conf->thread; in raid10_run()
4084 conf->thread = NULL; in raid10_run()
4092 raid10_set_io_opt(conf); in raid10_run()
4101 if (disk_idx >= conf->geo.raid_disks && in raid10_run()
4102 disk_idx >= conf->prev.raid_disks) in raid10_run()
4104 disk = conf->mirrors + disk_idx; in raid10_run()
4143 if (!enough(conf, -1)) { in raid10_run()
4149 if (conf->reshape_progress != MaxSector) { in raid10_run()
4151 if (conf->geo.far_copies != 1 && in raid10_run()
4152 conf->geo.far_offset == 0) in raid10_run()
4154 if (conf->prev.far_copies != 1 && in raid10_run()
4155 conf->prev.far_offset == 0) in raid10_run()
4161 i < conf->geo.raid_disks in raid10_run()
4162 || i < conf->prev.raid_disks; in raid10_run()
4165 disk = conf->mirrors + i; in raid10_run()
4180 conf->fullsync = 1; in raid10_run()
4186 conf->fullsync = 1; in raid10_run()
4196 mdname(mddev), conf->geo.raid_disks - mddev->degraded, in raid10_run()
4197 conf->geo.raid_disks); in raid10_run()
4201 mddev->dev_sectors = conf->dev_sectors; in raid10_run()
4210 if (conf->reshape_progress != MaxSector) { in raid10_run()
4213 before_length = ((1 << conf->prev.chunk_shift) * in raid10_run()
4214 conf->prev.far_copies); in raid10_run()
4215 after_length = ((1 << conf->geo.chunk_shift) * in raid10_run()
4216 conf->geo.far_copies); in raid10_run()
4223 conf->offset_diff = min_offset_diff; in raid10_run()
4239 mempool_exit(&conf->r10bio_pool); in raid10_run()
4240 safe_put_page(conf->tmppage); in raid10_run()
4241 kfree(conf->mirrors); in raid10_run()
4242 kfree(conf); in raid10_run()
4250 struct r10conf *conf = priv; in raid10_free() local
4252 mempool_exit(&conf->r10bio_pool); in raid10_free()
4253 safe_put_page(conf->tmppage); in raid10_free()
4254 kfree(conf->mirrors); in raid10_free()
4255 kfree(conf->mirrors_old); in raid10_free()
4256 kfree(conf->mirrors_new); in raid10_free()
4257 bioset_exit(&conf->bio_split); in raid10_free()
4258 kfree(conf); in raid10_free()
4263 struct r10conf *conf = mddev->private; in raid10_quiesce() local
4266 raise_barrier(conf, 0); in raid10_quiesce()
4268 lower_barrier(conf); in raid10_quiesce()
4285 struct r10conf *conf = mddev->private; in raid10_resize() local
4291 if (conf->geo.far_copies > 1 && !conf->geo.far_offset) in raid10_resize()
4310 calc_sectors(conf, sectors); in raid10_resize()
4311 mddev->dev_sectors = conf->dev_sectors; in raid10_resize()
4319 struct r10conf *conf; in raid10_takeover_raid0() local
4339 conf = setup_conf(mddev); in raid10_takeover_raid0()
4340 if (!IS_ERR(conf)) { in raid10_takeover_raid0()
4346 conf->barrier = 1; in raid10_takeover_raid0()
4349 return conf; in raid10_takeover_raid0()
4390 struct r10conf *conf = mddev->private; in raid10_check_reshape() local
4393 if (conf->geo.far_copies != 1 && !conf->geo.far_offset) in raid10_check_reshape()
4396 if (setup_geo(&geo, mddev, geo_start) != conf->copies) in raid10_check_reshape()
4407 if (!enough(conf, -1)) in raid10_check_reshape()
4410 kfree(conf->mirrors_new); in raid10_check_reshape()
4411 conf->mirrors_new = NULL; in raid10_check_reshape()
4414 conf->mirrors_new = in raid10_check_reshape()
4418 if (!conf->mirrors_new) in raid10_check_reshape()
4437 static int calc_degraded(struct r10conf *conf) in calc_degraded() argument
4445 for (i = 0; i < conf->prev.raid_disks; i++) { in calc_degraded()
4446 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in calc_degraded()
4457 if (conf->geo.raid_disks == conf->prev.raid_disks) in calc_degraded()
4461 for (i = 0; i < conf->geo.raid_disks; i++) { in calc_degraded()
4462 struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); in calc_degraded()
4471 if (conf->geo.raid_disks <= conf->prev.raid_disks) in calc_degraded()
4497 struct r10conf *conf = mddev->private; in raid10_start_reshape() local
4505 if (setup_geo(&new, mddev, geo_start) != conf->copies) in raid10_start_reshape()
4508 before_length = ((1 << conf->prev.chunk_shift) * in raid10_start_reshape()
4509 conf->prev.far_copies); in raid10_start_reshape()
4510 after_length = ((1 << conf->geo.chunk_shift) * in raid10_start_reshape()
4511 conf->geo.far_copies); in raid10_start_reshape()
4536 conf->offset_diff = min_offset_diff; in raid10_start_reshape()
4537 spin_lock_irq(&conf->device_lock); in raid10_start_reshape()
4538 if (conf->mirrors_new) { in raid10_start_reshape()
4539 memcpy(conf->mirrors_new, conf->mirrors, in raid10_start_reshape()
4540 sizeof(struct raid10_info)*conf->prev.raid_disks); in raid10_start_reshape()
4542 kfree(conf->mirrors_old); in raid10_start_reshape()
4543 conf->mirrors_old = conf->mirrors; in raid10_start_reshape()
4544 conf->mirrors = conf->mirrors_new; in raid10_start_reshape()
4545 conf->mirrors_new = NULL; in raid10_start_reshape()
4547 setup_geo(&conf->geo, mddev, geo_start); in raid10_start_reshape()
4552 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4558 conf->reshape_progress = size; in raid10_start_reshape()
4560 conf->reshape_progress = 0; in raid10_start_reshape()
4561 conf->reshape_safe = conf->reshape_progress; in raid10_start_reshape()
4562 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4569 newsize = raid10_size(mddev, 0, conf->geo.raid_disks); in raid10_start_reshape()
4611 conf->prev.raid_disks) in raid10_start_reshape()
4619 } else if (rdev->raid_disk >= conf->prev.raid_disks in raid10_start_reshape()
4629 spin_lock_irq(&conf->device_lock); in raid10_start_reshape()
4630 mddev->degraded = calc_degraded(conf); in raid10_start_reshape()
4631 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4632 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4633 mddev->reshape_position = conf->reshape_progress; in raid10_start_reshape()
4648 conf->reshape_checkpoint = jiffies; in raid10_start_reshape()
4655 spin_lock_irq(&conf->device_lock); in raid10_start_reshape()
4656 conf->geo = conf->prev; in raid10_start_reshape()
4657 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4661 conf->reshape_progress = MaxSector; in raid10_start_reshape()
4662 conf->reshape_safe = MaxSector; in raid10_start_reshape()
4664 spin_unlock_irq(&conf->device_lock); in raid10_start_reshape()
4739 struct r10conf *conf = mddev->private; in reshape_request() local
4755 conf->reshape_progress < raid10_size(mddev, 0, 0)) { in reshape_request()
4757 - conf->reshape_progress); in reshape_request()
4759 conf->reshape_progress > 0) in reshape_request()
4760 sector_nr = conf->reshape_progress; in reshape_request()
4777 next = first_dev_address(conf->reshape_progress - 1, in reshape_request()
4778 &conf->geo); in reshape_request()
4783 safe = last_dev_address(conf->reshape_safe - 1, in reshape_request()
4784 &conf->prev); in reshape_request()
4786 if (next + conf->offset_diff < safe) in reshape_request()
4789 last = conf->reshape_progress - 1; in reshape_request()
4790 sector_nr = last & ~(sector_t)(conf->geo.chunk_mask in reshape_request()
4791 & conf->prev.chunk_mask); in reshape_request()
4798 next = last_dev_address(conf->reshape_progress, &conf->geo); in reshape_request()
4803 safe = first_dev_address(conf->reshape_safe, &conf->prev); in reshape_request()
4808 if (next > safe + conf->offset_diff) in reshape_request()
4811 sector_nr = conf->reshape_progress; in reshape_request()
4812 last = sector_nr | (conf->geo.chunk_mask in reshape_request()
4813 & conf->prev.chunk_mask); in reshape_request()
4820 time_after(jiffies, conf->reshape_checkpoint + 10*HZ)) { in reshape_request()
4822 wait_barrier(conf); in reshape_request()
4823 mddev->reshape_position = conf->reshape_progress; in reshape_request()
4826 - conf->reshape_progress; in reshape_request()
4828 mddev->curr_resync_completed = conf->reshape_progress; in reshape_request()
4829 conf->reshape_checkpoint = jiffies; in reshape_request()
4835 allow_barrier(conf); in reshape_request()
4838 conf->reshape_safe = mddev->reshape_position; in reshape_request()
4839 allow_barrier(conf); in reshape_request()
4842 raise_barrier(conf, 0); in reshape_request()
4845 r10_bio = raid10_alloc_init_r10buf(conf); in reshape_request()
4847 raise_barrier(conf, 1); in reshape_request()
4853 rdev = read_balance(conf, r10_bio, &max_sectors); in reshape_request()
4861 mempool_free(r10_bio, &conf->r10buf_pool); in reshape_request()
4881 if (mddev_is_clustered(mddev) && conf->cluster_sync_high <= sector_nr) { in reshape_request()
4885 conf->cluster_sync_low = sector_nr; in reshape_request()
4886 conf->cluster_sync_high = sector_nr + CLUSTER_RESYNC_WINDOW_SECTORS; in reshape_request()
4895 if (sb_reshape_pos < conf->cluster_sync_low) in reshape_request()
4896 conf->cluster_sync_low = sb_reshape_pos; in reshape_request()
4899 md_cluster_ops->resync_info_update(mddev, conf->cluster_sync_low, in reshape_request()
4900 conf->cluster_sync_high); in reshape_request()
4904 __raid10_find_phys(&conf->geo, r10_bio); in reshape_request()
4910 for (s = 0; s < conf->copies*2; s++) { in reshape_request()
4915 rdev2 = rcu_dereference(conf->mirrors[d].replacement); in reshape_request()
4918 rdev2 = rcu_dereference(conf->mirrors[d].rdev); in reshape_request()
4964 lower_barrier(conf); in reshape_request()
4970 conf->reshape_progress -= sectors_done; in reshape_request()
4972 conf->reshape_progress += sectors_done; in reshape_request()
4987 struct r10conf *conf = mddev->private; in reshape_request_write() local
5001 for (s = 0; s < conf->copies*2; s++) { in reshape_request_write()
5007 rdev = rcu_dereference(conf->mirrors[d].replacement); in reshape_request_write()
5010 rdev = rcu_dereference(conf->mirrors[d].rdev); in reshape_request_write()
5027 static void end_reshape(struct r10conf *conf) in end_reshape() argument
5029 if (test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) in end_reshape()
5032 spin_lock_irq(&conf->device_lock); in end_reshape()
5033 conf->prev = conf->geo; in end_reshape()
5034 md_finish_reshape(conf->mddev); in end_reshape()
5036 conf->reshape_progress = MaxSector; in end_reshape()
5037 conf->reshape_safe = MaxSector; in end_reshape()
5038 spin_unlock_irq(&conf->device_lock); in end_reshape()
5040 if (conf->mddev->queue) in end_reshape()
5041 raid10_set_io_opt(conf); in end_reshape()
5042 conf->fullsync = 0; in end_reshape()
5047 struct r10conf *conf = mddev->private; in raid10_update_reshape_pos() local
5053 conf->reshape_progress = mddev->reshape_position; in raid10_update_reshape_pos()
5063 struct r10conf *conf = mddev->private; in handle_reshape_read_error() local
5069 r10b = kmalloc(struct_size(r10b, devs, conf->copies), GFP_NOIO); in handle_reshape_read_error()
5079 __raid10_find_phys(&conf->prev, r10b); in handle_reshape_read_error()
5092 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); in handle_reshape_read_error()
5113 if (slot >= conf->copies) in handle_reshape_read_error()
5137 struct r10conf *conf = mddev->private; in end_reshape_write() local
5143 d = find_bio_disk(conf, r10_bio, bio, &slot, &repl); in end_reshape_write()
5145 rdev = conf->mirrors[d].replacement; in end_reshape_write()
5148 rdev = conf->mirrors[d].rdev; in end_reshape_write()
5171 struct r10conf *conf = mddev->private; in raid10_finish_reshape() local
5185 for (d = conf->geo.raid_disks ; in raid10_finish_reshape()
5186 d < conf->geo.raid_disks - mddev->delta_disks; in raid10_finish_reshape()
5188 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); in raid10_finish_reshape()
5191 rdev = rcu_dereference(conf->mirrors[d].replacement); in raid10_finish_reshape()
5198 mddev->chunk_sectors = 1 << conf->geo.chunk_shift; in raid10_finish_reshape()