]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix object deep copy for case when update object map skipped 21586/head
authorMykola Golub <mgolub@suse.com>
Mon, 23 Apr 2018 14:19:15 +0000 (17:19 +0300)
committerMykola Golub <mgolub@suse.com>
Tue, 24 Apr 2018 06:55:22 +0000 (09:55 +0300)
* avoid potential recursive lock;
* release lock_op.

Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/deep_copy/ObjectCopyRequest.cc

index 97d4e32f1227d537d675d0a3510640d057ada3af..bd83ebfae8ce9b712611cd2c65da717ad91c4328 100644 (file)
@@ -374,15 +374,16 @@ void ObjectCopyRequest<I>::send_update_object_map() {
       finish_op_ctx->complete(0);
     });
 
-  RWLock::WLocker object_map_locker(m_dst_image_ctx->object_map_lock);
+  m_dst_image_ctx->object_map_lock.get_write();
   bool sent = m_dst_image_ctx->object_map->template aio_update<
     Context, &Context::complete>(dst_snap_id, m_dst_object_number, object_state,
                                  {}, {}, ctx);
+  m_dst_image_ctx->object_map_lock.put_write();
   m_dst_image_ctx->snap_lock.put_read();
   m_dst_image_ctx->owner_lock.put_read();
   if (!sent) {
     assert(dst_snap_id == CEPH_NOSNAP);
-    handle_update_object_map(0);
+    ctx->complete(0);
   }
 }