]>
git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/object_map/ResizeRequest.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/object_map/ResizeRequest.h"
5 #include "common/dout.h"
6 #include "common/errno.h"
7 #include "librbd/ImageCtx.h"
8 #include "librbd/ObjectMap.h"
9 #include "cls/lock/cls_lock_client.h"
11 #define dout_subsys ceph_subsys_rbd
13 #define dout_prefix *_dout << "librbd::object_map::ResizeRequest: "
16 namespace object_map
{
18 void ResizeRequest::resize(ceph::BitVector
<2> *object_map
, uint64_t num_objs
,
19 uint8_t default_state
) {
20 size_t orig_object_map_size
= object_map
->size();
21 object_map
->resize(num_objs
);
22 for (uint64_t i
= orig_object_map_size
; i
< object_map
->size(); ++i
) {
23 (*object_map
)[i
] = default_state
;
27 void ResizeRequest::send() {
28 CephContext
*cct
= m_image_ctx
.cct
;
30 RWLock::WLocker
l(m_image_ctx
.object_map_lock
);
31 m_num_objs
= Striper::get_num_objects(m_image_ctx
.layout
, m_new_size
);
33 std::string
oid(ObjectMap
<>::object_map_name(m_image_ctx
.id
, m_snap_id
));
34 ldout(cct
, 5) << this << " resizing on-disk object map: "
35 << "ictx=" << &m_image_ctx
<< ", "
36 << "oid=" << oid
<< ", num_objs=" << m_num_objs
<< dendl
;
38 librados::ObjectWriteOperation op
;
39 if (m_snap_id
== CEPH_NOSNAP
) {
40 rados::cls::lock::assert_locked(&op
, RBD_LOCK_NAME
, LOCK_EXCLUSIVE
, "", "");
42 cls_client::object_map_resize(&op
, m_num_objs
, m_default_object_state
);
44 librados::AioCompletion
*rados_completion
= create_callback_completion();
45 int r
= m_image_ctx
.md_ctx
.aio_operate(oid
, rados_completion
, &op
);
47 rados_completion
->release();
50 void ResizeRequest::finish_request() {
51 RWLock::WLocker
object_map_locker(m_image_ctx
.object_map_lock
);
53 CephContext
*cct
= m_image_ctx
.cct
;
54 ldout(cct
, 5) << this << " resizing in-memory object map: "
55 << m_num_objs
<< dendl
;
57 resize(m_object_map
, m_num_objs
, m_default_object_state
);
60 } // namespace object_map