Commit d030cc97 authored by Joel Becker's avatar Joel Becker Committed by Mark Fasheh

ocfs2: Validate superblock with checksum and ecc.

The superblock is read via a raw call.  Validate it after we find it
from its signature.
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent c175a518
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "ocfs1_fs_compat.h" #include "ocfs1_fs_compat.h"
#include "alloc.h" #include "alloc.h"
#include "blockcheck.h"
#include "dlmglue.h" #include "dlmglue.h"
#include "export.h" #include "export.h"
#include "extent_map.h" #include "extent_map.h"
...@@ -1989,6 +1990,15 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di, ...@@ -1989,6 +1990,15 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
if (memcmp(di->i_signature, OCFS2_SUPER_BLOCK_SIGNATURE, if (memcmp(di->i_signature, OCFS2_SUPER_BLOCK_SIGNATURE,
strlen(OCFS2_SUPER_BLOCK_SIGNATURE)) == 0) { strlen(OCFS2_SUPER_BLOCK_SIGNATURE)) == 0) {
/* We have to do a raw check of the feature here */
if (le32_to_cpu(di->id2.i_super.s_feature_incompat) &
OCFS2_FEATURE_INCOMPAT_META_ECC) {
status = ocfs2_block_check_validate(bh->b_data,
bh->b_size,
&di->i_check);
if (status)
goto out;
}
status = -EINVAL; status = -EINVAL;
if ((1 << le32_to_cpu(di->id2.i_super.s_blocksize_bits)) != blksz) { if ((1 << le32_to_cpu(di->id2.i_super.s_blocksize_bits)) != blksz) {
mlog(ML_ERROR, "found superblock with incorrect block " mlog(ML_ERROR, "found superblock with incorrect block "
...@@ -2030,6 +2040,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di, ...@@ -2030,6 +2040,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
} }
} }
out:
mlog_exit(status); mlog_exit(status);
return status; return status;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment