raid10.c (c6380ecd8e9bee7aba3d9a5a94b58168244c4a61) | raid10.c (8b904b5b6b58b9a29dcf3f82d936d9e7fd69fda6) |
---|---|
1/* 2 * raid10.c : Multiple Devices driver for Linux 3 * 4 * Copyright (C) 2000-2004 Neil Brown 5 * 6 * RAID-10 support for md. 7 * 8 * Base on code in raid1.c. See raid1.c for further copyright information. --- 127 unchanged lines hidden (view full) --- 136 kfree(r10_bio); 137} 138 139#define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9) 140/* amount of memory to reserve for resync requests */ 141#define RESYNC_WINDOW (1024*1024) 142/* maximum number of concurrent requests, memory permitting */ 143#define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE) | 1/* 2 * raid10.c : Multiple Devices driver for Linux 3 * 4 * Copyright (C) 2000-2004 Neil Brown 5 * 6 * RAID-10 support for md. 7 * 8 * Base on code in raid1.c. See raid1.c for further copyright information. --- 127 unchanged lines hidden (view full) --- 136 kfree(r10_bio); 137} 138 139#define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9) 140/* amount of memory to reserve for resync requests */ 141#define RESYNC_WINDOW (1024*1024) 142/* maximum number of concurrent requests, memory permitting */ 143#define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE) |
144#define CLUSTER_RESYNC_WINDOW (32 * RESYNC_WINDOW) | 144#define CLUSTER_RESYNC_WINDOW (16 * RESYNC_WINDOW) |
145#define CLUSTER_RESYNC_WINDOW_SECTORS (CLUSTER_RESYNC_WINDOW >> 9) 146 147/* 148 * When performing a resync, we need to read and compare, so 149 * we need as many pages are there are copies. 150 * When performing a recovery, we need 2 bios, one for read, 151 * one for write (we recover only one drive per r10buf) 152 * --- 1687 unchanged lines hidden (view full) --- 1840 rdev->raid_disk = mirror; 1841 err = 0; 1842 if (rdev->saved_raid_disk != mirror) 1843 conf->fullsync = 1; 1844 rcu_assign_pointer(p->rdev, rdev); 1845 break; 1846 } 1847 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev))) | 145#define CLUSTER_RESYNC_WINDOW_SECTORS (CLUSTER_RESYNC_WINDOW >> 9) 146 147/* 148 * When performing a resync, we need to read and compare, so 149 * we need as many pages are there are copies. 150 * When performing a recovery, we need 2 bios, one for read, 151 * one for write (we recover only one drive per r10buf) 152 * --- 1687 unchanged lines hidden (view full) --- 1840 rdev->raid_disk = mirror; 1841 err = 0; 1842 if (rdev->saved_raid_disk != mirror) 1843 conf->fullsync = 1; 1844 rcu_assign_pointer(p->rdev, rdev); 1845 break; 1846 } 1847 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev))) |
1848 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue); | 1848 blk_queue_flag_set(QUEUE_FLAG_DISCARD, mddev->queue); |
1849 1850 print_conf(conf); 1851 return err; 1852} 1853 1854static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev) 1855{ 1856 struct r10conf *conf = mddev->private; --- 793 unchanged lines hidden (view full) --- 2650 int m; 2651 struct md_rdev *rdev; 2652 2653 if (test_bit(R10BIO_IsSync, &r10_bio->state) || 2654 test_bit(R10BIO_IsRecover, &r10_bio->state)) { 2655 for (m = 0; m < conf->copies; m++) { 2656 int dev = r10_bio->devs[m].devnum; 2657 rdev = conf->mirrors[dev].rdev; | 1849 1850 print_conf(conf); 1851 return err; 1852} 1853 1854static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev) 1855{ 1856 struct r10conf *conf = mddev->private; --- 793 unchanged lines hidden (view full) --- 2650 int m; 2651 struct md_rdev *rdev; 2652 2653 if (test_bit(R10BIO_IsSync, &r10_bio->state) || 2654 test_bit(R10BIO_IsRecover, &r10_bio->state)) { 2655 for (m = 0; m < conf->copies; m++) { 2656 int dev = r10_bio->devs[m].devnum; 2657 rdev = conf->mirrors[dev].rdev; |
2658 if (r10_bio->devs[m].bio == NULL || 2659 r10_bio->devs[m].bio->bi_end_io == NULL) | 2658 if (r10_bio->devs[m].bio == NULL) |
2660 continue; 2661 if (!r10_bio->devs[m].bio->bi_status) { 2662 rdev_clear_badblocks( 2663 rdev, 2664 r10_bio->devs[m].addr, 2665 r10_bio->sectors, 0); 2666 } else { 2667 if (!rdev_set_badblocks( 2668 rdev, 2669 r10_bio->devs[m].addr, 2670 r10_bio->sectors, 0)) 2671 md_error(conf->mddev, rdev); 2672 } 2673 rdev = conf->mirrors[dev].replacement; | 2659 continue; 2660 if (!r10_bio->devs[m].bio->bi_status) { 2661 rdev_clear_badblocks( 2662 rdev, 2663 r10_bio->devs[m].addr, 2664 r10_bio->sectors, 0); 2665 } else { 2666 if (!rdev_set_badblocks( 2667 rdev, 2668 r10_bio->devs[m].addr, 2669 r10_bio->sectors, 0)) 2670 md_error(conf->mddev, rdev); 2671 } 2672 rdev = conf->mirrors[dev].replacement; |
2674 if (r10_bio->devs[m].repl_bio == NULL || 2675 r10_bio->devs[m].repl_bio->bi_end_io == NULL) | 2673 if (r10_bio->devs[m].repl_bio == NULL) |
2676 continue; 2677 2678 if (!r10_bio->devs[m].repl_bio->bi_status) { 2679 rdev_clear_badblocks( 2680 rdev, 2681 r10_bio->devs[m].addr, 2682 r10_bio->sectors, 0); 2683 } else { --- 1095 unchanged lines hidden (view full) --- 3779 if (mddev_is_clustered(conf->mddev)) { 3780 int fc, fo; 3781 3782 fc = (mddev->layout >> 8) & 255; 3783 fo = mddev->layout & (1<<16); 3784 if (fc > 1 || fo > 0) { 3785 pr_err("only near layout is supported by clustered" 3786 " raid10\n"); | 2674 continue; 2675 2676 if (!r10_bio->devs[m].repl_bio->bi_status) { 2677 rdev_clear_badblocks( 2678 rdev, 2679 r10_bio->devs[m].addr, 2680 r10_bio->sectors, 0); 2681 } else { --- 1095 unchanged lines hidden (view full) --- 3777 if (mddev_is_clustered(conf->mddev)) { 3778 int fc, fo; 3779 3780 fc = (mddev->layout >> 8) & 255; 3781 fo = mddev->layout & (1<<16); 3782 if (fc > 1 || fo > 0) { 3783 pr_err("only near layout is supported by clustered" 3784 " raid10\n"); |
3787 goto out_free_conf; | 3785 goto out; |
3788 } 3789 } 3790 3791 mddev->thread = conf->thread; 3792 conf->thread = NULL; 3793 3794 chunk_size = mddev->chunk_sectors << 9; 3795 if (mddev->queue) { --- 45 unchanged lines hidden (view full) --- 3841 3842 if (blk_queue_discard(bdev_get_queue(rdev->bdev))) 3843 discard_supported = true; 3844 first = 0; 3845 } 3846 3847 if (mddev->queue) { 3848 if (discard_supported) | 3786 } 3787 } 3788 3789 mddev->thread = conf->thread; 3790 conf->thread = NULL; 3791 3792 chunk_size = mddev->chunk_sectors << 9; 3793 if (mddev->queue) { --- 45 unchanged lines hidden (view full) --- 3839 3840 if (blk_queue_discard(bdev_get_queue(rdev->bdev))) 3841 discard_supported = true; 3842 first = 0; 3843 } 3844 3845 if (mddev->queue) { 3846 if (discard_supported) |
3849 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, | 3847 blk_queue_flag_set(QUEUE_FLAG_DISCARD, |
3850 mddev->queue); 3851 else | 3848 mddev->queue); 3849 else |
3852 queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, | 3850 blk_queue_flag_clear(QUEUE_FLAG_DISCARD, |
3853 mddev->queue); 3854 } 3855 /* need to check that every block has at least one working mirror */ 3856 if (!enough(conf, -1)) { 3857 pr_err("md/raid10:%s: not enough operational mirrors.\n", 3858 mdname(mddev)); 3859 goto out_free_conf; 3860 } --- 966 unchanged lines hidden (view full) --- 4827static void raid10_finish_reshape(struct mddev *mddev) 4828{ 4829 struct r10conf *conf = mddev->private; 4830 4831 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) 4832 return; 4833 4834 if (mddev->delta_disks > 0) { | 3851 mddev->queue); 3852 } 3853 /* need to check that every block has at least one working mirror */ 3854 if (!enough(conf, -1)) { 3855 pr_err("md/raid10:%s: not enough operational mirrors.\n", 3856 mdname(mddev)); 3857 goto out_free_conf; 3858 } --- 966 unchanged lines hidden (view full) --- 4825static void raid10_finish_reshape(struct mddev *mddev) 4826{ 4827 struct r10conf *conf = mddev->private; 4828 4829 if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) 4830 return; 4831 4832 if (mddev->delta_disks > 0) { |
4833 sector_t size = raid10_size(mddev, 0, 0); 4834 md_set_array_sectors(mddev, size); |
|
4835 if (mddev->recovery_cp > mddev->resync_max_sectors) { 4836 mddev->recovery_cp = mddev->resync_max_sectors; 4837 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4838 } | 4835 if (mddev->recovery_cp > mddev->resync_max_sectors) { 4836 mddev->recovery_cp = mddev->resync_max_sectors; 4837 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4838 } |
4839 mddev->resync_max_sectors = mddev->array_sectors; | 4839 mddev->resync_max_sectors = size; 4840 if (mddev->queue) { 4841 set_capacity(mddev->gendisk, mddev->array_sectors); 4842 revalidate_disk(mddev->gendisk); 4843 } |
4840 } else { 4841 int d; 4842 rcu_read_lock(); 4843 for (d = conf->geo.raid_disks ; 4844 d < conf->geo.raid_disks - mddev->delta_disks; 4845 d++) { 4846 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); 4847 if (rdev) --- 57 unchanged lines hidden --- | 4844 } else { 4845 int d; 4846 rcu_read_lock(); 4847 for (d = conf->geo.raid_disks ; 4848 d < conf->geo.raid_disks - mddev->delta_disks; 4849 d++) { 4850 struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev); 4851 if (rdev) --- 57 unchanged lines hidden --- |