this, NULL, rados_ctx_cb);
librados::ObjectReadOperation op;
- op.assert_exists();
- int r = m_image_ctx.data_ctx.aio_operate(m_oid, comp, &op, NULL);
+ op.list_snaps(&m_snap_set, &m_snap_list_ret);
+
+ int r = m_io_ctx.aio_operate(m_oid, comp, &op, NULL);
assert(r == 0);
+ comp->release();
}
- bool update_object_map(bool exists) {
+ uint8_t get_object_state() {
+ RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+ for (std::vector<librados::clone_info_t>::const_iterator r =
+ m_snap_set.clones.begin(); r != m_snap_set.clones.end(); ++r) {
+ librados::snap_t from_snap_id;
+ librados::snap_t to_snap_id;
+ if (r->cloneid == librados::SNAP_HEAD) {
+ from_snap_id = next_valid_snap_id(m_snap_set.seq + 1);
+ to_snap_id = librados::SNAP_HEAD;
+ } else {
+ from_snap_id = next_valid_snap_id(r->snaps[0]);
+ to_snap_id = r->snaps[r->snaps.size()-1];
+ }
+
+ if (to_snap_id < m_snap_id) {
+ continue;
+ } else if (m_snap_id < from_snap_id) {
+ break;
+ }
+
+ RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+ if ((m_image_ctx.features & RBD_FEATURE_FAST_DIFF) != 0 &&
+ from_snap_id != m_snap_id) {
+ return OBJECT_EXISTS_CLEAN;
+ }
+ return OBJECT_EXISTS;
+ }
+ return OBJECT_NONEXISTENT;
+ }
+
+ uint64_t next_valid_snap_id(uint64_t snap_id) {
+ assert(m_image_ctx.snap_lock.is_locked());
+
+ std::map<librados::snap_t, SnapInfo>::iterator it =
+ m_image_ctx.snap_info.lower_bound(snap_id);
+ if (it == m_image_ctx.snap_info.end()) {
+ return CEPH_NOSNAP;
+ }
+ return it->first;
+ }
+
+ bool update_object_map(uint8_t new_state) {
CephContext *cct = m_image_ctx.cct;
bool lost_exclusive_lock = false;
if (m_image_ctx.image_watcher->is_lock_supported()) {
m_image_ctx.image_watcher->assert_header_locked(&op);
}
- cls_client::set_flags(&op, m_image_ctx.snap_id, 0,
- RBD_FLAG_OBJECT_MAP_INVALID);
+ cls_client::set_flags(&op, m_image_ctx.snap_id, 0, flags);
- int r = m_image_ctx.md_ctx.aio_operate(m_image_ctx.header_oid,
- create_callback_completion(), &op);
+ librados::AioCompletion *comp = create_callback_completion();
+ int r = m_image_ctx.md_ctx.aio_operate(m_image_ctx.header_oid, comp, &op);
assert(r == 0);
+ comp->release();
RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
- m_image_ctx.update_flags(m_image_ctx.snap_id, RBD_FLAG_OBJECT_MAP_INVALID,
- false);
+ m_image_ctx.update_flags(m_image_ctx.snap_id, flags, false);
return false;
}
}