]> git.proxmox.com Git - ceph.git/blame - ceph/src/librbd/io/Utils.cc
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / librbd / io / Utils.cc
CommitLineData
11fdf7f2
TL
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#include "librbd/io/Utils.h"
5#include "include/buffer.h"
6#include "osd/osd_types.h"
7
8namespace librbd {
9namespace io {
10namespace util {
11
12bool 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();
16
17 if (!force_write) {
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;
22 break;
23 }
24 }
25
26 if (may_writesame) {
27 ws_data->append(data);
28 return true;
29 }
30 }
31
32 for (auto& q : object_extent.buffer_extents) {
33 bufferlist sub_bl;
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;
41 if (sub_off) {
42 sub_off = 0;
43 sub_len = data_len;
44 }
45 }
46 if (extent_left) {
47 sub_bl.substr_of(data, sub_off, extent_left);
48 ws_data->claim_append(sub_bl);
49 }
50 }
51 return false;
52}
53
54} // namespace util
55} // namespace io
56} // namespace librbd
57