]>
Commit | Line | Data |
---|---|---|
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 | ||
8 | namespace librbd { | |
9 | namespace io { | |
10 | namespace util { | |
11 | ||
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(); | |
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 |