All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@us.ibm.com>
To: Andreas Dilger <adilger.kernel@dilger.ca>
Cc: Theodore Tso <tytso@mit.edu>,
	Sunil Mushran <sunil.mushran@oracle.com>,
	Amir Goldstein <amir73il@gmail.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Mingming Cao <cmm@us.ibm.com>,
	Joel Becker <jlbec@evilplan.org>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	linux-ext4@vger.kernel.org, Coly Li <colyli@gmail.com>
Subject: Re: [PATCH 16/16] jbd2: Support CRC32C transaction checksums
Date: Fri, 2 Sep 2011 11:31:36 -0700	[thread overview]
Message-ID: <20110902183136.GD12086@tux1.beaverton.ibm.com> (raw)
In-Reply-To: <99019900-30B1-450A-9620-E94371A30CC6@dilger.ca>

On Thu, Sep 01, 2011 at 02:11:26AM -0600, Andreas Dilger wrote:
> On 2011-08-31, at 6:32 PM, Darrick J. Wong wrote:
> > The CRC32c polynomial provides better error detection and can be hardware
> > accelerated on certain machines.  To that end, add support for it to jbd2.
> > 
> > Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
> > ---
> > fs/jbd2/Kconfig      |    1 +
> > fs/jbd2/commit.c     |    6 +++---
> > fs/jbd2/recovery.c   |   20 +++++++++++++++++---
> > include/linux/jbd2.h |    1 +
> > 4 files changed, 22 insertions(+), 6 deletions(-)
> > 
> > 
> > diff --git a/fs/jbd2/Kconfig b/fs/jbd2/Kconfig
> > index f32f346..40a126b 100644
> > --- a/fs/jbd2/Kconfig
> > +++ b/fs/jbd2/Kconfig
> > @@ -1,6 +1,7 @@
> > config JBD2
> > 	tristate
> > 	select CRC32
> > +	select LIBCRC32C
> > 	help
> > 	  This is a generic journaling layer for block devices that support
> > 	  both 32-bit and 64-bit block numbers.  It is currently used by
> > diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
> > index eef6979..00387be 100644
> > --- a/fs/jbd2/commit.c
> > +++ b/fs/jbd2/commit.c
> > @@ -21,7 +21,7 @@
> > #include <linux/mm.h>
> > #include <linux/pagemap.h>
> > #include <linux/jiffies.h>
> > -#include <linux/crc32.h>
> > +#include <linux/crc32c.h>
> > #include <linux/writeback.h>
> > #include <linux/backing-dev.h>
> > #include <linux/bio.h>
> > @@ -125,7 +125,7 @@ static int journal_submit_commit_record(journal_t *journal,
> > 
> > 	if (JBD2_HAS_COMPAT_FEATURE(journal,
> > 				    JBD2_FEATURE_COMPAT_CHECKSUM)) {
> > -		tmp->h_chksum_type 	= JBD2_CRC32_CHKSUM;
> > +		tmp->h_chksum_type	= JBD2_CRC32C_CHKSUM;
> > 		tmp->h_chksum_size 	= JBD2_CRC32_CHKSUM_SIZE;
> > 		tmp->h_chksum[0] 	= cpu_to_be32(crc32_sum);
> > 	}
> > @@ -287,7 +287,7 @@ static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
> > 	__u32 checksum;
> > 
> > 	addr = kmap_atomic(page, KM_USER0);
> > -	checksum = crc32_be(crc32_sum,
> > +	checksum = crc32c_le(crc32_sum,
> > 		(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
> > 	kunmap_atomic(addr, KM_USER0);
> > 
> > diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c
> > index 1cad869..4bab4dd 100644
> > --- a/fs/jbd2/recovery.c
> > +++ b/fs/jbd2/recovery.c
> > @@ -21,6 +21,7 @@
> > #include <linux/jbd2.h>
> > #include <linux/errno.h>
> > #include <linux/crc32.h>
> > +#include <linux/crc32c.h>
> > #endif
> > 
> > /*
> > @@ -323,7 +324,8 @@ static inline unsigned long long read_tag_block(int tag_bytes, journal_block_tag
> >  * descriptor block.
> >  */
> > static int calc_chksums(journal_t *journal, struct buffer_head *bh,
> > -			unsigned long *next_log_block, __u32 *crc32_sum)
> > +			unsigned long *next_log_block, __u32 *crc32_sum,
> > +			__u32 *crc32c_sum)
> > {
> > 	int i, num_blks, err;
> > 	unsigned long io_block;
> > @@ -332,6 +334,7 @@ static int calc_chksums(journal_t *journal, struct buffer_head *bh,
> > 	num_blks = count_tags(journal, bh);
> > 	/* Calculate checksum of the descriptor block. */
> > 	*crc32_sum = crc32_be(*crc32_sum, (void *)bh->b_data, bh->b_size);
> > +	*crc32c_sum = crc32c_le(*crc32c_sum, (void *)bh->b_data, bh->b_size);
> 
> We definitely do not want to compute both the crc32 and crc32c for every
> block written to the journal.  That would be needlessly expensive.
> 
> It looks like the missing factor is not knowing the checksum type before
> the commit block is accessed.  This can be fixed by storing the checksum
> type in the journal superblock (JBD2_CKSUM_TYPE_CRC32 = 0 for compatibility).
> 
> During recovery, the journal superblock s_chksum_type should remain as
> set by the previous kernel (so the existing commit block checksums can
> be verified) and as soon as the journal recovery has completed and a new
> block written to the journal the checksum type can be updated to the latest
> default value.

Okay, that does sound better than my current weird approach. :)  I admit to
being a bit timid about messing with jbd2 after proposing a lot of changes to
ext4.

> > 	for (i = 0; i < num_blks; i++) {
> > 		io_block = (*next_log_block)++;
> > @@ -344,6 +347,9 @@ static int calc_chksums(journal_t *journal, struct buffer_head *bh,
> > 		} else {
> > 			*crc32_sum = crc32_be(*crc32_sum, (void *)obh->b_data,
> > 				     obh->b_size);
> > +			*crc32c_sum = crc32c_le(*crc32c_sum,
> > +				     (void *)obh->b_data,
> > +				     obh->b_size);
> 
> (style) the indenting here is funky.  Continued lines should follow the
>        '(' on the previous line and not be gratuitously wrapped.

Yeah, I wondered about that.

--D

> > @@ -617,7 +625,12 @@ static int do_one_pass(journal_t *journal,
> > 				    cbh->h_chksum_type == JBD2_CRC32_CHKSUM &&
> > 				    cbh->h_chksum_size ==
> > 						JBD2_CRC32_CHKSUM_SIZE)
> > -				       chksum_seen = 1;
> > +					chksum_seen = 1;
> > +				else if (crc32c_sum == found_chksum &&
> > +				    cbh->h_chksum_type == JBD2_CRC32C_CHKSUM &&
> > +				    cbh->h_chksum_size ==
> > +						JBD2_CRC32_CHKSUM_SIZE)
> > +					chksum_seen = 1;
> > 				else if (!(cbh->h_chksum_type == 0 &&
> > 					     cbh->h_chksum_size == 0 &&
> > 					     found_chksum == 0 &&
> > @@ -646,6 +659,7 @@ static int do_one_pass(journal_t *journal,
> > 					}
> > 				}
> > 				crc32_sum = ~0;
> > +				crc32c_sum = ~0;
> > 			}
> > 			brelse(bh);
> > 			next_commit_ID++;
> > diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
> > index 38f307b..de3ec23 100644
> > --- a/include/linux/jbd2.h
> > +++ b/include/linux/jbd2.h
> > @@ -147,6 +147,7 @@ typedef struct journal_header_s
> > #define JBD2_CRC32_CHKSUM   1
> > #define JBD2_MD5_CHKSUM     2
> > #define JBD2_SHA1_CHKSUM    3
> > +#define JBD2_CRC32C_CHKSUM  4
> > 
> > #define JBD2_CRC32_CHKSUM_SIZE 4
> > 
> > 
> 

  parent reply	other threads:[~2011-09-02 18:31 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-01  0:30 [PATCH v1 00/16] ext4: Add metadata checksumming Darrick J. Wong
2011-09-01  0:30 ` [PATCH 01/16] ext4: ext4_dx_add_entry should dirty directory metadata with the directory inode Darrick J. Wong
2011-09-01  0:30 ` [PATCH 02/16] ext4: ext4_rename should dirty dir_bh with the correct directory Darrick J. Wong
2011-09-01  0:30 ` [PATCH 03/16] ext4: ext4_mkdir should dirty dir_block with the parent inode Darrick J. Wong
2011-09-01  0:30 ` [PATCH 04/16] ext4: Create a new BH_Verified flag to avoid unnecessary metadata validation Darrick J. Wong
2011-09-01  0:31 ` [PATCH 05/16] ext4: Create a rocompat flag for extended metadata checksumming Darrick J. Wong
2011-09-01  0:31 ` [PATCH 06/16] ext4: Calculate and verify inode checksums Darrick J. Wong
2011-09-01  2:30   ` Andreas Dilger
2011-09-02 19:32     ` Darrick J. Wong
2011-09-02 22:02       ` Andreas Dilger
2011-09-05 17:57         ` Darrick J. Wong
2011-09-01  0:31 ` [PATCH 07/16] ext4: Create bitmap checksum helper functions Darrick J. Wong
2011-09-01  0:31 ` [PATCH 08/16] ext4: Calculate and verify checksums for inode bitmaps Darrick J. Wong
2011-09-01  4:49   ` Andreas Dilger
2011-09-02 19:18     ` Darrick J. Wong
2011-09-02 21:27       ` Andreas Dilger
2011-09-05 18:22         ` Darrick J. Wong
2011-09-05 18:27           ` Andi Kleen
2011-09-05 19:45           ` James Bottomley
2011-09-05 22:12             ` Darrick J. Wong
2011-09-01  0:31 ` [PATCH 09/16] ext4: Calculate and verify block bitmap checksum Darrick J. Wong
     [not found]   ` <2492E720-3316-4561-8C9C-BBC6E8670EAD@dilger.ca>
2011-09-02 19:08     ` Darrick J. Wong
2011-09-02 21:06       ` Andreas Dilger
2011-09-01  0:31 ` [PATCH 10/16] ext4: Verify and calculate checksums for extent tree blocks Darrick J. Wong
     [not found]   ` <26584BE9-B716-40D5-B3B4-8C5912869648@dilger.ca>
2011-09-02 19:02     ` Darrick J. Wong
2011-09-01  0:31 ` [PATCH 11/16] ext4: Calculate and verify checksums for htree nodes Darrick J. Wong
2011-09-01  0:31 ` [PATCH 12/16] ext4: Calculate and verify checksums of directory leaf blocks Darrick J. Wong
     [not found]   ` <4D5D8FB2-0D8A-4D30-B6D8-51158395C1C9@dilger.ca>
2011-09-02 18:57     ` Darrick J. Wong
2011-09-02 20:52       ` Andreas Dilger
2011-09-05 18:30         ` Darrick J. Wong
2011-09-01  0:32 ` [PATCH 13/16] ext4: Calculate and verify checksums of extended attribute blocks Darrick J. Wong
     [not found]   ` <F4A42DCE-F91C-419B-9153-65A7EA91D241@dilger.ca>
2011-09-02 18:43     ` Darrick J. Wong
2011-09-01  0:32 ` [PATCH 14/16] ext4: Make inode checksum cover empty space Darrick J. Wong
     [not found]   ` <4540D5DB-53D9-4C33-BC6B-868870D42AF3@dilger.ca>
2011-09-02 18:42     ` Darrick J. Wong
2011-09-01  0:32 ` [PATCH 15/16] ext4: Calculate and verify superblock checksum Darrick J. Wong
     [not found]   ` <2882FBB2-797C-4D27-8569-B6826DD34F68@dilger.ca>
2011-09-02 18:40     ` Darrick J. Wong
2011-09-01  0:32 ` [PATCH 16/16] jbd2: Support CRC32C transaction checksums Darrick J. Wong
     [not found]   ` <99019900-30B1-450A-9620-E94371A30CC6@dilger.ca>
2011-09-02 18:31     ` Darrick J. Wong [this message]
2011-09-02 14:15 ` [PATCH v1 00/16] ext4: Add metadata checksumming Greg Freemyer
2011-09-02 14:15   ` Greg Freemyer
2011-09-02 18:22   ` Darrick J. Wong
2011-09-02 18:22     ` Darrick J. Wong
2011-09-04 11:41     ` Martin K. Petersen
2011-09-04 16:54       ` Andi Kleen
2011-09-04 17:17         ` Martin K. Petersen
2011-09-04 17:44           ` Andi Kleen
2011-09-04 22:19             ` Martin K. Petersen
2011-09-05 18:55               ` Darrick J. Wong
2011-09-05 18:45       ` Darrick J. Wong
2011-09-06 12:59         ` Martin K. Petersen

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=20110902183136.GD12086@tux1.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=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.