}
out:
+ assert(allow_eio || r != -EIO);
c->cache->trim(
g_conf->bluestore_onode_cache_size,
g_conf->bluestore_buffer_cache_size);
if (bptr->get_blob().has_flag(bluestore_blob_t::FLAG_COMPRESSED)) {
bufferlist compressed_bl, raw_bl;
IOContext ioc(NULL); // FIXME?
- bptr->get_blob().map(
+ r = bptr->get_blob().map(
0, bptr->get_blob().get_ondisk_length(),
[&](uint64_t offset, uint64_t length) {
bufferlist t;
int r = bdev->read(offset, length, &t, &ioc, false);
- assert(r == 0);
+ if (r < 0)
+ return r;
compressed_bl.claim_append(t);
+ return 0;
});
+ if (r < 0)
+ return r;
+
if (_verify_csum(o, &bptr->get_blob(), 0, compressed_bl) < 0) {
return -EIO;
}
// read it
IOContext ioc(NULL); // FIXME?
bufferlist bl;
- bptr->get_blob().map(r_off, r_len,
+ r = bptr->get_blob().map(r_off, r_len,
[&](uint64_t offset, uint64_t length) {
bufferlist t;
int r = bdev->read(offset, length, &t, &ioc, false);
- assert(r == 0);
+ if (r < 0)
+ return r;
bl.claim_append(t);
+ return 0;
});
- int r = _verify_csum(o, &bptr->get_blob(), r_off, bl);
+ if (r < 0)
+ return r;
+
+ r = _verify_csum(o, &bptr->get_blob(), r_off, bl);
if (r < 0) {
return -EIO;
}
if (r < 0) {
if (r == -1) {
vector<bluestore_pextent_t> pex;
- blob->map(
+ int r = blob->map(
bad,
blob->get_csum_chunk_size(),
[&](uint64_t offset, uint64_t length) {
pex.emplace_back(bluestore_pextent_t(offset, length));
+ return 0;
});
+ assert(r == 0);
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
_buffer_cache_write(txc, b, b_off, padded,
wctx->buffered ? 0 : Buffer::FLAG_NOCACHE);
- b->get_blob().map(
+ int r = b->get_blob().map(
b_off, b_len,
[&](uint64_t offset, uint64_t length) {
op->extents.emplace_back(bluestore_pextent_t(offset, length));
+ return 0;
});
+ assert(r == 0);
if (b->get_blob().csum_type) {
txc->add_deferred_csum(o, blob, b_off, padded);
}
uint64_t offset, uint64_t length, uint64_t min_alloc_size,
vector<bluestore_pextent_t> *r);
- void map(uint64_t x_off, uint64_t x_len,
- std::function<void(uint64_t,uint64_t)> f) const {
+ int map(uint64_t x_off, uint64_t x_len,
+ std::function<int(uint64_t,uint64_t)> f) const {
auto p = extents.begin();
assert(p != extents.end());
while (x_off >= p->length) {
while (x_len > 0) {
assert(p != extents.end());
uint64_t l = MIN(p->length - x_off, x_len);
- f(p->offset + x_off, l);
+ int r = f(p->offset + x_off, l);
+ if (r < 0)
+ return r;
x_off = 0;
x_len -= l;
++p;
}
+ return 0;
}
void map_bl(uint64_t x_off,
bufferlist& bl,