]>
git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/image/SetFlagsRequest.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/SetFlagsRequest.h"
5 #include "common/dout.h"
6 #include "common/errno.h"
7 #include "cls/rbd/cls_rbd_client.h"
8 #include "librbd/ImageCtx.h"
9 #include "librbd/Utils.h"
10 #include "include/assert.h"
12 #define dout_subsys ceph_subsys_rbd
14 #define dout_prefix *_dout << "librbd::image::SetFlagsRequest: "
19 using util::create_context_callback
;
20 using util::create_rados_callback
;
23 SetFlagsRequest
<I
>::SetFlagsRequest(I
*image_ctx
, uint64_t flags
,
24 uint64_t mask
, Context
*on_finish
)
25 : m_image_ctx(image_ctx
), m_flags(flags
), m_mask(mask
),
26 m_on_finish(on_finish
) {
30 void SetFlagsRequest
<I
>::send() {
35 void SetFlagsRequest
<I
>::send_set_flags() {
36 CephContext
*cct
= m_image_ctx
->cct
;
37 ldout(cct
, 20) << __func__
<< dendl
;
39 RWLock::WLocker
snap_locker(m_image_ctx
->snap_lock
);
40 std::vector
<uint64_t> snap_ids
;
41 snap_ids
.push_back(CEPH_NOSNAP
);
42 for (auto it
: m_image_ctx
->snap_info
) {
43 snap_ids
.push_back(it
.first
);
46 Context
*ctx
= create_context_callback
<
47 SetFlagsRequest
<I
>, &SetFlagsRequest
<I
>::handle_set_flags
>(this);
48 C_Gather
*gather_ctx
= new C_Gather(cct
, ctx
);
50 for (auto snap_id
: snap_ids
) {
51 librados::ObjectWriteOperation op
;
52 cls_client::set_flags(&op
, snap_id
, m_flags
, m_mask
);
54 librados::AioCompletion
*comp
=
55 create_rados_callback(gather_ctx
->new_sub());
56 int r
= m_image_ctx
->md_ctx
.aio_operate(m_image_ctx
->header_oid
, comp
, &op
);
60 gather_ctx
->activate();
64 Context
*SetFlagsRequest
<I
>::handle_set_flags(int *result
) {
65 CephContext
*cct
= m_image_ctx
->cct
;
66 ldout(cct
, 20) << __func__
<< ": r=" << *result
<< dendl
;
69 lderr(cct
) << "set_flags failed: " << cpp_strerror(*result
)
78 template class librbd::image::SetFlagsRequest
<librbd::ImageCtx
>;