diff options
author | Kukjin Kim <kgene.kim@samsung.com> | 2012-05-12 18:53:34 -0400 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2012-05-12 18:53:34 -0400 |
commit | 163ec0369be4c26e68385f6cec88d0ee38c8d8e5 (patch) | |
tree | f3e441866f8bc1b0548e7d8eddd9548b6aedef5e /drivers/md/raid0.c | |
parent | 199642bfe107c411f25fbfc16c9fd49cfef9785d (diff) | |
parent | 99dbdd98f271899e023d52b3f4c2bf67cdd7eb56 (diff) |
Merge branch 'next/cleanup-plat-s3c24xx' into next/cleanup-plat-s3c24xx-s5p
Diffstat (limited to 'drivers/md/raid0.c')
-rw-r--r-- | drivers/md/raid0.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 6f31f5596e01..de63a1fc3737 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -407,6 +407,8 @@ static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks | |||
407 | return array_sectors; | 407 | return array_sectors; |
408 | } | 408 | } |
409 | 409 | ||
410 | static int raid0_stop(struct mddev *mddev); | ||
411 | |||
410 | static int raid0_run(struct mddev *mddev) | 412 | static int raid0_run(struct mddev *mddev) |
411 | { | 413 | { |
412 | struct r0conf *conf; | 414 | struct r0conf *conf; |
@@ -454,7 +456,12 @@ static int raid0_run(struct mddev *mddev) | |||
454 | 456 | ||
455 | blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec); | 457 | blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec); |
456 | dump_zones(mddev); | 458 | dump_zones(mddev); |
457 | return md_integrity_register(mddev); | 459 | |
460 | ret = md_integrity_register(mddev); | ||
461 | if (ret) | ||
462 | raid0_stop(mddev); | ||
463 | |||
464 | return ret; | ||
458 | } | 465 | } |
459 | 466 | ||
460 | static int raid0_stop(struct mddev *mddev) | 467 | static int raid0_stop(struct mddev *mddev) |
@@ -625,6 +632,7 @@ static void *raid0_takeover_raid10(struct mddev *mddev) | |||
625 | static void *raid0_takeover_raid1(struct mddev *mddev) | 632 | static void *raid0_takeover_raid1(struct mddev *mddev) |
626 | { | 633 | { |
627 | struct r0conf *priv_conf; | 634 | struct r0conf *priv_conf; |
635 | int chunksect; | ||
628 | 636 | ||
629 | /* Check layout: | 637 | /* Check layout: |
630 | * - (N - 1) mirror drives must be already faulty | 638 | * - (N - 1) mirror drives must be already faulty |
@@ -635,10 +643,25 @@ static void *raid0_takeover_raid1(struct mddev *mddev) | |||
635 | return ERR_PTR(-EINVAL); | 643 | return ERR_PTR(-EINVAL); |
636 | } | 644 | } |
637 | 645 | ||
646 | /* | ||
647 | * a raid1 doesn't have the notion of chunk size, so | ||
648 | * figure out the largest suitable size we can use. | ||
649 | */ | ||
650 | chunksect = 64 * 2; /* 64K by default */ | ||
651 | |||
652 | /* The array must be an exact multiple of chunksize */ | ||
653 | while (chunksect && (mddev->array_sectors & (chunksect - 1))) | ||
654 | chunksect >>= 1; | ||
655 | |||
656 | if ((chunksect << 9) < PAGE_SIZE) | ||
657 | /* array size does not allow a suitable chunk size */ | ||
658 | return ERR_PTR(-EINVAL); | ||
659 | |||
638 | /* Set new parameters */ | 660 | /* Set new parameters */ |
639 | mddev->new_level = 0; | 661 | mddev->new_level = 0; |
640 | mddev->new_layout = 0; | 662 | mddev->new_layout = 0; |
641 | mddev->new_chunk_sectors = 128; /* by default set chunk size to 64k */ | 663 | mddev->new_chunk_sectors = chunksect; |
664 | mddev->chunk_sectors = chunksect; | ||
642 | mddev->delta_disks = 1 - mddev->raid_disks; | 665 | mddev->delta_disks = 1 - mddev->raid_disks; |
643 | mddev->raid_disks = 1; | 666 | mddev->raid_disks = 1; |
644 | /* make sure it will be not marked as dirty */ | 667 | /* make sure it will be not marked as dirty */ |