gfs2: Get rid of flush_delayed_work in gfs2_evict_inode
authorAndreas Gruenbacher <agruenba@redhat.com>
Fri, 30 Jun 2017 12:47:15 +0000 (07:47 -0500)
committerBob Peterson <rpeterso@redhat.com>
Wed, 5 Jul 2017 12:20:24 +0000 (07:20 -0500)
commit4fd1a5795214bc6405f14691c1344ae8c3f17215
treeac0d1a48b243c6e27b40460503bc99290fa3c564
parent722f6f62a563108dc0f311bd86120b8fbfa0c6df
gfs2: Get rid of flush_delayed_work in gfs2_evict_inode

So far, gfs2_evict_inode clears gl->gl_object and then flushes the glock
work queue to make sure that inode glops which dereference gl->gl_object
have finished running before the inode is destroyed.  However, flushing
the work queue may do more work than needed, and in particular, it may
call into DLM, which we want to avoid here.  Use a bit lock
(GIF_GLOP_PENDING) to synchronize between the inode glops and
gfs2_evict_inode instead to get rid of the flushing.

In addition, flush the work queues of existing glocks before reusing
them for new inodes to get those glocks into a known state: the glock
state engine currently doesn't handle glock re-appropriation correctly.
(We may be able to fix the glock state engine instead later.)

Based on a patch by Steven Whitehouse <swhiteho@redhat.com>.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/glock.h
fs/gfs2/glops.c
fs/gfs2/incore.h
fs/gfs2/inode.c
fs/gfs2/super.c