diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 46 |
1 files changed, 18 insertions, 28 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 03724992cdf2..42e64e4e5e25 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -1482,14 +1482,14 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1482 | int sectors = r10_bio->sectors; | 1482 | int sectors = r10_bio->sectors; |
| 1483 | mdk_rdev_t*rdev; | 1483 | mdk_rdev_t*rdev; |
| 1484 | int max_read_errors = atomic_read(&mddev->max_corr_read_errors); | 1484 | int max_read_errors = atomic_read(&mddev->max_corr_read_errors); |
| 1485 | int d = r10_bio->devs[r10_bio->read_slot].devnum; | ||
| 1485 | 1486 | ||
| 1486 | rcu_read_lock(); | 1487 | rcu_read_lock(); |
| 1487 | { | 1488 | rdev = rcu_dereference(conf->mirrors[d].rdev); |
| 1488 | int d = r10_bio->devs[r10_bio->read_slot].devnum; | 1489 | if (rdev) { /* If rdev is not NULL */ |
| 1489 | char b[BDEVNAME_SIZE]; | 1490 | char b[BDEVNAME_SIZE]; |
| 1490 | int cur_read_error_count = 0; | 1491 | int cur_read_error_count = 0; |
| 1491 | 1492 | ||
| 1492 | rdev = rcu_dereference(conf->mirrors[d].rdev); | ||
| 1493 | bdevname(rdev->bdev, b); | 1493 | bdevname(rdev->bdev, b); |
| 1494 | 1494 | ||
| 1495 | if (test_bit(Faulty, &rdev->flags)) { | 1495 | if (test_bit(Faulty, &rdev->flags)) { |
| @@ -1530,7 +1530,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1530 | 1530 | ||
| 1531 | rcu_read_lock(); | 1531 | rcu_read_lock(); |
| 1532 | do { | 1532 | do { |
| 1533 | int d = r10_bio->devs[sl].devnum; | 1533 | d = r10_bio->devs[sl].devnum; |
| 1534 | rdev = rcu_dereference(conf->mirrors[d].rdev); | 1534 | rdev = rcu_dereference(conf->mirrors[d].rdev); |
| 1535 | if (rdev && | 1535 | if (rdev && |
| 1536 | test_bit(In_sync, &rdev->flags)) { | 1536 | test_bit(In_sync, &rdev->flags)) { |
| @@ -1564,7 +1564,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1564 | rcu_read_lock(); | 1564 | rcu_read_lock(); |
| 1565 | while (sl != r10_bio->read_slot) { | 1565 | while (sl != r10_bio->read_slot) { |
| 1566 | char b[BDEVNAME_SIZE]; | 1566 | char b[BDEVNAME_SIZE]; |
| 1567 | int d; | 1567 | |
| 1568 | if (sl==0) | 1568 | if (sl==0) |
| 1569 | sl = conf->copies; | 1569 | sl = conf->copies; |
| 1570 | sl--; | 1570 | sl--; |
| @@ -1601,7 +1601,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
| 1601 | } | 1601 | } |
| 1602 | sl = start; | 1602 | sl = start; |
| 1603 | while (sl != r10_bio->read_slot) { | 1603 | while (sl != r10_bio->read_slot) { |
| 1604 | int d; | 1604 | |
| 1605 | if (sl==0) | 1605 | if (sl==0) |
| 1606 | sl = conf->copies; | 1606 | sl = conf->copies; |
| 1607 | sl--; | 1607 | sl--; |
| @@ -2161,22 +2161,22 @@ static conf_t *setup_conf(mddev_t *mddev) | |||
| 2161 | sector_t stride, size; | 2161 | sector_t stride, size; |
| 2162 | int err = -EINVAL; | 2162 | int err = -EINVAL; |
| 2163 | 2163 | ||
| 2164 | if (mddev->chunk_sectors < (PAGE_SIZE >> 9) || | 2164 | if (mddev->new_chunk_sectors < (PAGE_SIZE >> 9) || |
| 2165 | !is_power_of_2(mddev->chunk_sectors)) { | 2165 | !is_power_of_2(mddev->new_chunk_sectors)) { |
| 2166 | printk(KERN_ERR "md/raid10:%s: chunk size must be " | 2166 | printk(KERN_ERR "md/raid10:%s: chunk size must be " |
| 2167 | "at least PAGE_SIZE(%ld) and be a power of 2.\n", | 2167 | "at least PAGE_SIZE(%ld) and be a power of 2.\n", |
| 2168 | mdname(mddev), PAGE_SIZE); | 2168 | mdname(mddev), PAGE_SIZE); |
| 2169 | goto out; | 2169 | goto out; |
| 2170 | } | 2170 | } |
| 2171 | 2171 | ||
| 2172 | nc = mddev->layout & 255; | 2172 | nc = mddev->new_layout & 255; |
| 2173 | fc = (mddev->layout >> 8) & 255; | 2173 | fc = (mddev->new_layout >> 8) & 255; |
| 2174 | fo = mddev->layout & (1<<16); | 2174 | fo = mddev->new_layout & (1<<16); |
| 2175 | 2175 | ||
| 2176 | if ((nc*fc) <2 || (nc*fc) > mddev->raid_disks || | 2176 | if ((nc*fc) <2 || (nc*fc) > mddev->raid_disks || |
| 2177 | (mddev->layout >> 17)) { | 2177 | (mddev->new_layout >> 17)) { |
| 2178 | printk(KERN_ERR "md/raid10:%s: unsupported raid10 layout: 0x%8x\n", | 2178 | printk(KERN_ERR "md/raid10:%s: unsupported raid10 layout: 0x%8x\n", |
| 2179 | mdname(mddev), mddev->layout); | 2179 | mdname(mddev), mddev->new_layout); |
| 2180 | goto out; | 2180 | goto out; |
| 2181 | } | 2181 | } |
| 2182 | 2182 | ||
| @@ -2241,7 +2241,6 @@ static conf_t *setup_conf(mddev_t *mddev) | |||
| 2241 | if (!conf->thread) | 2241 | if (!conf->thread) |
| 2242 | goto out; | 2242 | goto out; |
| 2243 | 2243 | ||
| 2244 | conf->scale_disks = 0; | ||
| 2245 | conf->mddev = mddev; | 2244 | conf->mddev = mddev; |
| 2246 | return conf; | 2245 | return conf; |
| 2247 | 2246 | ||
| @@ -2300,11 +2299,6 @@ static int run(mddev_t *mddev) | |||
| 2300 | if (disk_idx >= conf->raid_disks | 2299 | if (disk_idx >= conf->raid_disks |
| 2301 | || disk_idx < 0) | 2300 | || disk_idx < 0) |
| 2302 | continue; | 2301 | continue; |
| 2303 | if (conf->scale_disks) { | ||
| 2304 | disk_idx *= conf->scale_disks; | ||
| 2305 | rdev->raid_disk = disk_idx; | ||
| 2306 | /* MOVE 'rd%d' link !! */ | ||
| 2307 | } | ||
| 2308 | disk = conf->mirrors + disk_idx; | 2302 | disk = conf->mirrors + disk_idx; |
| 2309 | 2303 | ||
| 2310 | disk->rdev = rdev; | 2304 | disk->rdev = rdev; |
| @@ -2435,26 +2429,22 @@ static void *raid10_takeover_raid0(mddev_t *mddev) | |||
| 2435 | return ERR_PTR(-EINVAL); | 2429 | return ERR_PTR(-EINVAL); |
| 2436 | } | 2430 | } |
| 2437 | 2431 | ||
| 2438 | /* Update slot numbers to obtain | ||
| 2439 | * degraded raid10 with missing mirrors | ||
| 2440 | */ | ||
| 2441 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 2442 | rdev->raid_disk *= 2; | ||
| 2443 | } | ||
| 2444 | |||
| 2445 | /* Set new parameters */ | 2432 | /* Set new parameters */ |
| 2446 | mddev->new_level = 10; | 2433 | mddev->new_level = 10; |
| 2447 | /* new layout: far_copies = 1, near_copies = 2 */ | 2434 | /* new layout: far_copies = 1, near_copies = 2 */ |
| 2448 | mddev->new_layout = (1<<8) + 2; | 2435 | mddev->new_layout = (1<<8) + 2; |
| 2449 | mddev->new_chunk_sectors = mddev->chunk_sectors; | 2436 | mddev->new_chunk_sectors = mddev->chunk_sectors; |
| 2450 | mddev->delta_disks = mddev->raid_disks; | 2437 | mddev->delta_disks = mddev->raid_disks; |
| 2451 | mddev->degraded = mddev->raid_disks; | ||
| 2452 | mddev->raid_disks *= 2; | 2438 | mddev->raid_disks *= 2; |
| 2453 | /* make sure it will be not marked as dirty */ | 2439 | /* make sure it will be not marked as dirty */ |
| 2454 | mddev->recovery_cp = MaxSector; | 2440 | mddev->recovery_cp = MaxSector; |
| 2455 | 2441 | ||
| 2456 | conf = setup_conf(mddev); | 2442 | conf = setup_conf(mddev); |
| 2457 | conf->scale_disks = 2; | 2443 | if (!IS_ERR(conf)) |
| 2444 | list_for_each_entry(rdev, &mddev->disks, same_set) | ||
| 2445 | if (rdev->raid_disk >= 0) | ||
| 2446 | rdev->new_raid_disk = rdev->raid_disk * 2; | ||
| 2447 | |||
| 2458 | return conf; | 2448 | return conf; |
| 2459 | } | 2449 | } |
| 2460 | 2450 | ||
