]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: delete ExclusiveLock instance when switching to snapshot 9896/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 23 Jun 2016 13:23:32 +0000 (09:23 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 23 Jun 2016 13:23:32 +0000 (09:23 -0400)
Fixes: http://tracker.ceph.com/issues/16446
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/image/SetSnapRequest.cc

index 44da6730bd7ba503da8bfa1549a4988e63723d88..e00ebeb4ac6b3cf418cc6b3d3e9a7dd67efb876f 100644 (file)
@@ -136,13 +136,12 @@ Context *SetSnapRequest<I>::handle_block_writes(int *result) {
 
 template <typename I>
 Context *SetSnapRequest<I>::send_shut_down_exclusive_lock(int *result) {
-  ExclusiveLock<I> *exclusive_lock;
   {
     RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
-    exclusive_lock = m_image_ctx.exclusive_lock;
+    m_exclusive_lock = m_image_ctx.exclusive_lock;
   }
 
-  if (exclusive_lock == nullptr) {
+  if (m_exclusive_lock == nullptr) {
     return send_refresh_parent(result);
   }
 
@@ -152,7 +151,7 @@ Context *SetSnapRequest<I>::send_shut_down_exclusive_lock(int *result) {
   using klass = SetSnapRequest<I>;
   Context *ctx = create_context_callback<
     klass, &klass::handle_shut_down_exclusive_lock>(this);
-  exclusive_lock->shut_down(ctx);
+  m_exclusive_lock->shut_down(ctx);
   return nullptr;
 }
 
@@ -327,11 +326,13 @@ int SetSnapRequest<I>::apply() {
   RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
   RWLock::WLocker parent_locker(m_image_ctx.parent_lock);
   if (m_snap_id != CEPH_NOSNAP) {
+    assert(m_image_ctx.exclusive_lock == nullptr);
     int r = m_image_ctx.snap_set(m_snap_name);
     if (r < 0) {
       return r;
     }
   } else {
+    std::swap(m_image_ctx.exclusive_lock, m_exclusive_lock);
     m_image_ctx.snap_unset();
   }
 
@@ -339,7 +340,6 @@ int SetSnapRequest<I>::apply() {
     m_refresh_parent->apply();
   }
 
-  std::swap(m_exclusive_lock, m_image_ctx.exclusive_lock);
   std::swap(m_object_map, m_image_ctx.object_map);
   return 0;
 }