[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