GFS2: Prevent BUG from occurring when normal Withdraws occur
authorBob Peterson <rpeterso@redhat.com>
Fri, 3 Mar 2017 17:37:14 +0000 (12:37 -0500)
committerBob Peterson <rpeterso@redhat.com>
Thu, 16 Mar 2017 12:18:35 +0000 (08:18 -0400)
When the GFS2 file system withdraws due to metadata corruption, it
often has outstanding transactions in the journal and delayed work
queued for its glocks. This patch adds some new checks for a
withdrawn file system before proceeding with operations that would
obviously cause a BUG() to be triggered. That allows GFS2 to be
safely unmounted rather than cause the system to go down.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/glock.c
fs/gfs2/super.c

index ec0848fcca02d8960ba671b9b0be5a56ed3fd7ed..694167b4e5121f8bd501c9b8f80450595cabc0de 100644 (file)
@@ -449,6 +449,8 @@ __acquires(&gl->gl_lockref.lock)
        unsigned int lck_flags = (unsigned int)(gh ? gh->gh_flags : 0);
        int ret;
 
+       if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
+               return;
        lck_flags &= (LM_FLAG_TRY | LM_FLAG_TRY_1CB | LM_FLAG_NOEXP |
                      LM_FLAG_PRIORITY);
        GLOCK_BUG_ON(gl, gl->gl_state == target);
index 361796a84fce4f444f563592aa05f4e25642aa61..2a9a830fb3d6690d8a7af949f6a8b299e0e496ea 100644 (file)
@@ -793,7 +793,8 @@ static void gfs2_dirty_inode(struct inode *inode, int flags)
 
        if (!(flags & (I_DIRTY_DATASYNC|I_DIRTY_SYNC)))
                return;
-
+       if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
+               return;
        if (!gfs2_glock_is_locked_by_me(ip->i_gl)) {
                ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
                if (ret) {