[Ocfs2-tools-devel] [PATCH 1/8] Store original data when fixing blocks

Goldwyn Rodrigues rgoldwyn at gmail.com
Mon Aug 1 10:58:13 PDT 2011


While fixing hamming code in blockcheck, the original data is fixed.
However, if only the CRC is incorrect, it ends up changing/corrupting
the block. One block's medicine is another blocks poison :)

Copy the original data in a temporary buffer, and copy back if block
cannot be fixed.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>
---
 libocfs2/blockcheck.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/libocfs2/blockcheck.c b/libocfs2/blockcheck.c
index adc2d8b..a613fc9 100644
--- a/libocfs2/blockcheck.c
+++ b/libocfs2/blockcheck.c
@@ -340,6 +340,7 @@ errcode_t ocfs2_block_check_validate(void *data,
size_t blocksize,
 	errcode_t err = 0;
 	struct ocfs2_block_check check;
 	uint32_t crc, ecc;
+	char *buf = NULL;

 	check.bc_crc32e = le32_to_cpu(bc->bc_crc32e);
 	check.bc_ecc = le16_to_cpu(bc->bc_ecc);
@@ -351,6 +352,11 @@ errcode_t ocfs2_block_check_validate(void *data,
size_t blocksize,
 	if (crc == check.bc_crc32e)
 		goto out;

+	/* Save data block in temporary buffer */
+	err = ocfs2_malloc(blocksize, &buf);
+	if (err)
+		return err;
+	memcpy(buf, data, blocksize);
 	/* Ok, try ECC fixups */
 	ecc = ocfs2_hamming_encode_block(data, blocksize);
 	ocfs2_hamming_fix_block(data, blocksize, ecc ^ check.bc_ecc);
@@ -360,11 +366,14 @@ errcode_t ocfs2_block_check_validate(void *data,
size_t blocksize,
 	if (crc == check.bc_crc32e)
 		goto out;

+	memcpy(data, buf, blocksize);
 	err = OCFS2_ET_IO;

 out:
 	bc->bc_crc32e = cpu_to_le32(check.bc_crc32e);
 	bc->bc_ecc = cpu_to_le16(check.bc_ecc);
+	if (buf)
+		ocfs2_free(&buf);

 	return err;
 }
-- 
1.7.6



More information about the Ocfs2-tools-devel mailing list