MD: add journal with array suspended
authorShaohua Li <shli@fb.com>
Wed, 6 Jan 2016 22:37:14 +0000 (14:37 -0800)
committerNeilBrown <neilb@suse.com>
Thu, 14 Jan 2016 00:49:43 +0000 (11:49 +1100)
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>
drivers/md/md.c

index 29a4bbf62be533097c68514097c89bbf0d89d3f0..8753dee3983beb21f74cd716af0e57e1ece8fa80 100644 (file)
@@ -2455,15 +2455,20 @@ static int add_bound_rdev(struct md_rdev *rdev)
 {
        struct mddev *mddev = rdev->mddev;
        int err = 0;
+       bool add_journal = test_bit(Journal, &rdev->flags);
 
-       if (!mddev->pers->hot_remove_disk) {
+       if (!mddev->pers->hot_remove_disk || add_journal) {
                /* If there is hot_add_disk but no hot_remove_disk
                 * then added disks for geometry changes,
                 * and should be added immediately.
                 */
                super_types[mddev->major_version].
                        validate_super(mddev, rdev);
+               if (add_journal)
+                       mddev_suspend(mddev);
                err = mddev->pers->hot_add_disk(mddev, rdev);
+               if (add_journal)
+                       mddev_resume(mddev);
                if (err) {
                        unbind_rdev_from_array(rdev);
                        export_rdev(rdev);