1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "librbd/object_map/ResizeRequest.h"
5 #include "common/dout.h"
6 #include "common/errno.h"
7 #include "osdc/Striper.h"
8 #include "librbd/ImageCtx.h"
9 #include "librbd/ObjectMap.h"
10 #include "cls/lock/cls_lock_client.h"
12 #define dout_subsys ceph_subsys_rbd
14 #define dout_prefix *_dout << "librbd::object_map::ResizeRequest: "
17 namespace object_map
{
19 void ResizeRequest::resize(ceph::BitVector
<2> *object_map
, uint64_t num_objs
,
20 uint8_t default_state
) {
21 size_t orig_object_map_size
= object_map
->size();
22 object_map
->resize(num_objs
);
23 if (num_objs
> orig_object_map_size
) {
24 auto it
= object_map
->begin() + orig_object_map_size
;
25 auto end_it
= object_map
->begin() + num_objs
;
26 for (;it
!= end_it
; ++it
) {
32 void ResizeRequest::send() {
33 CephContext
*cct
= m_image_ctx
.cct
;
35 std::unique_lock l
{*m_object_map_lock
};
36 m_num_objs
= Striper::get_num_objects(m_image_ctx
.layout
, m_new_size
);
38 std::string
oid(ObjectMap
<>::object_map_name(m_image_ctx
.id
, m_snap_id
));
39 ldout(cct
, 5) << this << " resizing on-disk object map: "
40 << "ictx=" << &m_image_ctx
<< ", "
41 << "oid=" << oid
<< ", num_objs=" << m_num_objs
<< dendl
;
43 librados::ObjectWriteOperation op
;
44 if (m_snap_id
== CEPH_NOSNAP
) {
45 rados::cls::lock::assert_locked(&op
, RBD_LOCK_NAME
, LOCK_EXCLUSIVE
, "", "");
47 cls_client::object_map_resize(&op
, m_num_objs
, m_default_object_state
);
49 librados::AioCompletion
*rados_completion
= create_callback_completion();
50 int r
= m_image_ctx
.md_ctx
.aio_operate(oid
, rados_completion
, &op
);
52 rados_completion
->release();
55 void ResizeRequest::finish_request() {
56 CephContext
*cct
= m_image_ctx
.cct
;
57 ldout(cct
, 5) << this << " resizing in-memory object map: "
58 << m_num_objs
<< dendl
;
60 std::unique_lock object_map_locker
{*m_object_map_lock
};
61 resize(m_object_map
, m_num_objs
, m_default_object_state
);
64 } // namespace object_map