bool finished = false;
switch (m_state) {
case STATE_LOAD_MAP:
+ if (r == 0) {
+ bufferlist::iterator it = m_out_bl.begin();
+ r = cls_client::object_map_load_finish(&it, &m_snap_object_map);
+ }
if (r < 0) {
RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
send_invalidate_next_map();
<< dendl;
m_state = STATE_LOAD_MAP;
- cls_client::object_map_load(&m_image_ctx.md_ctx, snap_oid,
- &m_snap_object_map, create_callback_context());
+ librados::ObjectReadOperation op;
+ cls_client::object_map_load_start(&op);
+
+ librados::AioCompletion *rados_completion = create_callback_completion();
+ int r = m_image_ctx.md_ctx.aio_operate(snap_oid, rados_completion, &op,
+ &m_out_bl);
+ assert(r == 0);
+ rados_completion->release();
}
void SnapshotRemoveRequest::send_remove_snapshot() {
#define CEPH_LIBRBD_OBJECT_MAP_SNAPSHOT_REMOVE_REQUEST_H
#include "include/int_types.h"
+#include "include/buffer.h"
#include "common/bit_vector.hpp"
#include "librbd/AsyncRequest.h"
uint64_t m_next_snap_id;
ceph::BitVector<2> m_snap_object_map;
+ bufferlist m_out_bl;
void send_load_map();
void send_remove_snapshot();
#include "librbd/ImageCtx.h"
#include "librbd/internal.h"
#include "librbd/parent_types.h"
+#include "librbd/Utils.h"
#include <list>
#include <set>
#include <vector>
return r;
}
- cls_client::get_children(&m_pool_ioctx, RBD_CHILDREN, m_pspec, &m_children,
- this);
+ librados::ObjectReadOperation op;
+ cls_client::get_children_start(&op, m_pspec);
+
+ librados::AioCompletion *rados_completion =
+ util::create_rados_ack_callback(this);
+ r = m_pool_ioctx.aio_operate(RBD_CHILDREN, rados_completion, &op,
+ &m_children_bl);
+ assert(r == 0);
+ rados_completion->release();
return 0;
}
virtual void finish(int r) {
I &image_ctx = this->m_image_ctx;
CephContext *cct = image_ctx.cct;
- ldout(cct, 10) << this << " retrieved children: r=" << r << dendl;
+ if (r == 0) {
+ bufferlist::iterator it = m_children_bl.begin();
+ r= cls_client::get_children_finish(&it, &m_children);
+ }
+
+ ldout(cct, 10) << this << " retrieved children: r=" << r << dendl;
if (r == -ENOENT) {
// no children -- proceed with unprotect
r = 0;