• NeilBrown's avatar
    Remove invalidate_partition call from do_md_stop. · 271f5a9b
    NeilBrown authored
    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: default avatarNeilBrown <neilb@suse.de>
    271f5a9b
md.c 162 KB