From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Wed, 11 Jun 2008 13:17:06 +0100 Subject: [Cluster-devel] [GFS2 Patch] bz 450156 - kernel panic mounting volume In-Reply-To: <1213031303.21321.49.camel@technetium.msp.redhat.com> References: <1213031303.21321.49.camel@technetium.msp.redhat.com> Message-ID: <1213186626.4011.4.camel@quoit> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Now in the GFS2 -nmw git tree. Thanks, Steve. On Mon, 2008-06-09 at 12:08 -0500, Bob Peterson wrote: > Hi, > > This patch fixes bugzilla bug 450156. > > This started with a not-too-improbable mount failure because the > locking protocol was never set back to its proper "lock_dlm" after the > system was rebooted in the middle of a gfs2_fsck. That left a > (purposely) invalid locking protocol in the superblock, which caused an > error when the file system was mounted the next time. > > When there's an error mounting, vfs calls DQUOT_OFF, which calls > vfs_quota_off which calls gfs2_sync_fs. Next, gfs2_sync_fs calls > gfs2_log_flush passing s_fs_info. But due to the error, s_fs_info > had been previously set to NULL, and so we have the kernel oops. > > My solution in this patch is to test for the NULL value before passing > it. I tested this patch and it fixes the problem. > > I believe the problem was caused due to changes in what the DQUOTA_OFF > macro does in newer kernels. I could not recreate the > problem on a RHEL kernel and don't believe this affects RHEL. > > Regards, > > Bob Peterson > > Signed-off-by: Bob Peterson > -- > fs/gfs2/ops_super.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c > index 0b7cc92..6690792 100644 > --- a/fs/gfs2/ops_super.c > +++ b/fs/gfs2/ops_super.c > @@ -155,7 +155,7 @@ static void gfs2_write_super(struct super_block *sb) > static int gfs2_sync_fs(struct super_block *sb, int wait) > { > sb->s_dirt = 0; > - if (wait) > + if (wait && sb->s_fs_info) > gfs2_log_flush(sb->s_fs_info, NULL); > return 0; > } > >