aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2015-10-21 13:20:02 -0400
committerJens Axboe <axboe@fb.com>2015-10-21 16:43:38 -0400
commitc7bfced9a6716ff66c9d61f934bb60af08d4688c (patch)
treeca3febf875a4365478296b2993c635899fe1416b
parent9609b9942b180a50b0162419abd2932a41117fe9 (diff)
md: suspend i/o during runtime blk_integrity_unregister
Synchronize pending i/o against a change in the integrity profile to avoid the possibility of spurious integrity errors. Given linear_add() is suspending the mddev before manipulating the mddev, do the same for the other personalities. Acked-by: NeilBrown <neilb@suse.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/md/md.c1
-rw-r--r--drivers/md/multipath.c2
-rw-r--r--drivers/md/raid1.c2
-rw-r--r--drivers/md/raid10.c2
4 files changed, 7 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 7d07caceb349..714aa92db174 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1994,6 +1994,7 @@ void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
1994 if (bi_rdev && blk_integrity_compare(mddev->gendisk, 1994 if (bi_rdev && blk_integrity_compare(mddev->gendisk,
1995 rdev->bdev->bd_disk) >= 0) 1995 rdev->bdev->bd_disk) >= 0)
1996 return; 1996 return;
1997 WARN_ON_ONCE(!mddev->suspended);
1997 printk(KERN_NOTICE "disabling data integrity on %s\n", mdname(mddev)); 1998 printk(KERN_NOTICE "disabling data integrity on %s\n", mdname(mddev));
1998 blk_integrity_unregister(mddev->gendisk); 1999 blk_integrity_unregister(mddev->gendisk);
1999} 2000}
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
index d132f06afdd1..7331a80d89f1 100644
--- a/drivers/md/multipath.c
+++ b/drivers/md/multipath.c
@@ -264,7 +264,9 @@ static int multipath_add_disk(struct mddev *mddev, struct md_rdev *rdev)
264 spin_unlock_irq(&conf->device_lock); 264 spin_unlock_irq(&conf->device_lock);
265 rcu_assign_pointer(p->rdev, rdev); 265 rcu_assign_pointer(p->rdev, rdev);
266 err = 0; 266 err = 0;
267 mddev_suspend(mddev);
267 md_integrity_add_rdev(rdev, mddev); 268 md_integrity_add_rdev(rdev, mddev);
269 mddev_resume(mddev);
268 break; 270 break;
269 } 271 }
270 272
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 049df6c4a8cc..a881b111fa35 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1621,7 +1621,9 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
1621 break; 1621 break;
1622 } 1622 }
1623 } 1623 }
1624 mddev_suspend(mddev);
1624 md_integrity_add_rdev(rdev, mddev); 1625 md_integrity_add_rdev(rdev, mddev);
1626 mddev_resume(mddev);
1625 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev))) 1627 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev)))
1626 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue); 1628 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue);
1627 print_conf(conf); 1629 print_conf(conf);
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 7c99a4037715..6f0ec107996a 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1736,7 +1736,9 @@ static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev)
1736 rcu_assign_pointer(p->rdev, rdev); 1736 rcu_assign_pointer(p->rdev, rdev);
1737 break; 1737 break;
1738 } 1738 }
1739 mddev_suspend(mddev);
1739 md_integrity_add_rdev(rdev, mddev); 1740 md_integrity_add_rdev(rdev, mddev);
1741 mddev_resume(mddev);
1740 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev))) 1742 if (mddev->queue && blk_queue_discard(bdev_get_queue(rdev->bdev)))
1741 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue); 1743 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue);
1742 1744