]>
git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/image/DetachParentRequest.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "librbd/image/DetachParentRequest.h"
5 #include "common/dout.h"
6 #include "common/errno.h"
7 #include "common/WorkQueue.h"
8 #include "cls/rbd/cls_rbd_client.h"
9 #include "librbd/ImageCtx.h"
10 #include "librbd/Utils.h"
12 #define dout_subsys ceph_subsys_rbd
14 #define dout_prefix *_dout << "librbd::image::DetachParentRequest: " << this \
15 << " " << __func__ << ": "
20 using util::create_context_callback
;
21 using util::create_rados_callback
;
24 void DetachParentRequest
<I
>::send() {
29 void DetachParentRequest
<I
>::detach_parent() {
30 auto cct
= m_image_ctx
.cct
;
31 ldout(cct
, 5) << dendl
;
33 librados::ObjectWriteOperation op
;
34 if (!m_legacy_parent
) {
35 librbd::cls_client::parent_detach(&op
);
37 librbd::cls_client::remove_parent(&op
);
40 auto aio_comp
= create_rados_callback
<
41 DetachParentRequest
<I
>,
42 &DetachParentRequest
<I
>::handle_detach_parent
>(this);
43 int r
= m_image_ctx
.md_ctx
.aio_operate(m_image_ctx
.header_oid
, aio_comp
, &op
);
49 void DetachParentRequest
<I
>::handle_detach_parent(int r
) {
50 auto cct
= m_image_ctx
.cct
;
51 ldout(cct
, 5) << dendl
;
53 if (!m_legacy_parent
&& r
== -EOPNOTSUPP
) {
54 ldout(cct
, 10) << "retrying using legacy parent method" << dendl
;
55 m_legacy_parent
= true;
60 if (r
< 0 && r
!= -ENOENT
) {
61 lderr(cct
) << "detach parent encountered an error: " << cpp_strerror(r
)
71 void DetachParentRequest
<I
>::finish(int r
) {
72 auto cct
= m_image_ctx
.cct
;
73 ldout(cct
, 5) << "r=" << r
<< dendl
;
75 m_on_finish
->complete(r
);
82 template class librbd::image::DetachParentRequest
<librbd::ImageCtx
>;