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 09/47] libext2fs: Create the inode bitmap checksum
Date: Sat, 08 Oct 2011 00:34:13 -0700 [thread overview]
Message-ID: <20111008073413.17888.75831.stgit@elm3c44.beaverton.ibm.com> (raw)
In-Reply-To: <20111008073315.17888.22132.stgit@elm3c44.beaverton.ibm.com>
Provide a field in the block group descriptor to store inode bitmap checksum,
and some helper functions to calculate and verify it.
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
---
lib/ext2fs/blknum.c | 15 +++++++++++++
lib/ext2fs/closefs.c | 29 +++++++++++++++-----------
lib/ext2fs/csum.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++
lib/ext2fs/ext2_fs.h | 4 ++++
lib/ext2fs/ext2fs.h | 6 +++++
lib/ext2fs/rw_bitmaps.c | 17 +++++++++++++++
6 files changed, 112 insertions(+), 12 deletions(-)
diff --git a/lib/ext2fs/blknum.c b/lib/ext2fs/blknum.c
index fd203b4..30987fc 100644
--- a/lib/ext2fs/blknum.c
+++ b/lib/ext2fs/blknum.c
@@ -230,6 +230,21 @@ void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group, blk64_t blk)
}
/*
+ * Return the inode bitmap checksum of a group
+ */
+__u32 ext2fs_inode_bitmap_checksum(ext2_filsys fs, dgrp_t group)
+{
+ struct ext4_group_desc *gdp;
+ __u32 csum;
+
+ gdp = ext4fs_group_desc(fs, fs->group_desc, group);
+ csum = gdp->bg_inode_bitmap_csum_lo;
+ if (fs->super->s_desc_size < EXT4_BG_INODE_BITMAP_CSUM_HI_LOCATION)
+ csum |= ((__u32)gdp->bg_inode_bitmap_csum_hi << 16);
+ return csum;
+}
+
+/*
* Return the inode bitmap block of a group
*/
blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group)
diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c
index 973c2a2..1867be3 100644
--- a/lib/ext2fs/closefs.c
+++ b/lib/ext2fs/closefs.c
@@ -288,6 +288,23 @@ errcode_t ext2fs_flush2(ext2_filsys fs, int flags)
fs->super->s_wtime = fs->now ? fs->now : time(NULL);
fs->super->s_block_group_nr = 0;
+
+ /*
+ * If the write_bitmaps() function is present, call it to
+ * flush the bitmaps. This is done this way so that a simple
+ * program that doesn't mess with the bitmaps doesn't need to
+ * drag in the bitmaps.c code.
+ *
+ * Bitmap checksums live in the group descriptor, so the
+ * bitmaps need to be written before the descriptors.
+ */
+ if (fs->write_bitmaps) {
+ retval = fs->write_bitmaps(fs);
+ if (retval)
+ goto errout;
+ }
+
+ /* Prepare the group descriptors for writing */
#ifdef WORDS_BIGENDIAN
retval = EXT2_ET_NO_MEMORY;
retval = ext2fs_get_mem(SUPERBLOCK_SIZE, &super_shadow);
@@ -378,18 +395,6 @@ errcode_t ext2fs_flush2(ext2_filsys fs, int flags)
ext2fs_numeric_progress_close(fs, &progress, NULL);
- /*
- * If the write_bitmaps() function is present, call it to
- * flush the bitmaps. This is done this way so that a simple
- * program that doesn't mess with the bitmaps doesn't need to
- * drag in the bitmaps.c code.
- */
- if (fs->write_bitmaps) {
- retval = fs->write_bitmaps(fs);
- if (retval)
- goto errout;
- }
-
write_primary_superblock_only:
/*
* Write out master superblock. This has to be done
diff --git a/lib/ext2fs/csum.c b/lib/ext2fs/csum.c
index b8945ad..91b1892 100644
--- a/lib/ext2fs/csum.c
+++ b/lib/ext2fs/csum.c
@@ -30,6 +30,59 @@
#define STATIC static
#endif
+static __u32 ext2fs_bitmap_csum(ext2_filsys fs, dgrp_t group, char *bitmap,
+ int size)
+{
+ __u32 crc;
+
+ group = ext2fs_cpu_to_le32(group);
+ crc = ext2fs_crc32c_le(~0, fs->super->s_uuid,
+ sizeof(fs->super->s_uuid));
+ crc = ext2fs_crc32c_le(crc, (unsigned char *)&group, sizeof(group));
+ crc = ext2fs_crc32c_le(crc, (unsigned char *)bitmap, size);
+
+ return crc;
+}
+
+int ext2fs_inode_bitmap_csum_verify(ext2_filsys fs, dgrp_t group,
+ char *bitmap, int size)
+{
+ struct ext4_group_desc *gdp = (struct ext4_group_desc *)
+ ext2fs_group_desc(fs, fs->group_desc, group);
+ __u32 provided, calculated;
+
+ if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
+ EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
+ return 1;
+ provided = gdp->bg_inode_bitmap_csum_lo;
+ calculated = ext2fs_bitmap_csum(fs, group, bitmap, size);
+ if (fs->super->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_LOCATION)
+ provided |= ((__u32)gdp->bg_inode_bitmap_csum_hi << 16);
+ else
+ calculated &= 0xFFFF;
+
+ return provided == calculated;
+}
+
+errcode_t ext2fs_inode_bitmap_csum_set(ext2_filsys fs, dgrp_t group,
+ char *bitmap, int size)
+{
+ __u32 crc;
+ struct ext4_group_desc *gdp = (struct ext4_group_desc *)
+ ext2fs_group_desc(fs, fs->group_desc, group);
+
+ if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
+ EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
+ return 0;
+
+ crc = ext2fs_bitmap_csum(fs, group, bitmap, size);
+ gdp->bg_inode_bitmap_csum_lo = crc & 0xFFFF;
+ if (fs->super->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_LOCATION)
+ gdp->bg_inode_bitmap_csum_hi = crc >> 16;
+
+ return 0;
+}
+
static errcode_t ext2fs_inode_csum(ext2_filsys fs, ext2_ino_t inum,
struct ext2_inode_large *inode,
__u32 *crc)
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 6fd82f1..e7f8bb4 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -191,6 +191,10 @@ struct ext4_group_desc
__u32 bg_reserved;
};
+#define EXT4_BG_INODE_BITMAP_CSUM_HI_LOCATION \
+ (offsetof(struct ext4_group_desc, bg_inode_bitmap_csum_hi) + \
+ sizeof(__u16))
+
#define EXT2_BG_INODE_UNINIT 0x0001 /* Inode table/bitmap not initialized */
#define EXT2_BG_BLOCK_UNINIT 0x0002 /* Block bitmap not initialized */
#define EXT2_BG_INODE_ZEROED 0x0004 /* On-disk itable initialized to zero */
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index 04db632..d71181b 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -788,6 +788,7 @@ extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
void *out);
/* blknum.c */
+extern __u32 ext2fs_inode_bitmap_checksum(ext2_filsys fs, dgrp_t group);
extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t);
extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group);
extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group);
@@ -818,6 +819,7 @@ extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs,
extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group);
extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
blk64_t blk);
+extern __u32 ext2fs_inode_bitmap_csum(ext2_filsys fs, dgrp_t group);
extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group);
extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
blk64_t blk);
@@ -925,6 +927,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_inode_bitmap_csum_set(ext2_filsys fs, dgrp_t group,
+ char *bitmap, int size);
+extern int ext2fs_inode_bitmap_csum_verify(ext2_filsys fs, dgrp_t group,
+ char *bitmap, int size);
extern errcode_t ext2fs_inode_csum_set(ext2_filsys fs, ext2_ino_t inum,
struct ext2_inode_large *inode);
extern int ext2fs_inode_csum_verify(ext2_filsys fs, ext2_ino_t inum,
diff --git a/lib/ext2fs/rw_bitmaps.c b/lib/ext2fs/rw_bitmaps.c
index 1d5f7b2..a325fdb 100644
--- a/lib/ext2fs/rw_bitmaps.c
+++ b/lib/ext2fs/rw_bitmaps.c
@@ -117,6 +117,12 @@ static errcode_t write_bitmaps(ext2_filsys fs, int do_inode, int do_block)
if (retval)
goto errout;
+ retval = ext2fs_inode_bitmap_csum_set(fs, i, inode_buf,
+ inode_nbytes);
+ if (retval)
+ goto errout;
+ ext2fs_group_desc_csum_set(fs, i);
+
blk = ext2fs_inode_bitmap_loc(fs, i);
if (blk) {
retval = io_channel_write_blk64(fs->io, blk, 1,
@@ -163,6 +169,7 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
blk64_t blk_cnt;
ext2_ino_t ino_itr = 1;
ext2_ino_t ino_cnt;
+ struct ext4_group_desc *gdp;
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
@@ -288,6 +295,16 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
retval = EXT2_ET_INODE_BITMAP_READ;
goto cleanup;
}
+
+ /* verify inode bitmap checksum */
+ gdp = (struct ext4_group_desc *)
+ ext2fs_group_desc(fs, fs->group_desc,
+ i);
+ if (!(fs->flags &
+ EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
+ !ext2fs_inode_bitmap_csum_verify(fs, i,
+ inode_bitmap, inode_nbytes))
+ return EXT2_ET_INODE_BITMAP_READ;
} else
memset(inode_bitmap, 0, inode_nbytes);
cnt = inode_nbytes << 3;
next prev parent reply other threads:[~2011-10-08 7:36 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-08 7:33 [PATCH v2 00/47] e2fsprogs: Add metadata checksumming Darrick J. Wong
2011-10-08 7:33 ` [PATCH 01/47] libext2fs: Read and write full size inodes Darrick J. Wong
2011-10-08 7:33 ` [PATCH 02/47] libext2fs: Add metadata checksum flag Darrick J. Wong
2011-10-08 7:33 ` [PATCH 03/47] debugfs: Optionally ignore bad checksums Darrick J. Wong
2011-10-08 7:33 ` [PATCH 04/47] libext2fs: Add inode checksum support Darrick J. Wong
2011-10-08 7:33 ` [PATCH 05/47] debugfs: Dump inode checksum when appropriate Darrick J. Wong
2011-10-08 7:33 ` [PATCH 06/47] tune2fs: Add inode checksum support Darrick J. Wong
2011-10-08 7:34 ` [PATCH 07/47] e2fsck: Verify and correct inode checksums Darrick J. Wong
2011-10-08 7:34 ` [PATCH 08/47] mke2fs: Allow metadata checksums to be turned on at mkfs time Darrick J. Wong
2011-10-08 7:34 ` Darrick J. Wong [this message]
2011-10-08 7:34 ` [PATCH 10/47] tune2fs: Rewrite inode bitmap checksums Darrick J. Wong
2011-10-08 7:34 ` [PATCH 11/47] dumpe2fs: Display inode bitmap checksum Darrick J. Wong
2011-10-08 7:34 ` [PATCH 12/47] e2fsck: Verify " Darrick J. Wong
2011-10-08 7:34 ` [PATCH 13/47] libext2fs: Create the block " Darrick J. Wong
2011-10-08 7:34 ` [PATCH 14/47] dumpe2fs: Display " Darrick J. Wong
2011-10-08 7:34 ` [PATCH 15/47] e2fsck: Verify " Darrick J. Wong
2011-10-08 7:34 ` [PATCH 16/47] e2fsck: Don't verify bitmap checksums Darrick J. Wong
2011-10-08 7:35 ` [PATCH 17/47] tune2fs: Rewrite block " Darrick J. Wong
2011-10-08 7:35 ` [PATCH 18/47] libext2fs: Verify and calculate extent tree block checksums Darrick J. Wong
2011-10-08 7:35 ` [PATCH 19/47] tune2fs: Enable extent tree checksums Darrick J. Wong
2011-10-08 7:35 ` [PATCH 20/47] libext2fs: Introduce dx_tail and dir_entry_tail Darrick J. Wong
2011-10-08 7:35 ` [PATCH 21/47] debugfs: Print htree internal node checksums Darrick J. Wong
2011-10-08 7:35 ` [PATCH 22/47] libext2fs: Add dx_root/dx_node checksum calculation and verification helpers Darrick J. Wong
2011-10-08 7:35 ` [PATCH 23/47] e2fsck: Verify htree root/node checksums Darrick J. Wong
2011-10-08 7:35 ` [PATCH 24/47] libext2fs: Introduce dir_entry_tail to provide checksums for directory leaf nodes Darrick J. Wong
2011-10-08 7:35 ` [PATCH 25/47] e2fsck: Check directory leaf block checksums Darrick J. Wong
2011-10-08 7:36 ` [PATCH 26/47] tune2fs: Rebuild and checksum directories when toggling metadata_csum or changing UUID Darrick J. Wong
2011-10-08 7:36 ` [PATCH 27/47] libext2fs: Verify and calculate extended attribute block checksums Darrick J. Wong
2011-10-08 7:36 ` [PATCH 28/47] e2fsck: Check " Darrick J. Wong
2011-10-08 7:36 ` [PATCH 29/47] tune2fs: Rewrite " Darrick J. Wong
2011-10-08 7:36 ` [PATCH 30/47] libext2fs: Calculate and verify superblock checksums Darrick J. Wong
2011-10-08 7:36 ` [PATCH 31/47] e2fsck: Handle superblock checksum errors gracefully Darrick J. Wong
2011-10-08 7:36 ` [PATCH 32/47] libext2fs: Use i_generation in inode-related metadata checksums Darrick J. Wong
2011-10-08 7:36 ` [PATCH 33/47] libext2fs: Record the checksum algorithm in use in the superblock Darrick J. Wong
2011-10-08 7:36 ` [PATCH 34/47] tune2fs: Store checksum algorithm type in superblock Darrick J. Wong
2011-10-08 7:37 ` [PATCH 35/47] mke2fs: Record the checksum algorithm in use in the superblock Darrick J. Wong
2011-10-08 7:37 ` [PATCH 36/47] libext2fs: Block group checksum should use metadata_csum algorithm (if feature flag set) Darrick J. Wong
2011-10-08 7:37 ` [PATCH 37/47] tune2fs: Rewrite block group checksums when changing bg_use_meta_csum feature Darrick J. Wong
2011-10-08 7:37 ` [PATCH 38/47] mke2fs: Warn if not enabling all the features that metadata_csum wants Darrick J. Wong
2011-10-08 7:37 ` [PATCH 39/47] libext2fs: Add checksum to MMP block Darrick J. Wong
2011-10-08 7:37 ` [PATCH 40/47] e2fsck: Verify and correct MMP checksum problems Darrick J. Wong
2011-10-08 7:37 ` [PATCH 41/47] tune2fs: Force MMP update when changing metadata_csum flag Darrick J. Wong
2011-10-08 7:37 ` [PATCH 42/47] libext2fs: Add feature flags for jbd2 v2 checksums Darrick J. Wong
2011-10-08 7:37 ` [PATCH 43/47] e2fsck: Check journal superblock checksum prior to recovery Darrick J. Wong
2011-10-08 7:37 ` [PATCH 44/47] e2fsck: Check revoke block checksum during recovery Darrick J. Wong
2011-10-08 7:38 ` [PATCH 45/47] e2fsck: Check descriptor block checksum when recovering journal Darrick J. Wong
2011-10-08 7:38 ` [PATCH 46/47] e2fsck: Check commit block checksum during recovery Darrick J. Wong
2011-10-08 7:38 ` [PATCH 47/47] e2fsck: Verify data block checksums when recovering journal 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=20111008073413.17888.75831.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).