]>
git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/io/Utils.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/io/Utils.h"
5 #include "common/dout.h"
6 #include "include/buffer.h"
7 #include "include/rados/librados.hpp"
8 #include "librbd/io/AioCompletion.h"
9 #include "librbd/io/ImageRequest.h"
10 #include "osd/osd_types.h"
11 #include "osdc/Striper.h"
13 #define dout_subsys ceph_subsys_rbd
15 #define dout_prefix *_dout << "librbd::io::util: " << __func__ << ": "
21 bool assemble_write_same_extent(
22 const LightweightObjectExtent
&object_extent
, const ceph::bufferlist
& data
,
23 ceph::bufferlist
*ws_data
, bool force_write
) {
24 size_t data_len
= data
.length();
27 bool may_writesame
= true;
28 for (auto& q
: object_extent
.buffer_extents
) {
29 if (!(q
.first
% data_len
== 0 && q
.second
% data_len
== 0)) {
30 may_writesame
= false;
36 ws_data
->append(data
);
41 for (auto& q
: object_extent
.buffer_extents
) {
43 uint64_t sub_off
= q
.first
% data_len
;
44 uint64_t sub_len
= data_len
- sub_off
;
45 uint64_t extent_left
= q
.second
;
46 while (extent_left
>= sub_len
) {
47 sub_bl
.substr_of(data
, sub_off
, sub_len
);
48 ws_data
->claim_append(sub_bl
);
49 extent_left
-= sub_len
;
56 sub_bl
.substr_of(data
, sub_off
, extent_left
);
57 ws_data
->claim_append(sub_bl
);
64 void read_parent(I
*image_ctx
, uint64_t object_no
, uint64_t off
,
65 uint64_t len
, librados::snap_t snap_id
,
66 const ZTracer::Trace
&trace
, ceph::bufferlist
* data
,
69 auto cct
= image_ctx
->cct
;
71 std::shared_lock image_locker
{image_ctx
->image_lock
};
73 // calculate reverse mapping onto the image
74 Extents parent_extents
;
75 Striper::extent_to_file(cct
, &image_ctx
->layout
, object_no
, off
, len
,
78 uint64_t parent_overlap
= 0;
79 uint64_t object_overlap
= 0;
80 int r
= image_ctx
->get_parent_overlap(snap_id
, &parent_overlap
);
82 object_overlap
= image_ctx
->prune_parent_extents(parent_extents
,
86 if (object_overlap
== 0) {
87 image_locker
.unlock();
89 on_finish
->complete(-ENOENT
);
93 ldout(cct
, 20) << dendl
;
95 auto comp
= AioCompletion::create_and_start(on_finish
, image_ctx
->parent
,
97 ldout(cct
, 20) << "completion " << comp
<< ", extents " << parent_extents
100 ImageRequest
<I
>::aio_read(image_ctx
->parent
, comp
, std::move(parent_extents
),
101 ReadResult
{data
}, 0, trace
);
106 } // namespace librbd
108 template void librbd::io::util::read_parent(
109 librbd::ImageCtx
*image_ctx
, uint64_t object_no
, uint64_t off
, uint64_t len
,
110 librados::snap_t snap_id
, const ZTracer::Trace
&trace
,
111 ceph::bufferlist
* data
, Context
* on_finish
);