linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@us.ibm.com>
To: Andreas Dilger <adilger.kernel@dilger.ca>,
	Theodore Tso <tytso@mit.edu>,
	"Darrick J. Wong" <djwong@us.ibm.com>
Cc: Sunil Mushran <sunil.mushran@oracle.com>,
	Amir Goldstein <amir73il@gmail.com>,
	Andi Kleen <andi@firstfloor.org>, Mingming Cao <cmm@us.ibm.com>,
	Joel Becker <jlbec@evilplan.org>,
	linux-ext4@vger.kernel.org, Coly Li <colyli@gmail.com>
Subject: [PATCH 30/51] libext2fs: Calculate and verify superblock checksums
Date: Tue, 13 Dec 2011 17:16:37 -0800	[thread overview]
Message-ID: <20111214011637.20947.19402.stgit@elm3c44.beaverton.ibm.com> (raw)
In-Reply-To: <20111214011316.20947.13706.stgit@elm3c44.beaverton.ibm.com>

Calculate and verify the superblock checksums.  Each copy of the superblock
records the number of the group it's in and the FS UUID, so we can simply
checksum the whole block.

Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
---
 lib/ext2fs/closefs.c      |   19 ++++++++++++-------
 lib/ext2fs/csum.c         |   35 +++++++++++++++++++++++++++++++++++
 lib/ext2fs/ext2_err.et.in |    3 +++
 lib/ext2fs/ext2fs.h       |    4 ++++
 lib/ext2fs/openfs.c       |    6 ++++++
 5 files changed, 60 insertions(+), 7 deletions(-)


diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c
index 1867be3..a0e28ba 100644
--- a/lib/ext2fs/closefs.c
+++ b/lib/ext2fs/closefs.c
@@ -246,15 +246,19 @@ static errcode_t write_backup_super(ext2_filsys fs, dgrp_t group,
 				    blk_t group_block,
 				    struct ext2_super_block *super_shadow)
 {
+	errcode_t retval;
 	dgrp_t	sgrp = group;
 
 	if (sgrp > ((1 << 16) - 1))
 		sgrp = (1 << 16) - 1;
+
+	super_shadow->s_block_group_nr = sgrp;
 #ifdef WORDS_BIGENDIAN
-	super_shadow->s_block_group_nr = ext2fs_swab16(sgrp);
-#else
-	fs->super->s_block_group_nr = sgrp;
+	ext2fs_swap_super(super_shadow);
 #endif
+	retval = ext2fs_superblock_csum_set(fs, super_shadow);
+	if (retval)
+		return retval;
 
 	return io_channel_write_blk64(fs->io, group_block, -SUPERBLOCK_SIZE,
 				    super_shadow);
@@ -314,6 +318,7 @@ errcode_t ext2fs_flush2(ext2_filsys fs, int flags)
 				  &group_shadow);
 	if (retval)
 		goto errout;
+	memcpy(super_shadow, fs->super, sizeof(struct ext2_super_block));
 	memcpy(group_shadow, fs->group_desc, (size_t) fs->blocksize *
 	       fs->desc_blocks);
 
@@ -334,10 +339,6 @@ errcode_t ext2fs_flush2(ext2_filsys fs, int flags)
 	 */
 	fs->super->s_state &= ~EXT2_VALID_FS;
 	fs->super->s_feature_incompat &= ~EXT3_FEATURE_INCOMPAT_RECOVER;
