]>
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 "include/buffer.h"
6 #include "osd/osd_types.h"
12 bool assemble_write_same_extent(
13 const ObjectExtent
&object_extent
, const ceph::bufferlist
& data
,
14 ceph::bufferlist
*ws_data
, bool force_write
) {
15 size_t data_len
= data
.length();
18 bool may_writesame
= true;
19 for (auto& q
: object_extent
.buffer_extents
) {
20 if (!(q
.first
% data_len
== 0 && q
.second
% data_len
== 0)) {
21 may_writesame
= false;
27 ws_data
->append(data
);
32 for (auto& q
: object_extent
.buffer_extents
) {
34 uint64_t sub_off
= q
.first
% data_len
;
35 uint64_t sub_len
= data_len
- sub_off
;
36 uint64_t extent_left
= q
.second
;
37 while (extent_left
>= sub_len
) {
38 sub_bl
.substr_of(data
, sub_off
, sub_len
);
39 ws_data
->claim_append(sub_bl
);
40 extent_left
-= sub_len
;
47 sub_bl
.substr_of(data
, sub_off
, extent_left
);
48 ws_data
->claim_append(sub_bl
);