From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Thu, 16 Aug 2018 16:16:58 +0100 Subject: [Cluster-devel] [GFS2 PATCH] gfs2: improve debug information when lvb mismatches are found In-Reply-To: <781307088.2795084.1534353235430.JavaMail.zimbra@redhat.com> References: <781307088.2795084.1534353235430.JavaMail.zimbra@redhat.com> Message-ID: List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, On 15/08/18 18:13, Bob Peterson wrote: > Hi, > > Before this patch, gfs2_rgrp_bh_get would check for lvb mismatches, > but it wouldn't tell you what was actually wrong. This patch adds > more information to help us debug it. It also makes rgrp consistency > checks dump any bad rgrps, and the rgrp dump code dump any lvbs > as well as the rgrp itself. Yes, that is a good plan. Acked-by: Steven Whitehouse Steve. > Signed-off-by: Bob Peterson > --- > fs/gfs2/rgrp.c | 41 ++++++++++++++++++++++++++++++++++++----- > fs/gfs2/util.c | 3 +++ > 2 files changed, 39 insertions(+), 5 deletions(-) > > diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c > index 6eec634eae2d..4bb846af04e7 100644 > --- a/fs/gfs2/rgrp.c > +++ b/fs/gfs2/rgrp.c > @@ -1103,12 +1103,35 @@ static int gfs2_rgrp_lvb_valid(struct gfs2_rgrpd *rgd) > { > struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; > struct gfs2_rgrp *str = (struct gfs2_rgrp *)rgd->rd_bits[0].bi_bh->b_data; > + int valid = 1; > > - if (rgl->rl_flags != str->rg_flags || rgl->rl_free != str->rg_free || > - rgl->rl_dinodes != str->rg_dinodes || > - rgl->rl_igeneration != str->rg_igeneration) > - return 0; > - return 1; > + if (rgl->rl_flags != str->rg_flags) { > + printk(KERN_WARNING "GFS2: rgd: %llu lvb flag mismatch %u/%u", > + (unsigned long long)rgd->rd_addr, > + be32_to_cpu(rgl->rl_flags), be32_to_cpu(str->rg_flags)); > + valid = 0; > + } > + if (rgl->rl_free != str->rg_free) { > + printk(KERN_WARNING "GFS2: rgd: %llu lvb free mismatch %u/%u", > + (unsigned long long)rgd->rd_addr, > + be32_to_cpu(rgl->rl_free), be32_to_cpu(str->rg_free)); > + valid = 0; > + } > + if (rgl->rl_dinodes != str->rg_dinodes) { > + printk(KERN_WARNING "GFS2: rgd: %llu lvb dinode mismatch %u/%u", > + (unsigned long long)rgd->rd_addr, > + be32_to_cpu(rgl->rl_dinodes), > + be32_to_cpu(str->rg_dinodes)); > + valid = 0; > + } > + if (rgl->rl_igeneration != str->rg_igeneration) { > + printk(KERN_WARNING "GFS2: rgd: %llu lvb igen mismatch " > + "%llu/%llu", (unsigned long long)rgd->rd_addr, > + (unsigned long long)be64_to_cpu(rgl->rl_igeneration), > + (unsigned long long)be64_to_cpu(str->rg_igeneration)); > + valid = 0; > + } > + return valid; > } > > static u32 count_unlinked(struct gfs2_rgrpd *rgd) > @@ -2243,6 +2266,14 @@ void gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl) > (unsigned long long)rgd->rd_addr, rgd->rd_flags, > rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes, > rgd->rd_reserved, rgd->rd_extfail_pt); > + if (rgd->rd_sbd->sd_args.ar_rgrplvb) { > + struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; > + > + gfs2_print_dbg(seq, " L: f:%02x b:%u i:%u\n", > + be32_to_cpu(rgl->rl_flags), > + be32_to_cpu(rgl->rl_free), > + be32_to_cpu(rgl->rl_dinodes)); > + } > spin_lock(&rgd->rd_rsspin); > for (n = rb_first(&rgd->rd_rstree); n; n = rb_next(&trs->rs_node)) { > trs = rb_entry(n, struct gfs2_blkreserv, rs_node); > diff --git a/fs/gfs2/util.c b/fs/gfs2/util.c > index 59c811de0dc7..b072b10fb635 100644 > --- a/fs/gfs2/util.c > +++ b/fs/gfs2/util.c > @@ -19,6 +19,7 @@ > #include "gfs2.h" > #include "incore.h" > #include "glock.h" > +#include "rgrp.h" > #include "util.h" > > struct kmem_cache *gfs2_glock_cachep __read_mostly; > @@ -181,6 +182,8 @@ int gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd, int cluster_wide, > { > struct gfs2_sbd *sdp = rgd->rd_sbd; > int rv; > + > + gfs2_rgrp_dump(NULL, rgd->rd_gl); > rv = gfs2_lm_withdraw(sdp, > "fatal: filesystem consistency error\n" > " RG = %llu\n" >