diff options
Diffstat (limited to 'fs/ocfs2/blockcheck.c')
| -rw-r--r-- | fs/ocfs2/blockcheck.c | 42 | 
1 files changed, 22 insertions, 20 deletions
diff --git a/fs/ocfs2/blockcheck.c b/fs/ocfs2/blockcheck.c index c7ee03c2222..0725e605465 100644 --- a/fs/ocfs2/blockcheck.c +++ b/fs/ocfs2/blockcheck.c @@ -422,45 +422,46 @@ int ocfs2_block_check_validate(void *data, size_t blocksize,  			       struct ocfs2_blockcheck_stats *stats)  {  	int rc = 0; -	struct ocfs2_block_check check; +	u32 bc_crc32e; +	u16 bc_ecc;  	u32 crc, ecc;  	ocfs2_blockcheck_inc_check(stats); -	check.bc_crc32e = le32_to_cpu(bc->bc_crc32e); -	check.bc_ecc = le16_to_cpu(bc->bc_ecc); +	bc_crc32e = le32_to_cpu(bc->bc_crc32e); +	bc_ecc = le16_to_cpu(bc->bc_ecc);  	memset(bc, 0, sizeof(struct ocfs2_block_check));  	/* Fast path - if the crc32 validates, we're good to go */  	crc = crc32_le(~0, data, blocksize); -	if (crc == check.bc_crc32e) +	if (crc == bc_crc32e)  		goto out;  	ocfs2_blockcheck_inc_failure(stats);  	mlog(ML_ERROR,  	     "CRC32 failed: stored: 0x%x, computed 0x%x. Applying ECC.\n", -	     (unsigned int)check.bc_crc32e, (unsigned int)crc); +	     (unsigned int)bc_crc32e, (unsigned int)crc);  	/* Ok, try ECC fixups */  	ecc = ocfs2_hamming_encode_block(data, blocksize); -	ocfs2_hamming_fix_block(data, blocksize, ecc ^ check.bc_ecc); +	ocfs2_hamming_fix_block(data, blocksize, ecc ^ bc_ecc);  	/* And check the crc32 again */  	crc = crc32_le(~0, data, blocksize); -	if (crc == check.bc_crc32e) { +	if (crc == bc_crc32e) {  		ocfs2_blockcheck_inc_recover(stats);  		goto out;  	}  	mlog(ML_ERROR, "Fixed CRC32 failed: stored: 0x%x, computed 0x%x\n", -	     (unsigned int)check.bc_crc32e, (unsigned int)crc); +	     (unsigned int)bc_crc32e, (unsigned int)crc);  	rc = -EIO;  out: -	bc->bc_crc32e = cpu_to_le32(check.bc_crc32e); -	bc->bc_ecc = cpu_to_le16(check.bc_ecc); +	bc->bc_crc32e = cpu_to_le32(bc_crc32e); +	bc->bc_ecc = cpu_to_le16(bc_ecc);  	return rc;  } @@ -528,7 +529,8 @@ int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr,  				   struct ocfs2_blockcheck_stats *stats)  {  	int i, rc = 0; -	struct ocfs2_block_check check; +	u32 bc_crc32e; +	u16 bc_ecc;  	u32 crc, ecc, fix;  	BUG_ON(nr < 0); @@ -538,21 +540,21 @@ int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr,  	ocfs2_blockcheck_inc_check(stats); -	check.bc_crc32e = le32_to_cpu(bc->bc_crc32e); -	check.bc_ecc = le16_to_cpu(bc->bc_ecc); +	bc_crc32e = le32_to_cpu(bc->bc_crc32e); +	bc_ecc = le16_to_cpu(bc->bc_ecc);  	memset(bc, 0, sizeof(struct ocfs2_block_check));  	/* Fast path - if the crc32 validates, we're good to go */  	for (i = 0, crc = ~0; i < nr; i++)  		crc = crc32_le(crc, bhs[i]->b_data, bhs[i]->b_size); -	if (crc == check.bc_crc32e) +	if (crc == bc_crc32e)  		goto out;  	ocfs2_blockcheck_inc_failure(stats);  	mlog(ML_ERROR,  	     "CRC32 failed: stored: %u, computed %u.  Applying ECC.\n", -	     (unsigned int)check.bc_crc32e, (unsigned int)crc); +	     (unsigned int)bc_crc32e, (unsigned int)crc);  	/* Ok, try ECC fixups */  	for (i = 0, ecc = 0; i < nr; i++) { @@ -565,7 +567,7 @@ int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr,  						bhs[i]->b_size * 8,  						bhs[i]->b_size * 8 * i);  	} -	fix = ecc ^ check.bc_ecc; +	fix = ecc ^ bc_ecc;  	for (i = 0; i < nr; i++) {  		/*  		 * Try the fix against each buffer.  It will only affect @@ -578,19 +580,19 @@ int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr,  	/* And check the crc32 again */  	for (i = 0, crc = ~0; i < nr; i++)  		crc = crc32_le(crc, bhs[i]->b_data, bhs[i]->b_size); -	if (crc == check.bc_crc32e) { +	if (crc == bc_crc32e) {  		ocfs2_blockcheck_inc_recover(stats);  		goto out;  	}  	mlog(ML_ERROR, "Fixed CRC32 failed: stored: %u, computed %u\n", -	     (unsigned int)check.bc_crc32e, (unsigned int)crc); +	     (unsigned int)bc_crc32e, (unsigned int)crc);  	rc = -EIO;  out: -	bc->bc_crc32e = cpu_to_le32(check.bc_crc32e); -	bc->bc_ecc = cpu_to_le16(check.bc_ecc); +	bc->bc_crc32e = cpu_to_le32(bc_crc32e); +	bc->bc_ecc = cpu_to_le16(bc_ecc);  	return rc;  }  | 
