summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-09-01 12:32:52 +1000
committerNeilBrown <neilb@suse.de>2008-09-01 12:32:52 +1000
commit271f5a9b8f8ae0db95de72779d115c9d0b9d3cc5 (patch)
tree814bfe03f1c5ae97da163c8f6b24a0cf67cfd783
parentbef69ea0dcce574a425feb0a5aa4c63dd108b9a6 (diff)
downloadlinux-271f5a9b8f8ae0db95de72779d115c9d0b9d3cc5.tar.gz
linux-271f5a9b8f8ae0db95de72779d115c9d0b9d3cc5.tar.bz2
linux-271f5a9b8f8ae0db95de72779d115c9d0b9d3cc5.zip
Remove invalidate_partition call from do_md_stop.
When stopping an md array, or just switching to read-only, we currently call invalidate_partition while holding the mddev lock. The main reason for this is probably to ensure all dirty buffers are flushed (invalidate_partition calls fsync_bdev). However if any dirty buffers are found, it will almost certainly cause a deadlock as starting writeout will require an update to the superblock, and performing that updates requires taking the mddev lock - which is already held. This deadlock can be demonstrated by running "reboot -f -n" with a root filesystem on md/raid, and some dirty buffers in memory. All other calls to stop an array should already happen after a flush. The normal sequence is to stop using the array (e.g. umount) which will cause __blkdev_put to call sync_blockdev. Then open the array and issue the STOP_ARRAY ioctl while the buffers are all still clean. So this invalidate_partition is normally a no-op, except for one case where it will cause a deadlock. So remove it. This patch possibly addresses the regression recored in http://bugzilla.kernel.org/show_bug.cgi?id=11460 and http://bugzilla.kernel.org/show_bug.cgi?id=11452 though it isn't yet clear how it ever worked. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/md.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 8cfadc5bd2ba..4790c83d78d0 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3841,8 +3841,6 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
del_timer_sync(&mddev->safemode_timer);
- invalidate_partition(disk, 0);
-
switch(mode) {
case 1: /* readonly */
err = -ENXIO;