#endif
#define RBD_FLAG_OBJECT_MAP_INVALID (1<<0)
+#define RBD_FLAG_FAST_DIFF_INVALID (1<<1)
typedef void *rbd_snap_t;
typedef void *rbd_image_t;
return;
}
+ flags = RBD_FLAG_OBJECT_MAP_INVALID;
+ if ((m_image_ctx.features & RBD_FEATURE_FAST_DIFF) != 0) {
+ flags |= RBD_FLAG_FAST_DIFF_INVALID;
+ }
+
CephContext *cct = m_image_ctx.cct;
lderr(cct) << &m_image_ctx << " invalidating object map" << dendl;
- int r = m_image_ctx.update_flags(snap_id, RBD_FLAG_OBJECT_MAP_INVALID, true);
+ int r = m_image_ctx.update_flags(snap_id, flags, true);
if (r < 0) {
lderr(cct) << "failed to invalidate in-memory object map: "
<< cpp_strerror(r) << dendl;
}
librados::ObjectWriteOperation op;
- cls_client::set_flags(&op, snap_id, m_image_ctx.flags,
- RBD_FLAG_OBJECT_MAP_INVALID);
+ cls_client::set_flags(&op, snap_id, flags, flags);
r = m_image_ctx.md_ctx.operate(m_image_ctx.header_oid, &op);
if (r < 0) {
// requests shouldn't be running while using snapshots
assert(m_image_ctx.snap_id == CEPH_NOSNAP);
+ uint64_t flags = RBD_FLAG_OBJECT_MAP_INVALID;
+ if ((m_image_ctx.features & RBD_FEATURE_FAST_DIFF) != 0) {
+ flags |= RBD_FLAG_FAST_DIFF_INVALID;
+ }
+
lderr(cct) << &m_image_ctx << " invalidating object map" << dendl;
m_state = STATE_INVALIDATE;
- m_image_ctx.flags |= RBD_FLAG_OBJECT_MAP_INVALID;
+ m_image_ctx.flags |= flags;
librados::ObjectWriteOperation op;
- cls_client::set_flags(&op, CEPH_NOSNAP, m_image_ctx.flags,
- RBD_FLAG_OBJECT_MAP_INVALID);
+ cls_client::set_flags(&op, CEPH_NOSNAP, flags, flags);
librados::AioCompletion *rados_completion = create_callback_completion();
int r = m_image_ctx.md_ctx.aio_operate(m_image_ctx.header_oid,
} else {
ldout(cct, 5) << this << " send_update_header" << dendl;
+ uint64_t flags = RBD_FLAG_OBJECT_MAP_INVALID | RBD_FLAG_FAST_DIFF_INVALID;
+
librados::ObjectWriteOperation op;
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);
assert(r == 0);
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;
}
}
lderr(cct) << "diff_object_map: failed to retrieve image flags" << dendl;
return r;
}
- if ((flags & RBD_FLAG_OBJECT_MAP_INVALID) != 0) {
+ if ((flags & RBD_FLAG_FAST_DIFF_INVALID) != 0) {
ldout(cct, 1) << "diff_object_map: cannot perform fast diff on invalid "
<< "object map" << dendl;
return -EINVAL;
<< "disabling object map optimizations"
<< dendl;
ictx->flags = RBD_FLAG_OBJECT_MAP_INVALID;
+ if ((ictx->features & RBD_FEATURE_FAST_DIFF) != 0) {
+ ictx->flags |= RBD_FLAG_FAST_DIFF_INVALID;
+ }
vector<uint64_t> default_flags(new_snapc.snaps.size(), ictx->flags);
snap_flags.swap(default_flags);
static void format_flags(Formatter *f, uint64_t flags)
{
std::map<uint64_t, std::string> mapping = boost::assign::map_list_of(
- RBD_FLAG_OBJECT_MAP_INVALID, "object map invalid");
+ RBD_FLAG_OBJECT_MAP_INVALID, "object map invalid")(
+ RBD_FLAG_FAST_DIFF_INVALID, "fast diff invalid");
format_bitmask(f, "flag", mapping, flags);
}