diff options
author | Steven Whitehouse <steve@chygwyn.com> | 2012-05-29 05:47:51 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2012-06-06 06:27:49 -0400 |
commit | 1b8ba31a88c5115687095ca2a01bfcaecb489b5a (patch) | |
tree | c32f35c93758abaeea64430d3ef824d9a2ef8fb4 /fs | |
parent | 23d0bb834e264f38335f19fe601564b8422431e7 (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.c | 9 | ||||
-rw-r--r-- | fs/gfs2/util.h | 18 |
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 | ||
82 | static inline int gfs2_meta_check_i(struct gfs2_sbd *sdp, | 82 | static 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) \ | ||
96 | gfs2_meta_check_i((sdp), (bh), __func__, __FILE__, __LINE__) | ||
97 | |||
98 | |||
99 | int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh, | 95 | int 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, |