]>
git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd_mirror/image_replayer/OpenImageRequest.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "OpenImageRequest.h"
5 #include "common/errno.h"
6 #include "librbd/ImageCtx.h"
7 #include "librbd/ImageState.h"
8 #include "librbd/Utils.h"
11 #define dout_context g_ceph_context
12 #define dout_subsys ceph_subsys_rbd_mirror
14 #define dout_prefix *_dout << "rbd::mirror::image_replayer::OpenImageRequest: " \
15 << this << " " << __func__ << " "
19 namespace image_replayer
{
21 using librbd::util::create_context_callback
;
24 OpenImageRequest
<I
>::OpenImageRequest(librados::IoCtx
&io_ctx
, I
**image_ctx
,
25 const std::string
&image_id
,
26 bool read_only
, Context
*on_finish
)
27 : m_io_ctx(io_ctx
), m_image_ctx(image_ctx
), m_image_id(image_id
),
28 m_read_only(read_only
), m_on_finish(on_finish
) {
32 void OpenImageRequest
<I
>::send() {
37 void OpenImageRequest
<I
>::send_open_image() {
40 *m_image_ctx
= I::create("", m_image_id
, nullptr, m_io_ctx
, m_read_only
);
42 Context
*ctx
= create_context_callback
<
43 OpenImageRequest
<I
>, &OpenImageRequest
<I
>::handle_open_image
>(
45 (*m_image_ctx
)->state
->open(false, ctx
);
49 void OpenImageRequest
<I
>::handle_open_image(int r
) {
50 dout(20) << ": r=" << r
<< dendl
;
53 derr
<< ": failed to open image '" << m_image_id
<< "': "
54 << cpp_strerror(r
) << dendl
;
55 (*m_image_ctx
)->destroy();
56 *m_image_ctx
= nullptr;
63 void OpenImageRequest
<I
>::finish(int r
) {
64 dout(20) << ": r=" << r
<< dendl
;
66 m_on_finish
->complete(r
);
70 } // namespace image_replayer
74 template class rbd::mirror::image_replayer::OpenImageRequest
<librbd::ImageCtx
>;