diff options
author | Shaohua Li <shli@fb.com> | 2016-01-06 17:37:14 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.com> | 2016-01-13 19:49:43 -0500 |
commit | 87d4d91616e4db9b8293ba9d9e5a2f3f0d0c8aa6 (patch) | |
tree | de66672eef0323ee4f5bce959a0ba86a646362b6 | |
parent | a62ab49eb502a07814f9942770893118c6281223 (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.c | 7 |
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); |