diff options
author | Steven Whitehouse <steve@chygwyn.com> | 2012-05-29 10:47:51 +0100 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2012-06-06 11:27:49 +0100 |
commit | 1b8ba31a88c5115687095ca2a01bfcaecb489b5a (patch) | |
tree | c32f35c93758abaeea64430d3ef824d9a2ef8fb4 /fs/gfs2/lops.c | |
parent | 23d0bb834e264f38335f19fe601564b8422431e7 (diff) | |
download | op-kernel-dev-1b8ba31a88c5115687095ca2a01bfcaecb489b5a.zip op-kernel-dev-1b8ba31a88c5115687095ca2a01bfcaecb489b5a.tar.gz |
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/gfs2/lops.c')
-rw-r--r-- | fs/gfs2/lops.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index 852c1be..8ff95a2 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) goto out; set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); - gfs2_meta_check(sdp, bd->bd_bh); - gfs2_pin(sdp, bd->bd_bh); mh = (struct gfs2_meta_header *)bd->bd_bh->b_data; + if (unlikely(mh->mh_magic != cpu_to_be32(GFS2_MAGIC))) { + printk(KERN_ERR + "Attempting to add uninitialised block to journal (inplace block=%lld)\n", + (unsigned long long)bd->bd_bh->b_blocknr); + BUG(); + } + gfs2_pin(sdp, bd->bd_bh); mh->__pad0 = cpu_to_be64(0); mh->mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid); sdp->sd_log_num_buf++; |