-#ifdef WORDS_BIGENDIAN
-	*super_shadow = *fs->super;
-	ext2fs_swap_super(super_shadow);
-#endif
 
 	/*
 	 * If this is an external journal device, don't write out the
@@ -412,6 +413,10 @@ write_primary_superblock_only:
 	ext2fs_swap_super(super_shadow);
 #endif
 
+	retval = ext2fs_superblock_csum_set(fs, super_shadow);
+	if (retval)
+		return retval;
+
 	if (!(flags & EXT2_FLAG_FLUSH_NO_SYNC))
 		retval = io_channel_flush(fs->io);
 	retval = write_primary_superblock(fs, super_shadow);
diff --git a/lib/ext2fs/csum.c b/lib/ext2fs/csum.c
index 26f453b..a171f21 100644
--- a/lib/ext2fs/csum.c
+++ b/lib/ext2fs/csum.c
@@ -30,6 +30,41 @@
 #define STATIC static
 #endif
 
+static __u32 ext2fs_superblock_csum(ext2_filsys fs, struct ext2_super_block *sb)
+{
+	int offset = offsetof(struct ext2_super_block, s_checksum);
+
+	return ext2fs_crc32c_le(~0, (unsigned char *)sb, offset);
+}
+
+int ext2fs_superblock_csum_verify(ext2_filsys fs, struct ext2_super_block *sb)
+{
+	__u32 calculated;
+
+	if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
+					EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
+		return 1;
+
+	calculated = ext2fs_superblock_csum(fs, sb);
+
+	return ext2fs_le32_to_cpu(sb->s_checksum) == calculated;
+}
+
+errcode_t ext2fs_superblock_csum_set(ext2_filsys fs,
+				     struct ext2_super_block *sb)
+{
+	__u32 crc;
+
+	if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
+		EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
+		return 0;
+
+	crc = ext2fs_superblock_csum(fs, sb);
+	sb->s_checksum = ext2fs_cpu_to_le32(crc);
+
+	return 0;
+}
+
 static errcode_t ext2fs_ext_attr_block_csum(ext2_filsys fs, ext2_ino_t inum,
 					    blk64_t block,
 					    struct ext2_ext_attr_header *hdr,
diff --git a/lib/ext2fs/ext2_err.et.in b/lib/ext2fs/ext2_err.et.in
index 177a97f..0fab4e0 100644
--- a/lib/ext2fs/ext2_err.et.in
+++ b/lib/ext2fs/ext2_err.et.in
@@ -461,4 +461,7 @@ ec	EXT2_ET_DIR_CSUM_INVALID,
 ec	EXT2_ET_EXT_ATTR_CSUM_INVALID,
 	"Extended attribute block checksum does not match block"
 
+ec	EXT2_ET_SB_CSUM_INVALID,
+	"Superblock checksum does not match superblock"
+
 	end
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index 9d95c17..972bcd6 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -940,6 +940,10 @@ extern __u32 ext2fs_crc32c_be(__u32 crc, unsigned char const *p, size_t len);
 extern __u32 ext2fs_crc32c_le(__u32 crc, unsigned char const *p, size_t len);
 
 /* csum.c */
+extern errcode_t ext2fs_superblock_csum_set(ext2_filsys fs,
+					    struct ext2_super_block *sb);
+extern int ext2fs_superblock_csum_verify(ext2_filsys fs,
+					 struct ext2_super_block *sb);
 extern errcode_t ext2fs_ext_attr_block_csum_set(ext2_filsys fs,
 					ext2_ino_t inum, blk64_t block,
 					struct ext2_ext_attr_header *hdr);
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c
index 40a52c5..3abdaf0 100644
--- a/lib/ext2fs/openfs.c
+++ b/lib/ext2fs/openfs.c
@@ -193,6 +193,12 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
 	if (fs->orig_super)
 		memcpy(fs->orig_super, fs->super, SUPERBLOCK_SIZE);
 
