MCPcopy Create free account
hub / github.com/ceph/ceph / decrypt_aligned_extent

Method decrypt_aligned_extent

src/librbd/crypto/CryptoInterface.h:64–119  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

62 }
63
64 inline int decrypt_aligned_extent(io::ReadExtent& extent,
65 uint64_t image_offset) {
66 if (extent.length == 0 || extent.bl.length() == 0) {
67 return 0;
68 }
69
70 if (extent.extent_map.empty()) {
71 extent.extent_map.emplace_back(extent.offset, extent.bl.length());
72 }
73
74 ceph::bufferlist result_bl;
75 io::Extents result_extent_map;
76
77 ceph::bufferlist curr_block_bl;
78 auto curr_offset = extent.offset;
79 auto curr_block_start_offset = curr_offset;
80 auto curr_block_end_offset = curr_offset;
81
82 // this will add a final loop iteration for decrypting the last extent
83 extent.extent_map.emplace_back(
84 extent.offset + extent.length + get_block_size(), 0);
85
86 for (auto [off, len]: extent.extent_map) {
87 auto [aligned_off, aligned_len] = align(off, len);
88 if (aligned_off > curr_block_end_offset) {
89 curr_block_bl.append_zero(curr_block_end_offset - curr_offset);
90 auto curr_block_length = curr_block_bl.length();
91 if (curr_block_length > 0) {
92 auto r = decrypt(
93 &curr_block_bl,
94 image_offset + curr_block_start_offset - extent.offset);
95 if (r != 0) {
96 return r;
97 }
98
99 curr_block_bl.splice(0, curr_block_length, &result_bl);
100 result_extent_map.emplace_back(
101 curr_block_start_offset, curr_block_length);
102 }
103
104 curr_block_start_offset = aligned_off;
105 curr_block_end_offset = aligned_off + aligned_len;
106 curr_offset = aligned_off;
107 }
108
109 curr_block_bl.append_zero(off - curr_offset);
110 extent.bl.splice(0, len, &curr_block_bl);
111 curr_offset = off + len;
112 curr_block_end_offset = aligned_off + aligned_len;
113 }
114
115 extent.bl = std::move(result_bl);
116 extent.extent_map = std::move(result_extent_map);
117
118 return 0;
119 }
120};
121

Callers 1

handle_readMethod · 0.80

Calls 6

get_block_sizeFunction · 0.85
spliceMethod · 0.80
lengthMethod · 0.45
emptyMethod · 0.45
emplace_backMethod · 0.45
append_zeroMethod · 0.45

Tested by

no test coverage detected