kernel-ark/fs/xfs
David Chinner 641c56fbfe [XFS] Prevent deadlock when flushing inodes on unmount
When we are unmounting the filesystem, we flush all the inodes to disk.
Unfortunately, if we have an inode cluster that has just been freed and
marked stale sitting in an incore log buffer (i.e. hasn't been flushed to
disk), it will be holding all the flush locks on the inodes in that
cluster.

xfs_iflush_all() which is called during unmount walks all the inodes
trying to reclaim them, and it doing so calls xfs_finish_reclaim() on each
inode. If the inode is dirty, if grabs the flush lock and flushes it.
Unfortunately, find dirty inodes that already have their flush lock held
and so we sleep.

At this point in the unmount process, we are running single-threaded.
There is nothing more that can push on the log to force the transaction
holding the inode flush locks to disk and hence we deadlock.

The fix is to issue a log force before flushing the inodes on unmount so
that all the flush locks will be released before we start flushing the
inodes.

SGI-PV: 964538
SGI-Modid: xfs-linux-melb:xfs-kern:28862a

Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
2007-07-14 15:33:38 +10:00
..
linux-2.6 [XFS] Map unwritten extents correctly for I/o completion processing 2007-07-14 15:32:49 +10:00
quota [XFS] Use generic shrinker interfaces in XFS. 2007-07-14 15:23:53 +10:00
support [XFS] reducing the number of random number functions. 2007-05-08 13:49:03 +10:00
Kbuild
Kconfig
Makefile
Makefile-linux-2.6
xfs_acl.c
xfs_acl.h
xfs_ag.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_alloc_btree.c [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_alloc_btree.h
xfs_alloc.c [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_alloc.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_arch.h
xfs_attr_leaf.c [XFS] The last argument "lsn" of xfs_trans_commit() is always called with 2007-05-08 13:48:42 +10:00
xfs_attr_leaf.h
xfs_attr_sf.h
xfs_attr.c [XFS] The last argument "lsn" of xfs_trans_commit() is always called with 2007-05-08 13:48:42 +10:00
xfs_attr.h
xfs_behavior.c
xfs_behavior.h
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c
xfs_bmap_btree.h
xfs_bmap.c [XFS] xfs_bmapi fails to update the previous extent pointer 2007-07-14 15:29:37 +10:00
xfs_bmap.h
xfs_btree.c
xfs_btree.h
xfs_buf_item.c
xfs_buf_item.h
xfs_clnt.h
xfs_da_btree.c
xfs_da_btree.h
xfs_dfrag.c [XFS] propogate return codes from flush routines 2007-05-08 13:49:27 +10:00
xfs_dfrag.h
xfs_dinode.h
xfs_dir2_block.c [XFS] the "aendp" arg to xfs_dir2_data_freescan is always NULL, remove it. 2007-05-08 13:48:49 +10:00
xfs_dir2_block.h
xfs_dir2_data.c [XFS] the "aendp" arg to xfs_dir2_data_freescan is always NULL, remove it. 2007-05-08 13:48:49 +10:00
xfs_dir2_data.h [XFS] the "aendp" arg to xfs_dir2_data_freescan is always NULL, remove it. 2007-05-08 13:48:49 +10:00
xfs_dir2_leaf.c [XFS] the "aendp" arg to xfs_dir2_data_freescan is always NULL, remove it. 2007-05-08 13:48:49 +10:00
xfs_dir2_leaf.h
xfs_dir2_node.c [XFS] the "aendp" arg to xfs_dir2_data_freescan is always NULL, remove it. 2007-05-08 13:48:49 +10:00
xfs_dir2_node.h
xfs_dir2_sf.c
xfs_dir2_sf.h
xfs_dir2_trace.c
xfs_dir2_trace.h
xfs_dir2.c
xfs_dir2.h
xfs_dmapi.h
xfs_dmops.c
xfs_error.c [XFS] reducing the number of random number functions. 2007-05-08 13:49:03 +10:00
xfs_error.h
xfs_extfree_item.c
xfs_extfree_item.h
xfs_fs.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_fsops.c [XFS] Log the agf_length change in xfs_growfs_data_private(). 2007-07-14 15:32:59 +10:00
xfs_fsops.h
xfs_ialloc_btree.c
xfs_ialloc_btree.h
xfs_ialloc.c [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_ialloc.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_iget.c [XFS] Add lockdep support for XFS 2007-05-08 13:50:19 +10:00
xfs_imap.h
xfs_inode_item.c
xfs_inode_item.h
xfs_inode.c [XFS] Fix to prevent the notorious 'NULL files' problem after a crash. 2007-05-08 13:49:46 +10:00
xfs_inode.h [XFS] Add lockdep support for XFS 2007-05-08 13:50:19 +10:00
xfs_inum.h
xfs_iocore.c [XFS] Fix to prevent the notorious 'NULL files' problem after a crash. 2007-05-08 13:49:46 +10:00
xfs_iomap.c [XFS] Fix to prevent the notorious 'NULL files' problem after a crash. 2007-05-08 13:49:46 +10:00
xfs_iomap.h [XFS] Fix to prevent the notorious 'NULL files' problem after a crash. 2007-05-08 13:49:46 +10:00
xfs_itable.c Fix occurrences of "the the " 2007-05-09 08:57:56 +02:00
xfs_itable.h
xfs_log_priv.h
xfs_log_recover.c [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_log_recover.h
xfs_log.c [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_log.h
xfs_mount.c [XFS] Prevent deadlock when flushing inodes on unmount 2007-07-14 15:33:38 +10:00
xfs_mount.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_qmops.c [XFS] The last argument "lsn" of xfs_trans_commit() is always called with 2007-05-08 13:48:42 +10:00
xfs_quota.h [XFS] Fix uquota and oquota enforcement problems. 2007-05-08 13:49:33 +10:00
xfs_refcache.h
xfs_rename.c [XFS] The last argument "lsn" of xfs_trans_commit() is always called with 2007-05-08 13:48:42 +10:00
xfs_rtalloc.c [XFS] Don't grow filesystems past the size they can index. 2007-07-14 15:21:29 +10:00
xfs_rtalloc.h
xfs_rw.c [XFS] The last argument "lsn" of xfs_trans_commit() is always called with 2007-05-08 13:48:42 +10:00
xfs_rw.h [XFS] Make hole punching at EOF atomic. 2007-07-14 15:23:40 +10:00
xfs_sb.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_trans_ail.c
xfs_trans_buf.c
xfs_trans_extfree.c
xfs_trans_inode.c
xfs_trans_item.c
xfs_trans_priv.h
xfs_trans_space.h
xfs_trans.c [XFS] Apply transaction delta counts atomically to incore counters 2007-07-14 15:32:09 +10:00
xfs_trans.h [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_types.h
xfs_utils.c [XFS] propogate return codes from flush routines 2007-05-08 13:49:27 +10:00
xfs_utils.h
xfs_vfsops.c [XFS] Lazy Superblock Counters 2007-07-14 15:28:50 +10:00
xfs_vnodeops.c [XFS] Make hole punching at EOF atomic. 2007-07-14 15:23:40 +10:00
xfs.h