linux/fs/gfs2
Steven Whitehouse d8348de06f GFS2: Fix deadlock on journal flush
This patch fixes a deadlock when the journal is flushed and there
are dirty inodes other than the one which caused the journal flush.
Originally the journal flushing code was trying to obtain the
transaction glock while running the flush code for an inode glock.
We no longer require the transaction glock at this point in time
since we know that any attempt to get the transaction glock from
another node will result in a journal flush. So if we are flushing
the journal, we can be sure that the transaction lock is still
cached from when the transaction was started.

By inlining a version of gfs2_trans_begin() (minus the bit which
gets the transaction glock) we can avoid the deadlock problems
caused if there is a demote request queued up on the transaction
glock.

In addition I've also moved the umount rwsem so that it covers
the glock workqueue, since it all demotions are done by this
workqueue now. That fixes a bug on umount which I came across
while fixing the original problem.

Reported-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
2009-03-24 11:21:18 +00:00
..
acl.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
acl.h [GFS2] Remove gfs2_check_acl() 2006-11-30 10:37:32 -05:00
bmap.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
bmap.h GFS2: Streamline alloc calculations for writes 2009-01-05 07:39:17 +00:00
dir.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
dir.h GFS2: Fix bug in gfs2_lock_fs_check_clean() 2009-01-05 07:39:11 +00:00
eaops.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
eaops.h [GFS2] mark struct *_operations const 2007-10-10 08:55:03 +01:00
eattr.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
eattr.h [GFS2] gfs2 misc endianness annotations 2006-11-30 10:33:46 -05:00
gfs2.h [GFS2] Remove remote lock dropping code 2008-06-27 09:39:44 +01:00
glock.c GFS2: Fix deadlock on journal flush 2009-03-24 11:21:18 +00:00
glock.h GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
glops.c GFS2: Fix deadlock on journal flush 2009-03-24 11:21:18 +00:00
glops.h [GFS2] Make headers compile on their own 2006-09-05 10:39:21 -04:00
incore.h GFS2: Remove unused field from glock 2009-03-24 11:21:17 +00:00
inode.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
inode.h GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
Kconfig GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
lock_dlm.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
log.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
log.h [GFS2] trivial sparse lock annotations 2008-06-27 09:39:31 +01:00
lops.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
lops.h [GFS2] Only do lo_incore_commit once 2008-03-31 10:39:54 +01:00
main.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
Makefile GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
meta_io.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
meta_io.h [GFS2] Clean up the glock core 2008-06-27 09:39:22 +01:00
mount.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
ops_address.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
ops_address.h [GFS2] Remove function gfs2_get_block 2008-01-25 08:08:25 +00:00
ops_dentry.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
ops_export.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
ops_file.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
ops_fstype.c GFS2: Fix error path ref counting for root inode 2009-03-24 11:21:17 +00:00
ops_inode.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
ops_super.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
quota.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
quota.h GFS2: change gfs2_quota_scan into a shrinker 2009-03-24 11:21:12 +00:00
recovery.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
recovery.h GFS2: Move gfs2_recoverd into recovery.c 2009-01-05 07:39:07 +00:00
rgrp.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
rgrp.h [GFS2] Add extent allocation to block allocator 2008-03-31 10:40:47 +01:00
super.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
super.h GFS2: Fix remount argument parsing 2009-03-24 11:21:10 +00:00
sys.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
sys.h GFS2: Remove ancient, unused code 2009-01-05 07:39:13 +00:00
trans.c GFS2: Fix deadlock on journal flush 2009-03-24 11:21:18 +00:00
trans.h [GFS2] Update gfs2_trans_add_unrevoke to accept extents 2008-03-31 10:40:42 +01:00
util.c GFS2: Merge lock_dlm module into GFS2 2009-03-24 11:21:14 +00:00
util.h GFS2: Clean up & move gfs2_quotad 2009-01-05 07:39:05 +00:00