assert(pending_count);
int count = --pending_count;
if (!count) {
+ ldout(cct, 20) << "AioCompletion::complete_request() rval " << rval << " read_buf " << (void*)read_buf
+ << " read_bl " << (void*)read_bl << dendl;
if (rval >= 0 && aio_type == AIO_TYPE_READ) {
// FIXME: make the destriper write directly into a buffer so
// that we avoid shuffling pointers and copying zeros around.
bufferlist bl;
destriper.assemble_result(bl, true);
- assert(bl.length() == read_buf_len);
- bl.copy(0, read_buf_len, read_buf);
- ldout(cct, 20) << "AioCompletion::complete_request() copied resulting " << bl.length()
- << " bytes to " << (void*)read_buf << dendl;
+ if (read_buf) {
+ assert(bl.length() == read_buf_len);
+ bl.copy(0, read_buf_len, read_buf);
+ ldout(cct, 20) << "AioCompletion::complete_request() copied resulting " << bl.length()
+ << " bytes to " << (void*)read_buf << dendl;
+ }
+ if (read_bl) {
+ ldout(cct, 20) << "AioCompletion::complete_request() moving resulting " << bl.length()
+ << " bytes to bl " << (void*)read_bl << dendl;
+ read_bl->claim(bl);
+ }
}
complete();
aio_type_t aio_type;
Filer::StripedReadResult destriper;
+ bufferlist *read_bl;
char *read_buf;
size_t read_buf_len;
complete_arg(NULL), rbd_comp(NULL), pending_count(1),
ref(1), released(false), ictx(NULL),
aio_type(AIO_TYPE_NONE),
- read_buf(NULL), read_buf_len(0) {
+ read_bl(NULL), read_buf(NULL), read_buf_len(0) {
}
~AioCompletion() {
}
assert(m_ictx->parent_lock.is_locked());
m_parent_completion = aio_create_completion_internal(this, rbd_req_cb);
- aio_read(m_ictx->parent, image_extents, m_read_data.c_str(),
+ aio_read(m_ictx->parent, image_extents, m_read_data.c_str(), NULL,
m_parent_completion);
}
uint64_t object_overlap = ictx->prune_parent_extents(objectx, overlap);
assert(object_overlap <= object_size);
- if ((r = read(ictx->parent, objectx, buf)) < 0) {
+ if ((r = read(ictx->parent, objectx, buf, NULL)) < 0) {
lderr(ictx->cct) << "reading from parent failed" << dendl;
goto err;
}
Context *ctx = new C_SafeCond(&mylock, &cond, &done, &ret);
AioCompletion *c = aio_create_completion_internal(ctx, rbd_ctx_cb);
- r = aio_read(ictx, off, read_len, bl.c_str(), c);
+ r = aio_read(ictx, off, read_len, bl.c_str(), NULL, c);
if (r < 0) {
c->release();
delete ctx;
return read_iterate(ictx, ofs, len, simple_read_cb, buf);
}
- ssize_t read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents, char *buf)
+ ssize_t read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents, char *buf, bufferlist *pbl)
{
Mutex mylock("IoCtxImpl::write::mylock");
Cond cond;
Context *ctx = new C_SafeCond(&mylock, &cond, &done, &ret);
AioCompletion *c = aio_create_completion_internal(ctx, rbd_ctx_cb);
- int r = aio_read(ictx, image_extents, buf, c);
+ int r = aio_read(ictx, image_extents, buf, pbl, c);
if (r < 0) {
c->release();
delete ctx;
}
int aio_read(ImageCtx *ictx, uint64_t off, size_t len,
- char *buf,
+ char *buf, bufferlist *bl,
AioCompletion *c)
{
vector<pair<uint64_t,uint64_t> > image_extents(1);
image_extents[0] = make_pair(off, len);
- return aio_read(ictx, image_extents, buf, c);
+ return aio_read(ictx, image_extents, buf, bl, c);
}
int aio_read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents,
- char *buf,
- AioCompletion *c)
+ char *buf, bufferlist *pbl, AioCompletion *c)
{
ldout(ictx->cct, 20) << "aio_read " << ictx << " " << image_extents << dendl;
c->read_buf = buf;
c->read_buf_len = buffer_ofs;
+ c->read_bl = pbl;
c->get();
c->init_time(ictx, AIO_TYPE_READ);
int (*cb)(uint64_t, size_t, const char *, void *),
void *arg);
ssize_t read(ImageCtx *ictx, uint64_t off, size_t len, char *buf);
- ssize_t read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents, char *buf);
+ ssize_t read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents,
+ char *buf, bufferlist *pbl);
ssize_t write(ImageCtx *ictx, uint64_t off, size_t len, const char *buf);
int discard(ImageCtx *ictx, uint64_t off, uint64_t len);
int aio_write(ImageCtx *ictx, uint64_t off, size_t len, const char *buf,
AioCompletion *c);
int aio_discard(ImageCtx *ictx, uint64_t off, uint64_t len, AioCompletion *c);
int aio_read(ImageCtx *ictx, uint64_t off, size_t len,
- char *buf, AioCompletion *c);
+ char *buf, bufferlist *pbl, AioCompletion *c);
int aio_read(ImageCtx *ictx, const vector<pair<uint64_t,uint64_t> >& image_extents,
- char *buf,
- AioCompletion *c);
+ char *buf, bufferlist *pbl, AioCompletion *c);
int flush(ImageCtx *ictx);
int _flush(ImageCtx *ictx);
bl.push_back(ptr);
ldout(ictx->cct, 10) << "Image::aio_read() buf=" << (void *)bl.c_str() << "~"
<< (void *)(bl.c_str() + len - 1) << dendl;
- return librbd::aio_read(ictx, off, len, bl.c_str(), (librbd::AioCompletion *)c->pc);
+ return librbd::aio_read(ictx, off, len, bl.c_str(), NULL, (librbd::AioCompletion *)c->pc);
}
int Image::flush()
{
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c;
- return librbd::aio_read(ictx, off, len, buf,
+ return librbd::aio_read(ictx, off, len, buf, NULL,
(librbd::AioCompletion *)comp->pc);
}