+	if (!(fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
+	    !ext2fs_superblock_csum_verify(fs, fs->super)) {
+		retval = EXT2_ET_SB_CSUM_INVALID;
+		goto cleanup;
+	}
+
 #ifdef WORDS_BIGENDIAN
 	fs->flags |= EXT2_FLAG_SWAP_BYTES;
 	ext2fs_swap_super(fs->super);


  parent reply	other threads:[~2011-12-14  1:16 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-14  1:13 [PATCH v2.2 00/51] e2fsprogs: Add metadata checksumming Darrick J. Wong
2011-12-14  1:13 ` [PATCH 01/51] libext2fs: Read and write full size inodes Darrick J. Wong
     [not found]   ` <15FBE485-FC42-46A4-A2BE-9931A3B933A5@dilger.ca>
2011-12-19 17:46     ` Darrick J. Wong
2011-12-14  1:13 ` [PATCH 02/51] libext2fs: Change ext4 on-disk layout to support metadata checksumming Darrick J. Wong
     [not found]   ` <BBB7550D-77E9-441D-8ECF-C5A5A3B839C8@dilger.ca>
2011-12-19 20:13     ` Darrick J. Wong
2011-12-14  1:13 ` [PATCH 03/51] debugfs: Optionally ignore bad checksums Darrick J. Wong
2011-12-14  1:13 ` [PATCH 04/51] libext2fs: Add inode checksum support Darrick J. Wong
     [not found]   ` <4CD3617E-A647-4CAF-9C35-DF24656CB440@dilger.ca>
2011-12-19 20:05     ` Darrick J. Wong
2011-12-14  1:13 ` [PATCH 05/51] debugfs: Dump inode checksum when appropriate Darrick J. Wong
2011-12-14  1:13 ` [PATCH 06/51] tune2fs: Add inode checksum support Darrick J. Wong
2011-12-14  1:14 ` [PATCH 07/51] e2fsck: Verify and correct inode checksums Darrick J. Wong
     [not found]   ` <701CAD1A-51A8-4F0F-8323-4B2091BF8F78@dilger.ca>
2011-12-19 20:12     ` Darrick J. Wong
2011-12-14  1:14 ` [PATCH 08/51] mke2fs: Allow metadata checksums to be turned on at mkfs time Darrick J. Wong
     [not found]   ` <76441870-91E6-402F-B1F7-F67C97D0B02B@dilger.ca>
2011-12-19 16:59     ` Darrick J. Wong
2011-12-14  1:14 ` [PATCH 09/51] libext2fs: Create the inode bitmap checksum Darrick J. Wong
     [not found]   ` <8D63B0B0-ED5C-426E-82FE-5122A84DFFEC@gmail.com>
2011-12-19 20:03     ` Darrick J. Wong
2011-12-14  1:14 ` [PATCH 10/51] tune2fs: Rewrite inode bitmap checksums Darrick J. Wong
2011-12-14  1:14 ` [PATCH 11/51] dumpe2fs: Display inode bitmap checksum Darrick J. Wong
2011-12-18 18:09   ` Andreas Dilger
2011-12-14  1:14 ` [PATCH 12/51] e2fsck: Verify " Darrick J. Wong
2011-12-14  1:14 ` [PATCH 13/51] libext2fs: Create the block " Darrick J. Wong
2011-12-14  1:14 ` [PATCH 14/51] dumpe2fs: Display " Darrick J. Wong
     [not found]   ` <32C86905-38C6-4897-8A98-26431DB73118@dilger.ca>
2011-12-19 19:50     ` Darrick J. Wong
2011-12-14  1:14 ` [PATCH 15/51] e2fsck: Verify " Darrick J. Wong
2011-12-14  1:15 ` [PATCH 16/51] e2fsck: Don't verify bitmap checksums Darrick J. Wong
2011-12-14  1:15 ` [PATCH 17/51] tune2fs: Rewrite block " Darrick J. Wong
2011-12-14  1:15 ` [PATCH 18/51] libext2fs: Verify and calculate extent tree block checksums Darrick J. Wong
2011-12-14  1:15 ` [PATCH 19/51] tune2fs: Enable extent tree checksums Darrick J. Wong
2011-12-14  1:15 ` [PATCH 20/51] e2fsck: Verify extent tree blocks and clear the bad ones Darrick J. Wong
2011-12-19  6:50   ` Andreas Dilger
2011-12-19 19:47     ` Darrick J. Wong
2011-12-14  1:15 ` [PATCH 21/51] debugfs: Print htree internal node checksums Darrick J. Wong
2011-12-14  1:15 ` [PATCH 22/51] libext2fs: Add dx_root/dx_node checksum calculation and verification helpers Darrick J. Wong
2011-12-14  1:15 ` [PATCH 23/51] e2fsck: Verify htree root/node checksums Darrick J. Wong
2011-12-19  6:57   ` Andreas Dilger
2011-12-19 19:46     ` Darrick J. Wong
2011-12-14  1:15 ` [PATCH 24/51] libext2fs: Introduce dir_entry_tail to provide checksums for directory leaf nodes Darrick J. Wong
2011-12-14  1:16 ` [PATCH 25/51] e2fsck: Check directory leaf block checksums Darrick J. Wong
2011-12-14  1:16 ` [PATCH 26/51] tune2fs: Rebuild and checksum directories when toggling metadata_csum or changing UUID Darrick J. Wong
2011-12-14  1:16 ` [PATCH 27/51] libext2fs: Verify and calculate extended attribute block checksums Darrick J. Wong
2011-12-14  1:16 ` [PATCH 28/51] e2fsck: Check " Darrick J. Wong
2011-12-14  1:16 ` [PATCH 29/51] tune2fs: Rewrite " Darrick J. Wong
2011-12-14  1:16 ` Darrick J. Wong [this message]
2011-12-14  1:16 ` [PATCH 31/51] e2fsck: Handle superblock checksum errors gracefully Darrick J. Wong
2011-12-14  1:16 ` [PATCH 32/51] libext2fs: Use i_generation in inode-related metadata checksums Darrick J. Wong
2011-12-14  1:16 ` [PATCH 33/51] libext2fs: Record the checksum algorithm in use in the superblock Darrick J. Wong
2011-12-14  1:17 ` [PATCH 34/51] tune2fs: Store checksum algorithm type in superblock Darrick J. Wong
2011-12-14  1:17 ` [PATCH 35/51] mke2fs: Record the checksum algorithm in use in the superblock Darrick J. Wong
2011-12-14  1:17 ` [PATCH 36/51] libext2fs: Block group checksum should use metadata_csum algorithm (if feature flag set) Darrick J. Wong
2011-12-14  1:17 ` [PATCH 37/51] tune2fs: Rewrite block group checksums when changing bg_use_meta_csum feature Darrick J. Wong
2011-12-14  1:17 ` [PATCH 38/51] mke2fs: Warn if not enabling all the features that metadata_csum wants Darrick J. Wong
2011-12-14  1:17 ` [PATCH 39/51] libext2fs: Add checksum to MMP block Darrick J. Wong
2011-12-14  1:17 ` [PATCH 40/51] e2fsck: Verify and correct MMP checksum problems Darrick J. Wong
2011-12-14  1:17 ` [PATCH 41/51] tune2fs: Force MMP update when changing metadata_csum flag Darrick J. Wong
2011-12-14  1:17 ` [PATCH 42/51] libext2fs: Change on-disk journal layout to support metadata checksumming Darrick J. Wong
2011-12-14  1:18 ` [PATCH 43/51] libext2fs: Dump feature flags for jbd2 v2 checksums Darrick J. Wong
2011-12-14  1:18 ` [PATCH 44/51] e2fsck: Check journal superblock checksum prior to recovery Darrick J. Wong
2011-12-14  1:18 ` [PATCH 45/51] e2fsck: Check revoke block checksum during recovery Darrick J. Wong
2011-12-14  1:18 ` [PATCH 46/51] e2fsck: Check descriptor block checksum when recovering journal Darrick J. Wong
2011-12-14  1:18 ` [PATCH 47/51] e2fsck: Check commit block checksum during recovery Darrick J. Wong
2011-12-14  1:18 ` [PATCH 48/51] e2fsck: Verify data block checksums when recovering journal Darrick J. Wong
2011-12-14  1:18 ` [PATCH 49/51] libext2fs: Enable support for the metadata checksumming feature Darrick J. Wong
2011-12-14  1:18 ` [PATCH 50/51] libext2fs: Bring the CRC32c implementation up to date with the kernel implementation Darrick J. Wong
2011-12-14  1:18 ` [PATCH 51/51] e2fsck: Refactor crc32_be code Darrick J. Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111214011637.20947.19402.stgit@elm3c44.beaverton.ibm.com \
    --to=djwong@us.ibm.com \
    --cc=adilger.kernel@dilger.ca \
    --cc=amir73il@gmail.com \
    --cc=andi@firstfloor.org \
    --cc=cmm@us.ibm.com \
    --cc=colyli@gmail.com \
    --cc=jlbec@evilplan.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=sunil.mushran@oracle.com \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).