WSL2-Linux-Kernel/fs/xfs/linux-2.6
David Chinner 585e6d8856 [XFS] Fix a synchronous buftarg flush deadlock when freezing.
At the last stage of a freeze, we flush the buftarg synchronously over and
over again until it succeeds twice without skipping any buffers.

The delwri list flush skips pinned buffers, but tries to flush all others.
It removes the buffers from the delwri list, then tries to lock them one
at a time as it traverses the list to issue the I/O. It holds them locked
until we issue all of the I/O and then unlocks them once we've waited for
it to complete.

The problem is that during a freeze, the filesystem may still be doing
stuff - like flushing delalloc data buffers - in the background and hence
we can be trying to lock buffers that were on the delwri list at the same
time. Hence we can get ABBA deadlocks between threads doing allocation and
the buftarg flush (freeze) thread.

Fix it by skipping locked (and pinned) buffers as we traverse the delwri
buffer list.

SGI-PV: 957195
SGI-Modid: xfs-linux-melb:xfs-kern:27535a

Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
2007-02-10 18:32:29 +11:00
..
kmem.c [PATCH] separate bdi congestion functions from queue congestion functions 2006-10-20 10:26:35 -07:00
kmem.h [XFS] Add a greedy allocation interface, allocating within a min/max size 2006-09-28 11:03:27 +10:00
mrlock.h [XFS] lock validator: lockdep: small xfs init_rwsem() cleanup 2006-06-09 14:57:01 +10:00
mutex.h [XFS] mutex fallout - fix debug builds and remove no-longer-useful comment. 2006-01-16 16:21:34 +11:00
sema.h [XFS] standardize on one sema init macro 2006-09-28 11:05:46 +10:00
spin.h [XFS] Update license/copyright notices to match the prefered SGI 2005-11-02 14:58:39 +11:00
sv.h [XFS] Collapse sv_init and init_sv into just the one interface. 2006-09-28 11:05:52 +10:00
time.h [XFS] Update license/copyright notices to match the prefered SGI 2005-11-02 14:58:39 +11:00
xfs_aops.c [PATCH] Fix XFS after clear_page_dirty() removal 2006-12-21 10:01:08 -08:00
xfs_aops.h [PATCH] mark address_space_operations const 2006-06-28 14:59:04 -07:00
xfs_buf.c [XFS] Fix a synchronous buftarg flush deadlock when freezing. 2007-02-10 18:32:29 +11:00
xfs_buf.h [XFS] Remove several macros that are no longer used anywhere 2006-09-28 11:02:57 +10:00
xfs_cred.h [PATCH] move capable() to capability.h 2006-01-11 18:42:13 -08:00
xfs_dmapi_priv.h [XFS] Remove KERNEL_VERSION macros from xfs_dmapi.h 2006-11-11 18:05:06 +11:00
xfs_export.c [XFS] Remove version 1 directory code. Never functioned on Linux, just 2006-06-20 13:04:51 +10:00
xfs_export.h [XFS] We really suck at spulling. Thanks to Chris Pascoe for fixing all 2006-03-29 08:55:14 +10:00
xfs_file.c [PATCH] xfs: change uses of f_{dentry,vfsmnt} to use f_path 2006-12-08 08:28:43 -08:00
xfs_fs_subr.c [XFS] Resolve a namespace collision on vnode/vnodeops for FreeBSD porters. 2006-06-09 17:00:52 +10:00
xfs_fs_subr.h [XFS] Update license/copyright notices to match the prefered SGI 2005-11-02 14:58:39 +11:00
xfs_globals.c [XFS] Improve error handling for the zero-fsblock extent detection code. 2006-09-28 11:03:20 +10:00
xfs_globals.h [XFS] Update license/copyright notices to match the prefered SGI 2005-11-02 14:58:39 +11:00
xfs_ioctl.c [PATCH] xfs: change uses of f_{dentry,vfsmnt} to use f_path 2006-12-08 08:28:43 -08:00
xfs_ioctl32.c [PATCH] xfs: change uses of f_{dentry,vfsmnt} to use f_path 2006-12-08 08:28:43 -08:00
xfs_ioctl32.h [XFS] Fix compiler warning from xfs_file_compat_invis_ioctl prototype. 2006-03-20 13:25:48 +11:00
xfs_iops.c [XFS] Update XFS for i_blksize removal from generic inode structure 2006-09-28 11:01:22 +10:00
xfs_iops.h [PATCH] Make most file operations structs in fs/ const 2006-03-28 09:16:06 -08:00
xfs_linux.h [XFS] Fix a porting botch on the realtime subvol growfs code path. 2006-09-28 11:03:53 +10:00
xfs_lrw.c [PATCH] xfs: change uses of f_{dentry,vfsmnt} to use f_path 2006-12-08 08:28:43 -08:00
xfs_lrw.h [XFS] Resolve a namespace collision on vnode/vnodeops for FreeBSD porters. 2006-06-09 17:00:52 +10:00
xfs_stats.c [PATCH] for_each_possible_cpu: xfs 2006-06-23 07:42:45 -07:00
xfs_stats.h [XFS] Complete the pagebuf -> xfs_buf naming convention transition, 2006-01-11 15:39:08 +11:00
xfs_super.c [PATCH] Add include/linux/freezer.h and move definitions from sched.h 2006-12-07 08:39:27 -08:00
xfs_super.h [XFS] Resolve a namespace collision on vnode/vnodeops for FreeBSD porters. 2006-06-09 17:00:52 +10:00
xfs_sysctl.c [PATCH] for_each_possible_cpu: xfs 2006-06-23 07:42:45 -07:00
xfs_sysctl.h [XFS] Add degframentation exclusion support 2006-06-09 14:54:19 +10:00
xfs_version.h [XFS] Update license/copyright notices to match the prefered SGI 2005-11-02 14:58:39 +11:00
xfs_vfs.c [XFS] Remove version 1 directory code. Never functioned on Linux, just 2006-06-20 13:04:51 +10:00
xfs_vfs.h [XFS] remove accidentally reintroduced vfs unmount flag, unneeded in 2006-09-28 10:59:06 +10:00
xfs_vnode.c [PATCH] inode-diet: Eliminate i_blksize from the inode structure 2006-09-27 08:26:18 -07:00
xfs_vnode.h [XFS] remove bhv_lookup, _range version works aswell and has more useful 2006-09-28 10:58:52 +10:00