}
}
-int bluestore_blob_t::verify_csum(uint64_t b_off, const bufferlist& bl) const
+int bluestore_blob_t::verify_csum(uint64_t b_off, const bufferlist& bl,
+ int* b_bad_off) const
{
+ int r = 0;
+
+ *b_bad_off = -1;
switch (csum_type) {
case CSUM_NONE:
- return -1;
+ break;
case CSUM_XXHASH32:
- return Checksummer::verify<Checksummer::xxhash32>(
+ *b_bad_off = Checksummer::verify<Checksummer::xxhash32>(
get_csum_block_size(), b_off, bl.length(), bl, csum_data);
+ break;
case CSUM_XXHASH64:
- return Checksummer::verify<Checksummer::xxhash64>(
+ *b_bad_off = Checksummer::verify<Checksummer::xxhash64>(
get_csum_block_size(), b_off, bl.length(), bl, csum_data);
+ break;
case CSUM_CRC32C:
- return Checksummer::verify<Checksummer::crc32c>(
+ *b_bad_off = Checksummer::verify<Checksummer::crc32c>(
get_csum_block_size(), b_off, bl.length(), bl, csum_data);
+ break;
default:
- return -EOPNOTSUPP;
+ r = -EOPNOTSUPP;
+ break;
}
+
+ if (r < 0)
+ return r;
+ else if (*b_bad_off >= 0)
+ return -1; // bad checksum
+ else
+ return 0;
}
// bluestore_lextent_t
<< std::endl;
bluestore_blob_t b;
- ASSERT_EQ(-1, b.verify_csum(0, bl));
+ int bad_off;
+ ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off));
+ ASSERT_EQ(-1, bad_off);
b.init_csum(csum_type, 3, 24);
cout << " value size " << b.get_csum_value_size() << std::endl;
b.calc_csum(0, bl);
- ASSERT_EQ(-1, b.verify_csum(0, bl));
- ASSERT_EQ(0, b.verify_csum(0, bl2));
-
- ASSERT_EQ(-1, b.verify_csum(0, f));
- ASSERT_EQ(8, b.verify_csum(8, f));
- ASSERT_EQ(16, b.verify_csum(16, f));
-
- ASSERT_EQ(0, b.verify_csum(0, m));
- ASSERT_EQ(-1, b.verify_csum(8, m));
- ASSERT_EQ(16, b.verify_csum(16, m));
-
- ASSERT_EQ(0, b.verify_csum(0, e));
- ASSERT_EQ(8, b.verify_csum(8, e));
- ASSERT_EQ(-1, b.verify_csum(16, e));
+ ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off));
+ ASSERT_EQ(-1, bad_off);
+ ASSERT_EQ(-1, b.verify_csum(0, bl2, &bad_off));
+ ASSERT_EQ(0, bad_off);
+
+ ASSERT_EQ(0, b.verify_csum(0, f, &bad_off));
+ ASSERT_EQ(-1, bad_off);
+ ASSERT_EQ(-1, b.verify_csum(8, f, &bad_off));
+ ASSERT_EQ(8, bad_off);
+ ASSERT_EQ(-1, b.verify_csum(16, f, &bad_off));
+ ASSERT_EQ(16, bad_off);
+
+ ASSERT_EQ(-1, b.verify_csum(0, m, &bad_off));
+ ASSERT_EQ(0, bad_off);
+ ASSERT_EQ(0, b.verify_csum(8, m, &bad_off));
+ ASSERT_EQ(-1, bad_off);
+ ASSERT_EQ(-1, b.verify_csum(16, m, &bad_off));
+ ASSERT_EQ(16, bad_off);
+
+ ASSERT_EQ(-1, b.verify_csum(0, e, &bad_off));
+ ASSERT_EQ(0, bad_off);
+ ASSERT_EQ(-1, b.verify_csum(8, e, &bad_off));
+ ASSERT_EQ(8, bad_off);
+ ASSERT_EQ(0, b.verify_csum(16, e, &bad_off));
+ ASSERT_EQ(-1, bad_off);
b.calc_csum(8, n);
- ASSERT_EQ(-1, b.verify_csum(0, f));
- ASSERT_EQ(-1, b.verify_csum(8, n));
- ASSERT_EQ(-1, b.verify_csum(16, e));
- ASSERT_EQ(8, b.verify_csum(0, bl));
+ ASSERT_EQ(0, b.verify_csum(0, f, &bad_off));
+ ASSERT_EQ(-1, bad_off);
+ ASSERT_EQ(0, b.verify_csum(8, n, &bad_off));
+ ASSERT_EQ(-1, bad_off);
+ ASSERT_EQ(0, b.verify_csum(16, e, &bad_off));
+ ASSERT_EQ(-1, bad_off);
+ ASSERT_EQ(-1, b.verify_csum(0, bl, &bad_off));
+ ASSERT_EQ(8, bad_off);
}
}