From 1217a4dd7539bdc149f6ead13654eaa672506d80 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Mon, 23 Apr 2018 17:19:15 +0300 Subject: [PATCH] librbd: fix object deep copy for case when update object map skipped * avoid potential recursive lock; * release lock_op. Signed-off-by: Mykola Golub --- src/librbd/deep_copy/ObjectCopyRequest.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 97d4e32f122..bd83ebfae8c 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); } } -- 2.39.5