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: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
Joel Becker 2008-12-11 15:04:14 -08:00 committed by Mark Fasheh
parent c175a518b4
commit d030cc978e
1 changed files with 11 additions and 0 deletions

View File

@ -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,
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,
} }
} }
out:
mlog_exit(status); mlog_exit(status);
return status; return status;
} }