]> git.proxmox.com Git - ceph.git/blame - ceph/src/crimson/os/cyan_object.cc
update download target update for octopus release
[ceph.git] / ceph / src / crimson / os / cyan_object.cc
CommitLineData
11fdf7f2
TL
1#include "cyan_object.h"
2#include "include/encoding.h"
3
4namespace ceph::os {
5
6size_t Object::get_size() const {
7 return data.length();
8}
9
10int Object::read(uint64_t offset, uint64_t len, bufferlist &bl)
11{
12 bl.substr_of(data, offset, len);
13 return bl.length();
14}
15
16int Object::write(uint64_t offset, const bufferlist &src)
17{
18 unsigned len = src.length();
19 // before
20 bufferlist newdata;
21 if (get_size() >= offset) {
22 newdata.substr_of(data, 0, offset);
23 } else {
24 if (get_size()) {
25 newdata.substr_of(data, 0, get_size());
26 }
27 newdata.append_zero(offset - get_size());
28 }
29
30 newdata.append(src);
31
32 // after
33 if (get_size() > offset + len) {
34 bufferlist tail;
35 tail.substr_of(data, offset + len, get_size() - (offset + len));
36 newdata.append(tail);
37 }
38
39 data.claim(newdata);
40 return 0;
41}
42
43int Object::clone(Object *src, uint64_t srcoff, uint64_t len,
44 uint64_t dstoff)
45{
46 bufferlist bl;
47 if (srcoff == dstoff && len == src->get_size()) {
48 data = src->data;
49 return 0;
50 }
51 bl.substr_of(src->data, srcoff, len);
52 return write(dstoff, bl);
53
54}
55
56int Object::truncate(uint64_t size)
57{
58 if (get_size() > size) {
59 bufferlist bl;
60 bl.substr_of(data, 0, size);
61 data.claim(bl);
62 } else if (get_size() == size) {
63 // do nothing
64 } else {
65 data.append_zero(size - get_size());
66 }
67 return 0;
68}
69
70void Object::encode(bufferlist& bl) const {
71 ENCODE_START(1, 1, bl);
72 encode(data, bl);
73 encode(xattr, bl);
74 encode(omap_header, bl);
75 encode(omap, bl);
76 ENCODE_FINISH(bl);
77}
78
79void Object::decode(bufferlist::const_iterator& p) {
80 DECODE_START(1, p);
81 decode(data, p);
82 decode(xattr, p);
83 decode(omap_header, p);
84 decode(omap, p);
85 DECODE_FINISH(p);
86}
87
88}