]> err.no Git - linux-2.6/commit
Remove invalidate_partition call from do_md_stop.
authorNeilBrown <neilb@suse.de>
Mon, 1 Sep 2008 02:32:52 +0000 (12:32 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 1 Sep 2008 02:32:52 +0000 (12:32 +1000)
commit271f5a9b8f8ae0db95de72779d115c9d0b9d3cc5
tree814bfe03f1c5ae97da163c8f6b24a0cf67cfd783
parentbef69ea0dcce574a425feb0a5aa4c63dd108b9a6
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