1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "librbd/operation/SnapshotProtectRequest.h"
5 #include "common/dout.h"
6 #include "common/errno.h"
7 #include "librbd/ImageCtx.h"
9 #define dout_subsys ceph_subsys_rbd
11 #define dout_prefix *_dout << "librbd::SnapshotProtectRequest: "
19 std::ostream
& operator<<(std::ostream
& os
,
20 const typename SnapshotProtectRequest
<I
>::State
& state
) {
22 case SnapshotProtectRequest
<I
>::STATE_PROTECT_SNAP
:
29 } // anonymous namespace
32 SnapshotProtectRequest
<I
>::SnapshotProtectRequest(I
&image_ctx
,
34 const cls::rbd::SnapshotNamespace
&snap_namespace
,
35 const std::string
&snap_name
)
36 : Request
<I
>(image_ctx
, on_finish
), m_snap_namespace(snap_namespace
),
37 m_snap_name(snap_name
), m_state(STATE_PROTECT_SNAP
) {
41 void SnapshotProtectRequest
<I
>::send_op() {
46 bool SnapshotProtectRequest
<I
>::should_complete(int r
) {
47 I
&image_ctx
= this->m_image_ctx
;
48 CephContext
*cct
= image_ctx
.cct
;
49 ldout(cct
, 5) << this << " " << __func__
<< ": state=" << m_state
<< ", "
50 << "r=" << r
<< dendl
;
53 ldout(cct
, 1) << "snapshot is already protected" << dendl
;
55 lderr(cct
) << "encountered error: " << cpp_strerror(r
) << dendl
;
62 void SnapshotProtectRequest
<I
>::send_protect_snap() {
63 I
&image_ctx
= this->m_image_ctx
;
64 ceph_assert(ceph_mutex_is_locked(image_ctx
.owner_lock
));
66 CephContext
*cct
= image_ctx
.cct
;
67 ldout(cct
, 5) << this << " " << __func__
<< dendl
;
69 int r
= verify_and_send_protect_snap();
71 this->async_complete(r
);
77 int SnapshotProtectRequest
<I
>::verify_and_send_protect_snap() {
78 I
&image_ctx
= this->m_image_ctx
;
79 std::shared_lock image_locker
{image_ctx
.image_lock
};
81 CephContext
*cct
= image_ctx
.cct
;
82 if ((image_ctx
.features
& RBD_FEATURE_LAYERING
) == 0) {
83 lderr(cct
) << "image must support layering" << dendl
;
87 uint64_t snap_id
= image_ctx
.get_snap_id(m_snap_namespace
, m_snap_name
);
88 if (snap_id
== CEPH_NOSNAP
) {
93 int r
= image_ctx
.is_snap_protected(snap_id
, &is_protected
);
102 librados::ObjectWriteOperation op
;
103 cls_client::set_protection_status(&op
, snap_id
,
104 RBD_PROTECTION_STATUS_PROTECTED
);
106 librados::AioCompletion
*rados_completion
=
107 this->create_callback_completion();
108 r
= image_ctx
.md_ctx
.aio_operate(image_ctx
.header_oid
, rados_completion
,
111 rados_completion
->release();
115 } // namespace operation
116 } // namespace librbd
118 template class librbd::operation::SnapshotProtectRequest
<librbd::ImageCtx
>;