linux/fs/gfs2
Bob Peterson 222cb538f5 GFS2: Flush work queue before clearing glock hash tables
There was a timing window when a GFS2 file system was unmounted
that caused GFS2 to call BUG() and panic the kernel. The call
to BUG() is meant to ensure that the glock reference count,
gl_ref, never gets down to zero and bounce back up again. What was
happening during umount is that function gfs2_put_super was dequeing
its glocks for well-known files. In particular, we saw it on the
journal glock, sd_jinode_gh. The dequeue caused delayed work to be
queued for the glock state machine, to transition the lock to an
"unlocked" state. While the work was still queued, gfs2_put_super
called gfs2_gl_hash_clear to clear out the glock hash tables.
If the timing was just so, the glock work function would drop the
reference count at the time when it was being checked for zero,
and that caused BUG() to be called. This patch calls
flush_workqueue before clearing the glock hash tables, thereby
ensuring that the delayed work is executed before the hash tables
are cleared, and therefore the reference count never goes to zero
until the glock is cleared.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
2013-04-26 10:09:04 +01:00
..
acl.c gfs2: Use uid_eq and gid_eq where appropriate 2013-02-13 06:15:10 -08:00
acl.h fs: take the ACL checks to common code 2011-07-25 14:30:23 -04:00
aops.c GFS2: replace gfs2_ail structure with gfs2_trans 2013-04-08 08:46:22 +01:00
bmap.c GFS2: Remove vestigial parameter ip from function rs_deltree 2013-04-08 08:41:04 +01:00
bmap.h GFS2: New truncate sequence 2010-09-20 11:18:16 +01:00
dentry.c stop passing nameidata * to ->d_revalidate() 2012-07-14 16:34:14 +04:00
dir.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace 2013-02-25 16:00:49 -08:00
dir.h GFS2: Add readahead to sequential directory traversal 2011-11-08 09:52:12 +00:00
export.c fs: encode_fh: return FILEID_INVALID if invalid fid_type 2013-02-26 02:46:10 -05:00
file.c GFS2: Fix unlock of fcntl locks during withdrawn state 2013-04-04 09:53:46 +01:00
gfs2.h [GFS2] Remove remote lock dropping code 2008-06-27 09:39:44 +01:00
glock.c GFS2: Flush work queue before clearing glock hash tables 2013-04-26 10:09:04 +01:00
glock.h GFS2: Remove gfs2_refresh_inode from inode creation path 2013-04-08 08:40:17 +01:00
glops.c GFS2: Add origin indicator to glock callbacks 2013-04-10 10:26:55 +01:00
glops.h GFS2: Fix AIL flush issue during fsync 2011-10-21 12:39:41 +01:00
incore.h GFS2: Add origin indicator to glock callbacks 2013-04-10 10:26:55 +01:00
inode.c GFS2: Use gfs2_dinode_out() in the inode create path 2013-04-08 08:40:37 +01:00
inode.h GFS2: Remove unused argument from gfs2_internal_read 2012-04-24 16:44:37 +01:00
Kconfig GFS2: use depends instead of select in kconfig 2012-03-26 09:18:02 +01:00
lock_dlm.c GFS2: use memchr_inv 2013-04-04 09:52:50 +01:00
log.c GFS2: replace gfs2_ail structure with gfs2_trans 2013-04-08 08:46:22 +01:00
log.h GFS2: Use ->writepages for ordered writes 2013-01-29 10:29:17 +00:00
lops.c GFS2: replace gfs2_ail structure with gfs2_trans 2013-04-08 08:46:22 +01:00
lops.h GFS2: replace gfs2_ail structure with gfs2_trans 2013-04-08 08:46:22 +01:00
main.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
Makefile GFS2: Rename ops_inode.c to inode.c 2011-05-10 13:12:49 +01:00
meta_io.c GFS2: replace gfs2_ail structure with gfs2_trans 2013-04-08 08:46:22 +01:00
meta_io.h GFS2: Merge gfs2_attach_bufdata() into trans.c 2013-01-29 10:28:44 +00:00
ops_fstype.c fs: Limit sys_mount to only request filesystem modules. 2013-03-03 19:36:31 -08:00
quota.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace 2013-02-25 16:00:49 -08:00
quota.h gfs2: Use kuid_t and kgid_t types where appropriate. 2013-02-13 06:15:09 -08:00
recovery.c GFS2: fail mount if journal recovery fails 2012-01-11 09:24:48 +00:00
recovery.h gfs2: use workqueue instead of slow-work 2010-07-23 13:14:25 +02:00
rgrp.c GFS2: Remove vestigial parameter ip from function rs_deltree 2013-04-08 08:41:04 +01:00
rgrp.h GFS2: Remove vestigial parameter ip from function rs_deltree 2013-04-08 08:41:04 +01:00
super.c GFS2: Remove vestigial parameter ip from function rs_deltree 2013-04-08 08:41:04 +01:00
super.h GFS2: Clean up freeze code 2013-01-29 10:29:05 +00:00
sys.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2013-02-26 20:16:07 -08:00
sys.h GFS2: dlm based recovery coordination 2012-01-11 09:23:05 +00:00
trace_gfs2.h GFS2: Add origin indicator to glock demote tracing 2013-04-10 10:32:05 +01:00
trans.c GFS2: replace gfs2_ail structure with gfs2_trans 2013-04-08 08:46:22 +01:00
trans.h GFS2: Split gfs2_trans_add_bh() into two 2013-01-29 10:28:04 +00:00
util.c GFS2: Reinstate withdraw ack system 2013-02-13 12:21:40 +00:00
util.h GFS2: Fix error handling when reading an invalid block from the journal 2012-06-06 11:27:49 +01:00
xattr.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace 2013-02-25 16:00:49 -08:00
xattr.h sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00