From: Josh Durgin Date: Wed, 25 Feb 2015 22:34:15 +0000 (-0800) Subject: librbd: remove object map on rollback if needed X-Git-Tag: v0.93~6^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=876f128f8b2d3bfa4670e45320e5827e6710cbd9;p=ceph.git librbd: remove object map on rollback if needed When rolling back to a snapshot that did not have object map enabled, delete the head object map. Signed-off-by: Josh Durgin --- diff --git a/src/librbd/ObjectMap.cc b/src/librbd/ObjectMap.cc index 9a277cad71a..51421391b9d 100644 --- a/src/librbd/ObjectMap.cc +++ b/src/librbd/ObjectMap.cc @@ -188,15 +188,23 @@ void ObjectMap::refresh(uint64_t snap_id) void ObjectMap::rollback(uint64_t snap_id) { assert(m_image_ctx.snap_lock.is_wlocked()); + int r; + std::string oid(object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + + CephContext *cct = m_image_ctx.cct; + ldout(cct, 10) << &m_image_ctx << " rollback object map" << dendl; + uint64_t features; m_image_ctx.get_features(snap_id, &features); if ((features & RBD_FEATURE_OBJECT_MAP) == 0) { + r = m_image_ctx.md_ctx.remove(oid); + if (r < 0 && r != -ENOENT) { + lderr(cct) << "unable to remove object map: " << cpp_strerror(r) + << dendl; + } return; } - CephContext *cct = m_image_ctx.cct; - ldout(cct, 10) << &m_image_ctx << " rollback object map" << dendl; - RWLock::WLocker l(m_image_ctx.object_map_lock); if (!m_enabled) { return; @@ -204,7 +212,7 @@ void ObjectMap::rollback(uint64_t snap_id) { std::string snap_oid(object_map_name(m_image_ctx.id, snap_id)); bufferlist bl; - int r = m_image_ctx.md_ctx.read(snap_oid, bl, 0, 0); + r = m_image_ctx.md_ctx.read(snap_oid, bl, 0, 0); if (r < 0) { lderr(cct) << "unable to load snapshot object map '" << snap_oid << "': " << cpp_strerror(r) << dendl; @@ -216,7 +224,6 @@ void ObjectMap::rollback(uint64_t snap_id) { rados::cls::lock::assert_locked(&op, RBD_LOCK_NAME, LOCK_EXCLUSIVE, "", ""); op.write_full(bl); - std::string oid(object_map_name(m_image_ctx.id, CEPH_NOSNAP)); r = m_image_ctx.md_ctx.operate(oid, &op); if (r < 0) { lderr(cct) << "unable to rollback object map: " << cpp_strerror(r)