From c01bfcc684be98449d2e46817d6757c28ea70796 Mon Sep 17 00:00:00 2001 From: Bob Peterson Date: Fri, 3 Mar 2017 12:37:14 -0500 Subject: [PATCH] GFS2: Prevent BUG from occurring when normal Withdraws occur 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 --- fs/gfs2/glock.c | 2 ++ fs/gfs2/super.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index ec0848fcca02d..694167b4e5121 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -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); diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 361796a84fce4..2a9a830fb3d66 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -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) { -- 2.39.5