[stgt] [PATCH 7/8] ssc: add crc support

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Sun Oct 12 06:38:52 CEST 2008


Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
 usr/Makefile |    4 ++--
 usr/libssc.c |   12 ++++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/usr/Makefile b/usr/Makefile
index b0f3b20..7a3ca96 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -78,12 +78,12 @@ tgtadm: tgtadm.o
 
 -include tgtadm.d
 
-mktape: mktape.o libssc.o
+mktape: mktape.o libssc.o libcrc32c.o
 	$(CC) $^ -o $@
 
 -include mktape.d libssc.d
 
-dump_tape: dump_tape.o libssc.o
+dump_tape: dump_tape.o libssc.o libcrc32c.o
 	$(CC) $^ -o $@
 
 -include dump_tape.d libssc.d
diff --git a/usr/libssc.c b/usr/libssc.c
index 6ef9517..e13a9f6 100644
--- a/usr/libssc.c
+++ b/usr/libssc.c
@@ -22,9 +22,11 @@
 #include <stdint.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdio.h>
 #include "bs_ssc.h"
 #include "ssc.h"
 #include "be_byteshift.h"
+#include "crc32c.h"
 
 #define SSC_1ST_HDR_OFFSET (sizeof(struct MAM) + SSC_BLK_HDR_SIZE)
 
@@ -183,11 +185,17 @@ int ssc_read_blkhdr(int fd, struct blk_header_info *i, off_t offset)
 {
 	size_t count;
 	struct blk_header h, *m = &h;
+	uint32_t crc = ~0;
 
 	count = pread(fd, m, SSC_BLK_HDR_SIZE, offset);
 	if (count != SSC_BLK_HDR_SIZE)
 		return 1;
 
+	crc = crc32c(crc, &m->ondisk_sz, SSC_BLK_HDR_SIZE - sizeof(m->h_csum));
+
+	if (*(uint32_t *)m->h_csum != ~crc)
+		fprintf(stderr, "crc error\n");
+
 	SSC_GET_MAM_INFO_VAL(ondisk_sz, 32);
 	SSC_GET_MAM_INFO_VAL(blk_sz, 32);
 	SSC_GET_MAM_INFO_VAL(blk_type, 32);
@@ -203,6 +211,7 @@ int ssc_write_blkhdr(int fd, struct blk_header_info *i, off_t offset)
 {
 	size_t count;
 	struct blk_header h, *m = &h;
+	uint32_t crc = ~0;
 
 	SSC_PUT_MAM_INFO_VAL(ondisk_sz, 32);
 	SSC_PUT_MAM_INFO_VAL(blk_sz, 32);
@@ -212,6 +221,9 @@ int ssc_write_blkhdr(int fd, struct blk_header_info *i, off_t offset)
 	SSC_PUT_MAM_INFO_VAL(curr, 64);
 	SSC_PUT_MAM_INFO_VAL(next, 64);
 
+	crc = crc32c(crc, &m->ondisk_sz, SSC_BLK_HDR_SIZE - sizeof(m->h_csum));
+	*(uint32_t *)m->h_csum = ~crc;
+
 	count = pwrite(fd, m, SSC_BLK_HDR_SIZE, offset);
 	if (count != SSC_BLK_HDR_SIZE)
 		return 1;
-- 
1.5.6.5

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list