const bufferlist& bl) const
{
int bad;
- int r = csum_type != bluestore_blob_t::CSUM_NONE ? blob->verify_csum(blob_xoffset, bl, &bad) :0;
+ uint64_t bad_csum;
+ int r = csum_type != bluestore_blob_t::CSUM_NONE ?
+ blob->verify_csum(blob_xoffset, bl, &bad, &bad_csum) :0;
if (r < 0) {
if (r == -1) {
vector<bluestore_pextent_t> pex;
blob->map(
- blob_xoffset,
+ bad,
blob->get_csum_chunk_size(),
[&](uint64_t offset, uint64_t length) {
pex.emplace_back(bluestore_pextent_t(offset, length));
});
derr << __func__ << " bad " << blob->get_csum_type_string(blob->csum_type)
<< "/0x" << std::hex << blob->get_csum_chunk_size()
- << " checksum at blob offset 0x" << bad << std::dec
+ << " checksum at blob offset 0x" << bad
+ << ", got 0x" << bad_csum << ", expected 0x"
+ << blob->get_csum_item(bad / blob->get_csum_chunk_size()) << std::dec
<< ", device location " << pex
<< ", object " << o->oid << dendl;
} else {
}
int bluestore_blob_t::verify_csum(uint64_t b_off, const bufferlist& bl,
- int* b_bad_off) const
+ int* b_bad_off, uint64_t *bad_csum) const
{
int r = 0;
break;
case CSUM_XXHASH32:
*b_bad_off = Checksummer::verify<Checksummer::xxhash32>(
- get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum);
break;
case CSUM_XXHASH64:
*b_bad_off = Checksummer::verify<Checksummer::xxhash64>(
- get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum);
break;
case CSUM_CRC32C:
*b_bad_off = Checksummer::verify<Checksummer::crc32c>(
- get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum);
break;
case CSUM_CRC32C_16:
*b_bad_off = Checksummer::verify<Checksummer::crc32c_16>(
- get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum);
break;
case CSUM_CRC32C_8:
*b_bad_off = Checksummer::verify<Checksummer::crc32c_8>(
- get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum);
break;
default:
r = -EOPNOTSUPP;
bluestore_blob_t b;
int bad_off;
- ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off));
+ uint64_t bad_csum;
+ ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off, &bad_csum));
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(0, b.verify_csum(0, bl, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
- ASSERT_EQ(-1, b.verify_csum(0, bl2, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(0, bl2, &bad_off, &bad_csum));
ASSERT_EQ(0, bad_off);
- ASSERT_EQ(0, b.verify_csum(0, f, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(0, f, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
- ASSERT_EQ(-1, b.verify_csum(8, f, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(8, f, &bad_off, &bad_csum));
ASSERT_EQ(8, bad_off);
- ASSERT_EQ(-1, b.verify_csum(16, f, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(16, f, &bad_off, &bad_csum));
ASSERT_EQ(16, bad_off);
- ASSERT_EQ(-1, b.verify_csum(0, m, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(0, m, &bad_off, &bad_csum));
ASSERT_EQ(0, bad_off);
- ASSERT_EQ(0, b.verify_csum(8, m, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(8, m, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
- ASSERT_EQ(-1, b.verify_csum(16, m, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(16, m, &bad_off, &bad_csum));
ASSERT_EQ(16, bad_off);
- ASSERT_EQ(-1, b.verify_csum(0, e, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(0, e, &bad_off, &bad_csum));
ASSERT_EQ(0, bad_off);
- ASSERT_EQ(-1, b.verify_csum(8, e, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(8, e, &bad_off, &bad_csum));
ASSERT_EQ(8, bad_off);
- ASSERT_EQ(0, b.verify_csum(16, e, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(16, e, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
b.calc_csum(8, n);
- ASSERT_EQ(0, b.verify_csum(0, f, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(0, f, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
- ASSERT_EQ(0, b.verify_csum(8, n, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(8, n, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
- ASSERT_EQ(0, b.verify_csum(16, e, &bad_off));
+ ASSERT_EQ(0, b.verify_csum(16, e, &bad_off, &bad_csum));
ASSERT_EQ(-1, bad_off);
- ASSERT_EQ(-1, b.verify_csum(0, bl, &bad_off));
+ ASSERT_EQ(-1, b.verify_csum(0, bl, &bad_off, &bad_csum));
ASSERT_EQ(8, bad_off);
}
}