diff options
-rw-r--r-- | fs/gfs2/rgrp.c | 41 | ||||
-rw-r--r-- | 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 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 | ||
1114 | static u32 count_unlinked(struct gfs2_rgrpd *rgd) | 1137 | static 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 | ||
24 | struct kmem_cache *gfs2_glock_cachep __read_mostly; | 25 | struct 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" |