aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSteven Whitehouse <steve@chygwyn.com>2012-05-29 05:47:51 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2012-06-06 06:27:49 -0400
commit1b8ba31a88c5115687095ca2a01bfcaecb489b5a (patch)
treec32f35c93758abaeea64430d3ef824d9a2ef8fb4 /fs
parent23d0bb834e264f38335f19fe601564b8422431e7 (diff)
GFS2: Fix error handling when reading an invalid block from the journal
When we read an invalid block from the journal, we should not call withdraw, but simply print a message and return an error. It is up to the caller to then handle that error. In the case of mount that means a failed mount, rather than a withdraw (requiring a reboot). In the case of recovering another nodes journal then we return an error via the uevent. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/gfs2/lops.c9
-rw-r--r--fs/gfs2/util.h18
2 files changed, 14 insertions, 13 deletions
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index 852c1be1dd3b..8ff95a2d54ee 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -401,9 +401,14 @@ static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
401 goto out; 401 goto out;
402 set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 402 set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
403 set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); 403 set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);
404 gfs2_meta_check(sdp, bd->bd_bh);
405 gfs2_pin(sdp, bd->bd_bh);
406 mh = (struct gfs2_meta_header *)bd->bd_bh->b_data; 404 mh = (struct gfs2_meta_header *)bd->bd_bh->b_data;
405 if (unlikely(mh->mh_magic != cpu_to_be32(GFS2_MAGIC))) {
406 printk(KERN_ERR
407 "Attempting to add uninitialised block to journal (inplace block=%lld)\n",
408 (unsigned long long)bd->bd_bh->b_blocknr);
409 BUG();
410 }
411 gfs2_pin(sdp, bd->bd_bh);
407 mh->__pad0 = cpu_to_be64(0); 412 mh->__pad0 = cpu_to_be64(0);
408 mh->mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid); 413 mh->mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid);
409 sdp->sd_log_num_buf++; 414 sdp->sd_log_num_buf++;
diff --git a/fs/gfs2/util.h b/fs/gfs2/util.h
index 3586b0dd6aa7..80535739ac7b 100644
--- a/fs/gfs2/util.h
+++ b/fs/gfs2/util.h
@@ -79,23 +79,19 @@ int gfs2_meta_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
79 const char *type, const char *function, 79 const char *type, const char *function,
80 char *file, unsigned int line); 80 char *file, unsigned int line);
81 81
82static inline int gfs2_meta_check_i(struct gfs2_sbd *sdp, 82static inline int gfs2_meta_check(struct gfs2_sbd *sdp,
83 struct buffer_head *bh, 83 struct buffer_head *bh)
84 const char *function,
85 char *file, unsigned int line)
86{ 84{
87 struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data; 85 struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
88 u32 magic = be32_to_cpu(mh->mh_magic); 86 u32 magic = be32_to_cpu(mh->mh_magic);
89 if (unlikely(magic != GFS2_MAGIC)) 87 if (unlikely(magic != GFS2_MAGIC)) {
90 return gfs2_meta_check_ii(sdp, bh, "magic number", function, 88 printk(KERN_ERR "GFS2: Magic number missing at %llu\n",
91 file, line); 89 (unsigned long long)bh->b_blocknr);
90 return -EIO;
91 }
92 return 0; 92 return 0;
93} 93}
94 94
95#define gfs2_meta_check(sdp, bh) \
96gfs2_meta_check_i((sdp), (bh), __func__, __FILE__, __LINE__)
97
98
99int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh, 95int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
100 u16 type, u16 t, 96 u16 type, u16 t,
101 const char *function, 97 const char *function,