aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShaohua Li <shli@fb.com>2016-01-06 17:37:14 -0500
committerNeilBrown <neilb@suse.com>2016-01-13 19:49:43 -0500
commit87d4d91616e4db9b8293ba9d9e5a2f3f0d0c8aa6 (patch)
treede66672eef0323ee4f5bce959a0ba86a646362b6
parenta62ab49eb502a07814f9942770893118c6281223 (diff)
MD: add journal with array suspended
Hot add journal disk in recovery thread context brings a lot of trouble as IO could be running. Unlike spare disk hot add, adding journal disk with array suspended makes more sense and implmentation is much easier. Signed-off-by: Shaohua Li <shli@fb.com> Signed-off-by: NeilBrown <neilb@suse.com>
-rw-r--r--drivers/md/md.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 29a4bbf62be5..8753dee3983b 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2455,15 +2455,20 @@ static int add_bound_rdev(struct md_rdev *rdev)
2455{ 2455{
2456 struct mddev *mddev = rdev->mddev; 2456 struct mddev *mddev = rdev->mddev;
2457 int err = 0; 2457 int err = 0;
2458 bool add_journal = test_bit(Journal, &rdev->flags);
2458 2459
2459 if (!mddev->pers->hot_remove_disk) { 2460 if (!mddev->pers->hot_remove_disk || add_journal) {
2460 /* If there is hot_add_disk but no hot_remove_disk 2461 /* If there is hot_add_disk but no hot_remove_disk
2461 * then added disks for geometry changes, 2462 * then added disks for geometry changes,
2462 * and should be added immediately. 2463 * and should be added immediately.
2463 */ 2464 */
2464 super_types[mddev->major_version]. 2465 super_types[mddev->major_version].
2465 validate_super(mddev, rdev); 2466 validate_super(mddev, rdev);
2467 if (add_journal)
2468 mddev_suspend(mddev);
2466 err = mddev->pers->hot_add_disk(mddev, rdev); 2469 err = mddev->pers->hot_add_disk(mddev, rdev);
2470 if (add_journal)
2471 mddev_resume(mddev);
2467 if (err) { 2472 if (err) {
2468 unbind_rdev_from_array(rdev); 2473 unbind_rdev_from_array(rdev);
2469 export_rdev(rdev); 2474 export_rdev(rdev);