diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-07-02 15:40:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-07-02 15:40:59 -0400 |
commit | d0fbad0aec1df29717fab736eb24c8a49cf2c70b (patch) | |
tree | b43d3899460f6d12851051bf2dfbb5594abb6632 | |
parent | 8d2b6f6b4a805ca74174e779bddde9ad075d3d43 (diff) | |
parent | bda3153998f3eb2cafa4a6311971143628eacdbc (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.c | 8 | ||||
-rw-r--r-- | drivers/md/raid10.c | 7 |
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 | ||