return (p1->off + p1->count == p2->off);
}
-static u32 osc_checksum_bulk(int nob, size_t pg_count,
+static int osc_checksum_bulk(int nob, size_t pg_count,
struct brw_page **pga, int opc,
- enum cksum_types cksum_type)
+ enum cksum_types cksum_type,
+ u32 *cksum)
{
- u32 cksum;
int i = 0;
struct cfs_crypto_hash_desc *hdesc;
unsigned int bufsize;
i++;
}
- bufsize = sizeof(cksum);
- cfs_crypto_hash_final(hdesc, (unsigned char *)&cksum, &bufsize);
+ bufsize = sizeof(*cksum);
+ cfs_crypto_hash_final(hdesc, (unsigned char *)cksum, &bufsize);
/* For sending we only compute the wrong checksum instead
* of corrupting the data so it is still correct on a redo */
if (opc == OST_WRITE && OBD_FAIL_CHECK(OBD_FAIL_OSC_CHECKSUM_SEND))
- cksum++;
+ (*cksum)++;
- return cksum;
+ return 0;
}
static int
body->oa.o_flags |= cksum_type_pack(cksum_type);
body->oa.o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
- body->oa.o_cksum = osc_checksum_bulk(requested_nob,
- page_count, pga,
- OST_WRITE,
- cksum_type);
+
+ rc = osc_checksum_bulk(requested_nob, page_count,
+ pga, OST_WRITE, cksum_type,
+ &body->oa.o_cksum);
+ if (rc < 0) {
+ CDEBUG(D_PAGE, "failed to checksum, rc = %d\n",
+ rc);
+ GOTO(out, rc);
+ }
CDEBUG(D_PAGE, "checksum at write origin: %x\n",
body->oa.o_cksum);
+
/* save this in 'oa', too, for later checking */
oa->o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
oa->o_flags |= cksum_type_pack(cksum_type);
__u32 new_cksum;
char *msg;
enum cksum_types cksum_type;
+ int rc;
if (server_cksum == client_cksum) {
CDEBUG(D_PAGE, "checksum %x confirmed\n", client_cksum);
cksum_type = cksum_type_unpack(oa->o_valid & OBD_MD_FLFLAGS ?
oa->o_flags : 0);
- new_cksum = osc_checksum_bulk(aa->aa_requested_nob, aa->aa_page_count,
- aa->aa_ppga, OST_WRITE, cksum_type);
+ rc = osc_checksum_bulk(aa->aa_requested_nob, aa->aa_page_count,
+ aa->aa_ppga, OST_WRITE, cksum_type,
+ &new_cksum);
- if (cksum_type != cksum_type_unpack(aa->aa_oa->o_flags))
+ if (rc < 0)
+ msg = "failed to calculate the client write checksum";
+ else if (cksum_type != cksum_type_unpack(aa->aa_oa->o_flags))
msg = "the server did not use the checksum type specified in "
"the original request - likely a protocol problem";
else if (new_cksum == server_cksum)
cksum_type = cksum_type_unpack(body->oa.o_valid &OBD_MD_FLFLAGS?
body->oa.o_flags : 0);
- client_cksum = osc_checksum_bulk(rc, aa->aa_page_count,
- aa->aa_ppga, OST_READ,
- cksum_type);
-
+ rc = osc_checksum_bulk(rc, aa->aa_page_count, aa->aa_ppga,
+ OST_READ, cksum_type, &client_cksum);
+ if (rc < 0) {
+ CDEBUG(D_PAGE,
+ "failed to calculate checksum, rc = %d\n", rc);
+ GOTO(out, rc);
+ }
if (req->rq_bulk != NULL &&
peer->nid != req->rq_bulk->bd_sender) {
via = " via ";