]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: remove object map on rollback if needed
authorJosh Durgin <jdurgin@redhat.com>
Wed, 25 Feb 2015 22:34:15 +0000 (14:34 -0800)
committerJosh Durgin <jdurgin@redhat.com>
Thu, 26 Feb 2015 01:27:34 +0000 (17:27 -0800)
When rolling back to a snapshot that did not have object map enabled,
delete the head object map.

Signed-off-by: Josh Durgin <jdurgin@redhat.com>
src/librbd/ObjectMap.cc

index 9a277cad71a55275fc3a2a20fd7fddff5ddf8a50..51421391b9db8e2aacd65467905cb6affa0e4dfd 100644 (file)
@@ -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)