} else {
// read into a buffer
bufferlist bl;
- int total_read = 0;
+ uint32_t total_read = 0;
int r = osd->store->fiemap(coll, ghobject_t(soid, ghobject_t::NO_GEN,
info.pgid.shard),
op.extent.offset, op.extent.length, bl);
break;
}
+ // Why SPARSE_READ need checksum? In fact, librbd always use sparse-read.
+ // Maybe at first, there is no much whole objects. With continued use, more and more whole object exist.
+ // So from this point, for spare-read add checksum make sense.
+ if (total_read == oi.size && oi.is_data_digest()) {
+ uint32_t crc = data_bl.crc32c(-1);
+ if (oi.data_digest != crc) {
+ osd->clog->error() << info.pgid << std::hex
+ << " full-object read crc 0x" << crc
+ << " != expected 0x" << oi.data_digest
+ << std::dec << " on " << soid;
+ // FIXME fall back to replica or something?
+ result = -EIO;
+ break;
+ }
+ }
+
op.extent.length = total_read;
::encode(m, osd_op.outdata); // re-encode since it might be modified