assert(!bl.has_value() || bl->length() == len);
auto unaligned_begin = data_base + offset;
auto unaligned_end = data_base + offset + len;
- assert(first_mapping.get_key() <= unaligned_begin.get_aligned_laddr());
+ assert(first_mapping.get_key() <= unaligned_begin.get_aligned_laddr(
+ ctx.tm.get_block_size()));
DEBUGT(
"data_base={}, offset=0x{:x}, len=0x{:x}, "
"aligned_begin={}, aligned_end={}",
ctx.t, data_base, offset, len,
- unaligned_begin.get_aligned_laddr(),
- unaligned_end.get_roundup_laddr());
+ unaligned_begin.get_aligned_laddr(ctx.tm.get_block_size()),
+ unaligned_end.get_roundup_laddr(ctx.tm.get_block_size()));
return seastar::do_with(
data_t{std::nullopt, std::move(bl), std::nullopt},
overwrite_range_t{
len,
unaligned_begin,
- unaligned_end},
+ unaligned_end,
+ ctx.tm.get_block_size()},
[first_mapping=std::move(first_mapping),
this, ctx](auto &data, auto &overwrite_range) {
if (overwrite_range.is_range_in_mapping(first_mapping)) {
laddr_offset_t l_start =
object_data.get_reserved_data_base() + obj_offset;
laddr_offset_t l_end = l_start + len;
- laddr_t aligned_start = l_start.get_aligned_laddr();
+ laddr_t aligned_start = l_start.get_aligned_laddr(
+ ctx.tm.get_block_size());
loffset_t aligned_length =
- l_end.get_roundup_laddr().get_byte_distance<
+ l_end.get_roundup_laddr(ctx.tm.get_block_size()).get_byte_distance<
loffset_t>(aligned_start);
return ctx.tm.get_pins(
ctx.t,
extent_len_t read_start;
extent_len_t read_start_aligned;
if (l_current == l_start) { // first pin may skip head
- ceph_assert(l_current.get_aligned_laddr() >= pin_start);
+ ceph_assert(l_current.get_aligned_laddr(
+ ctx.tm.get_block_size()) >= pin_start);
read_start = l_current.template
get_byte_distance<extent_len_t>(pin_start);
read_start_aligned = p2align(read_start, ctx.tm.get_block_size());
}
// non-zero pin
- laddr_t l_current_end_aligned = l_current_end.get_roundup_laddr();
+ laddr_t l_current_end_aligned =
+ l_current_end.get_roundup_laddr(ctx.tm.get_block_size());
extent_len_t read_len_aligned =
l_current_end_aligned.get_byte_distance<extent_len_t>(pin_start);
read_len_aligned -= read_start_aligned;
laddr_offset_t l_start =
object_data.get_reserved_data_base() + obj_offset;
laddr_offset_t l_end = l_start + len;
- laddr_t aligned_start = l_start.get_aligned_laddr();
+ laddr_t aligned_start = l_start.get_aligned_laddr(
+ ctx.tm.get_block_size());
loffset_t aligned_length =
- l_end.get_roundup_laddr().get_byte_distance<
+ l_end.get_roundup_laddr(ctx.tm.get_block_size()).get_byte_distance<
loffset_t>(aligned_start);
return ctx.tm.get_pins(
ctx.t,
overwrite_range_t(
objaddr_t unaligned_len,
laddr_offset_t unaligned_begin,
- laddr_offset_t unaligned_end)
+ laddr_offset_t unaligned_end,
+ extent_len_t block_size)
: unaligned_len(unaligned_len),
unaligned_begin(unaligned_begin),
unaligned_end(unaligned_end),
- aligned_begin(unaligned_begin.get_aligned_laddr()),
- aligned_end(unaligned_end.get_roundup_laddr()),
+ aligned_begin(unaligned_begin.get_aligned_laddr(block_size)),
+ aligned_end(unaligned_end.get_roundup_laddr(block_size)),
aligned_len(
aligned_end.template get_byte_distance<
extent_len_t>(aligned_begin))
}
std::ostream &operator<<(std::ostream &out, const laddr_offset_t &laddr_offset) {
- return out << laddr_offset.get_aligned_laddr()
+ return out << laddr_offset.get_laddr()
<< "+0x" << std::hex << laddr_offset.get_offset() << std::dec;
}
assert(offset < laddr_t::UNIT_SIZE);
}
- laddr_t get_roundup_laddr() const {
+ laddr_t get_roundup_laddr(size_t alignment) const {
+ ceph_assert(alignment % laddr_t::UNIT_SIZE == 0);
if (offset == 0) {
- return laddr_t(base);
+ return laddr_t(p2roundup(base, alignment >> laddr_t::UNIT_SHIFT));
} else {
assert(offset < laddr_t::UNIT_SIZE);
- return laddr_t(base + 1);
+ return laddr_t(p2roundup(base + 1, alignment >> laddr_t::UNIT_SHIFT));
}
}
- laddr_t get_aligned_laddr() const { return laddr_t(base); }
+ laddr_t get_aligned_laddr(size_t alignment) const {
+ ceph_assert(alignment % laddr_t::UNIT_SIZE == 0);
+ return laddr_t(p2align(base, alignment >> laddr_t::UNIT_SHIFT));
+ }
+ laddr_t get_laddr() const {
+ return laddr_t{base};
+ }
extent_len_t get_offset() const {
assert(offset < laddr_t::UNIT_SIZE);
return offset;
friend laddr_offset_t operator+(const laddr_offset_t &laddr_offset,
const loffset_t &offset) {
// laddr_offset_t could access (laddr_t + loffset_t) overload.
- return laddr_offset.get_aligned_laddr()
- + (laddr_offset.get_offset() + offset);
+ return laddr_offset.get_laddr() + (laddr_offset.get_offset() + offset);
}
friend laddr_offset_t operator+(const loffset_t &offset,
const laddr_offset_t &loffset) {
const loffset_t &offset) {
if (laddr_offset.get_offset() >= offset) {
return laddr_offset_t(
- laddr_offset.get_aligned_laddr(),
+ laddr_offset.get_laddr(),
laddr_offset.get_offset() - offset);
} else {
// laddr_offset_t could access (laddr_t - loffset_t) overload.
- return laddr_offset.get_aligned_laddr()
+ return laddr_offset.get_laddr()
- (offset - laddr_offset.get_offset());
}
}
friend bool operator==(const laddr_t&, const laddr_t&) = default;
friend bool operator==(const laddr_t &laddr,
const laddr_offset_t &laddr_offset) {
- return laddr == laddr_offset.get_aligned_laddr()
+ return laddr == laddr_offset.get_laddr()
&& 0 == laddr_offset.get_offset();
}
friend bool operator==(const laddr_offset_t &laddr_offset,
const laddr_t &laddr) {
- return laddr_offset.get_aligned_laddr() == laddr
+ return laddr_offset.get_laddr() == laddr
&& laddr_offset.get_offset() == 0;
}
friend auto operator<=>(const laddr_t&, const laddr_t&) = default;