From: Mykola Golub Date: Mon, 23 Apr 2018 14:19:15 +0000 (+0300) Subject: librbd: fix object deep copy for case when update object map skipped X-Git-Tag: v13.1.0~69^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F21586%2Fhead;p=ceph.git librbd: fix object deep copy for case when update object map skipped * avoid potential recursive lock; * release lock_op. Signed-off-by: Mykola Golub --- diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 97d4e32f1227..bd83ebfae8ce 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -374,15 +374,16 @@ void ObjectCopyRequest::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); } }