Re: [Bug #11460] 2.6.27-rc3 to -rc4 regression: init 0 hangs in halt

Previous thread: Re: md (regression): reboot/shutdown hangs by Neil Brown on Sunday, August 31, 2008 - 7:17 pm. (3 messages)

Next thread: [PATCH] compat: move cp_compat_stat to common code by Christoph Hellwig on Sunday, August 31, 2008 - 8:06 pm. (1 message)
From: Neil Brown
Date: Sunday, August 31, 2008 - 7:54 pm

Hi David.

Could you please try this patch?

Thanks,
NeilBrown


From 271f5a9b8f8ae0db95de72779d115c9d0b9d3cc5 Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Mon, 1 Sep 2008 12:32:52 +1000
Subject: [PATCH] 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>
---
 drivers/md/md.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 8cfadc5..4790c83 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;
-- 
1.5.6.5

--

From: David Greaves
Date: Monday, September 1, 2008 - 2:23 am

Yes, that fixed it.

Thanks

David

--

Previous thread: Re: md (regression): reboot/shutdown hangs by Neil Brown on Sunday, August 31, 2008 - 7:17 pm. (3 messages)

Next thread: [PATCH] compat: move cp_compat_stat to common code by Christoph Hellwig on Sunday, August 31, 2008 - 8:06 pm. (1 message)