aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2018-08-15 13:09:49 -0400
committerBob Peterson <rpeterso@redhat.com>2018-08-28 13:51:08 -0400
commit72244b6bc752b5c496f09de9a13c18adc314a53c (patch)
tree84c100780cc7e2a4d7023b3b0c701da93054d060
parent050cdc6c9501abcd64720b8cc3e7941efee9547d (diff)
gfs2: improve debug information when lvb mismatches are found
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. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Acked-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/rgrp.c41
-rw-r--r--fs/gfs2/util.c3
2 files changed, 39 insertions, 5 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 1ad3256b9cbc..44a4cbc043dd 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)
1103{ 1103{
1104 struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; 1104 struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl;
1105 struct gfs2_rgrp *str = (struct gfs2_rgrp *)rgd->rd_bits[0].bi_bh->b_data; 1105 struct gfs2_rgrp *str = (struct gfs2_rgrp *)rgd->rd_bits[0].bi_bh->b_data;
1106 int valid = 1;
1106 1107
1107 if (rgl->rl_flags != str->rg_flags || rgl->rl_free != str->rg_free || 1108 if (rgl->rl_flags != str->rg_flags) {
1108 rgl->rl_dinodes != str->rg_dinodes || 1109 printk(KERN_WARNING "GFS2: rgd: %llu lvb flag mismatch %u/%u",
1109 rgl->rl_igeneration != str->rg_igeneration) 1110 (unsigned long long)rgd->rd_addr,
1110 return 0; 1111 be32_to_cpu(rgl->rl_flags), be32_to_cpu(str->rg_flags));
1111 return 1; 1112 valid = 0;
1113 }
1114 if (rgl->rl_free != str->rg_free) {
1115 printk(KERN_WARNING "GFS2: rgd: %llu lvb free mismatch %u/%u",
1116 (unsigned long long)rgd->rd_addr,
1117 be32_to_cpu(rgl->rl_free), be32_to_cpu(str->rg_free));
1118 valid = 0;
1119 }
1120 if (rgl->rl_dinodes != str->rg_dinodes) {
1121 printk(KERN_WARNING "GFS2: rgd: %llu lvb dinode mismatch %u/%u",
1122 (unsigned long long)rgd->rd_addr,
1123 be32_to_cpu(rgl->rl_dinodes),
1124 be32_to_cpu(str->rg_dinodes));
1125 valid = 0;
1126 }
1127 if (rgl->rl_igeneration != str->rg_igeneration) {
1128 printk(KERN_WARNING "GFS2: rgd: %llu lvb igen mismatch "
1129 "%llu/%llu", (unsigned long long)rgd->rd_addr,
1130 (unsigned long long)be64_to_cpu(rgl->rl_igeneration),
1131 (unsigned long long)be64_to_cpu(str->rg_igeneration));
1132 valid = 0;
1133 }
1134 return valid;
1112} 1135}
1113 1136
1114static u32 count_unlinked(struct gfs2_rgrpd *rgd) 1137static u32 count_unlinked(struct gfs2_rgrpd *rgd)
@@ -2244,6 +2267,14 @@ void gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl)
2244 (unsigned long long)rgd->rd_addr, rgd->rd_flags, 2267 (unsigned long long)rgd->rd_addr, rgd->rd_flags,
2245 rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes, 2268 rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes,
2246 rgd->rd_reserved, rgd->rd_extfail_pt); 2269 rgd->rd_reserved, rgd->rd_extfail_pt);
2270 if (rgd->rd_sbd->sd_args.ar_rgrplvb) {
2271 struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl;
2272
2273 gfs2_print_dbg(seq, " L: f:%02x b:%u i:%u\n",
2274 be32_to_cpu(rgl->rl_flags),
2275 be32_to_cpu(rgl->rl_free),
2276 be32_to_cpu(rgl->rl_dinodes));
2277 }
2247 spin_lock(&rgd->rd_rsspin); 2278 spin_lock(&rgd->rd_rsspin);
2248 for (n = rb_first(&rgd->rd_rstree); n; n = rb_next(&trs->rs_node)) { 2279 for (n = rb_first(&rgd->rd_rstree); n; n = rb_next(&trs->rs_node)) {
2249 trs = rb_entry(n, struct gfs2_blkreserv, rs_node); 2280 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 @@
19#include "gfs2.h" 19#include "gfs2.h"
20#include "incore.h" 20#include "incore.h"
21#include "glock.h" 21#include "glock.h"
22#include "rgrp.h"
22#include "util.h" 23#include "util.h"
23 24
24struct kmem_cache *gfs2_glock_cachep __read_mostly; 25struct kmem_cache *gfs2_glock_cachep __read_mostly;
@@ -181,6 +182,8 @@ int gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd, int cluster_wide,
181{ 182{
182 struct gfs2_sbd *sdp = rgd->rd_sbd; 183 struct gfs2_sbd *sdp = rgd->rd_sbd;
183 int rv; 184 int rv;
185
186 gfs2_rgrp_dump(NULL, rgd->rd_gl);
184 rv = gfs2_lm_withdraw(sdp, 187 rv = gfs2_lm_withdraw(sdp,
185 "fatal: filesystem consistency error\n" 188 "fatal: filesystem consistency error\n"
186 " RG = %llu\n" 189 " RG = %llu\n"