aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-07-02 15:40:59 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-07-02 15:40:59 -0400
commitd0fbad0aec1df29717fab736eb24c8a49cf2c70b (patch)
treeb43d3899460f6d12851051bf2dfbb5594abb6632
parent8d2b6f6b4a805ca74174e779bddde9ad075d3d43 (diff)
parentbda3153998f3eb2cafa4a6311971143628eacdbc (diff)
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md
Pull MD fixes from Shaohua Li: "Two small fixes for MD: - an error handling fix from me - a recover bug fix for raid10 from BingJing" * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md: md/raid10: fix that replacement cannot complete recovery after reassemble MD: cleanup resources in failure
-rw-r--r--drivers/md/md.c8
-rw-r--r--drivers/md/raid10.c7
2 files changed, 12 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 29b0cd9ec951..994aed2f9dff 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5547,7 +5547,8 @@ int md_run(struct mddev *mddev)
5547 else 5547 else
5548 pr_warn("md: personality for level %s is not loaded!\n", 5548 pr_warn("md: personality for level %s is not loaded!\n",
5549 mddev->clevel); 5549 mddev->clevel);
5550 return -EINVAL; 5550 err = -EINVAL;
5551 goto abort;
5551 } 5552 }
5552 spin_unlock(&pers_lock); 5553 spin_unlock(&pers_lock);
5553 if (mddev->level != pers->level) { 5554 if (mddev->level != pers->level) {
@@ -5560,7 +5561,8 @@ int md_run(struct mddev *mddev)
5560 pers->start_reshape == NULL) { 5561 pers->start_reshape == NULL) {
5561 /* This personality cannot handle reshaping... */ 5562 /* This personality cannot handle reshaping... */
5562 module_put(pers->owner); 5563 module_put(pers->owner);
5563 return -EINVAL; 5564 err = -EINVAL;
5565 goto abort;
5564 } 5566 }
5565 5567
5566 if (pers->sync_request) { 5568 if (pers->sync_request) {
@@ -5629,7 +5631,7 @@ int md_run(struct mddev *mddev)
5629 mddev->private = NULL; 5631 mddev->private = NULL;
5630 module_put(pers->owner); 5632 module_put(pers->owner);
5631 bitmap_destroy(mddev); 5633 bitmap_destroy(mddev);
5632 return err; 5634 goto abort;
5633 } 5635 }
5634 if (mddev->queue) { 5636 if (mddev->queue) {
5635 bool nonrot = true; 5637 bool nonrot = true;
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 478cf446827f..35bd3a62451b 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -3893,6 +3893,13 @@ static int raid10_run(struct mddev *mddev)
3893 disk->rdev->saved_raid_disk < 0) 3893 disk->rdev->saved_raid_disk < 0)
3894 conf->fullsync = 1; 3894 conf->fullsync = 1;
3895 } 3895 }
3896
3897 if (disk->replacement &&
3898 !test_bit(In_sync, &disk->replacement->flags) &&
3899 disk->replacement->saved_raid_disk < 0) {
3900 conf->fullsync = 1;
3901 }
3902
3896 disk->recovery_disabled = mddev->recovery_disabled - 1; 3903 disk->recovery_disabled = mddev->recovery_disabled - 1;
3897 } 3904 }
3898 3905