}
}
-constexpr bool has_seastore_off(device_id_t id) {
+constexpr bool has_device_off(device_id_t id) {
return id == DEVICE_ID_RECORD_RELATIVE ||
id == DEVICE_ID_BLOCK_RELATIVE ||
id == DEVICE_ID_DELAYED ||
* TODO: replace block_off_t
*/
using device_off_t = int64_t;
+using u_device_off_t = uint64_t;
constexpr auto DEVICE_OFF_BITS = PADDR_BITS - DEVICE_ID_BITS;
constexpr auto DEVICE_OFF_MAX =
std::numeric_limits<device_off_t>::max() >> DEVICE_ID_BITS;
using u_segment_off_t = uint32_t;
constexpr auto DEVICE_ID_MASK =
- ((internal_paddr_t(1) << DEVICE_ID_BITS) - 1) << BLOCK_OFF_BITS;
-constexpr auto BLOCK_OFF_MASK =
- static_cast<internal_paddr_t>(BLOCK_OFF_MAX);
+ ((internal_paddr_t(1) << DEVICE_ID_BITS) - 1) << DEVICE_OFF_BITS;
+constexpr auto DEVICE_OFF_MASK =
+ std::numeric_limits<u_device_off_t>::max() >> DEVICE_ID_BITS;
constexpr auto SEGMENT_ID_MASK =
((internal_paddr_t(1) << SEGMENT_ID_BITS) - 1) << SEGMENT_OFF_BITS;
constexpr auto SEGMENT_OFF_MASK =
(internal_paddr_t(1) << SEGMENT_OFF_BITS) - 1;
constexpr auto SEASTORE_OFF_MASK = SEGMENT_OFF_MASK;
+constexpr internal_paddr_t encode_device_off(device_off_t off) {
+ return static_cast<internal_paddr_t>(off) & DEVICE_OFF_MASK;
+}
+
+constexpr device_off_t decode_device_off(internal_paddr_t addr) {
+ if (addr & (1ull << (DEVICE_OFF_BITS - 1))) {
+ return static_cast<device_off_t>(addr | DEVICE_ID_MASK);
+ } else {
+ return static_cast<device_off_t>(addr & DEVICE_OFF_MASK);
+ }
+}
+
struct seg_paddr_t;
struct blk_paddr_t;
struct res_paddr_t;
struct paddr_t {
public:
// P_ADDR_MAX == P_ADDR_NULL == paddr_t{}
- paddr_t() : paddr_t(DEVICE_ID_MAX, seastore_off_t(0)) {}
+ paddr_t() : paddr_t(DEVICE_ID_MAX, device_off_t(0)) {}
static paddr_t make_seg_paddr(
segment_id_t seg,
static paddr_t make_blk_paddr(
device_id_t device,
- block_off_t offset) {
+ device_off_t offset) {
+ assert(device_id_to_paddr_type(device) == paddr_types_t::RANDOM_BLOCK);
return paddr_t(device, offset);
}
static paddr_t make_res_paddr(
device_id_t device,
- seastore_off_t offset) {
+ device_off_t offset) {
+ assert(device_id_to_paddr_type(device) == paddr_types_t::RESERVED);
return paddr_t(device, offset);
}
}
device_id_t get_device_id() const {
- return static_cast<device_id_t>(internal_paddr >> BLOCK_OFF_BITS);
+ return static_cast<device_id_t>(internal_paddr >> DEVICE_OFF_BITS);
}
paddr_types_t get_addr_type() const {
return device_id_to_paddr_type(get_device_id());
}
- paddr_t add_offset(seastore_off_t o) const;
+ paddr_t add_offset(device_off_t o) const;
paddr_t add_relative(paddr_t o) const;
paddr_t block_relative_to(paddr_t rhs) const;
// To be compatible with laddr_t operator+
- paddr_t operator+(seastore_off_t o) const {
+ paddr_t operator+(device_off_t o) const {
return add_offset(o);
}
}
bool is_absolute() const {
- return device_id_to_paddr_type(get_device_id()) != paddr_types_t::RESERVED;
+ return get_addr_type() != paddr_types_t::RESERVED;
}
auto operator<=>(const paddr_t &) const = default;
}
constexpr static paddr_t create_const(
- device_id_t d_id, device_segment_id_t s_id, seastore_off_t offset) {
- return paddr_t(d_id, s_id, offset);
+ device_id_t d_id, device_off_t offset) {
+ return paddr_t(d_id, offset, const_construct_t());
}
protected:
: paddr_t((static_cast<internal_paddr_t>(seg.segment) << SEGMENT_OFF_BITS) |
static_cast<u_segment_off_t>(offset)) {}
- // as blk
- paddr_t(device_id_t d_id, block_off_t offset)
- : paddr_t((static_cast<internal_paddr_t>(d_id) << BLOCK_OFF_BITS) |
- (offset & BLOCK_OFF_MASK)) {
- assert(device_id_to_paddr_type(get_device_id()) == paddr_types_t::RANDOM_BLOCK);
- assert(offset <= BLOCK_OFF_MAX);
- }
-
- // as res
- paddr_t(device_id_t d_id, seastore_off_t offset)
- : paddr_t((static_cast<internal_paddr_t>(d_id) << BLOCK_OFF_BITS) |
- static_cast<u_seastore_off_t>(offset)) {
- assert(device_id_to_paddr_type(get_device_id()) == paddr_types_t::RESERVED);
+ // as blk or res
+ paddr_t(device_id_t d_id, device_off_t offset)
+ : paddr_t((static_cast<internal_paddr_t>(d_id) << DEVICE_OFF_BITS) |
+ encode_device_off(offset)) {
+ assert(offset >= DEVICE_OFF_MIN);
+ assert(offset <= DEVICE_OFF_MAX);
+ assert(get_addr_type() != paddr_types_t::SEGMENT);
}
paddr_t(internal_paddr_t val);
- constexpr paddr_t(device_id_t d_id, device_segment_id_t s_id, seastore_off_t offset)
+ struct const_construct_t {};
+ constexpr paddr_t(device_id_t d_id, device_off_t offset, const_construct_t)
: internal_paddr((static_cast<internal_paddr_t>(d_id) << BLOCK_OFF_BITS) |
- (static_cast<internal_paddr_t>(s_id) << SEGMENT_OFF_BITS) |
- static_cast<u_seastore_off_t>(offset)) {}
+ static_cast<u_device_off_t>(offset)) {}
friend struct paddr_le_t;
};
internal_paddr |= static_cast<u_segment_off_t>(off);
}
- paddr_t add_offset(seastore_off_t o) const {
+ paddr_t add_offset(device_off_t o) const {
device_off_t off = get_segment_off() + o;
assert(off >= 0);
assert(off <= MAX_SEG_OFF);
blk_paddr_t& operator=(const blk_paddr_t&) = delete;
blk_paddr_t& operator=(blk_paddr_t&) = delete;
- block_off_t get_block_off() const {
- return block_off_t(internal_paddr & BLOCK_OFF_MASK);
+ device_off_t get_device_off() const {
+ return decode_device_off(internal_paddr);
}
- void set_block_off(block_off_t off) {
- assert(off <= BLOCK_OFF_MAX);
+ void set_device_off(device_off_t off) {
+ assert(off >= 0);
+ assert(off <= DEVICE_OFF_MAX);
internal_paddr = (internal_paddr & DEVICE_ID_MASK);
- internal_paddr |= (off & BLOCK_OFF_MASK);
+ internal_paddr |= encode_device_off(off);
}
- paddr_t add_offset(seastore_off_t o) const {
- auto off = get_block_off() + o;
- assert(o >= 0 ? off >= get_block_off() : off < get_block_off());
+ paddr_t add_offset(device_off_t o) const {
+ assert(o >= DEVICE_OFF_MIN);
+ assert(o <= DEVICE_OFF_MAX);
+ auto off = get_device_off() + o;
return paddr_t::make_blk_paddr(get_device_id(), off);
}
};
res_paddr_t& operator=(const res_paddr_t&) = delete;
res_paddr_t& operator=(res_paddr_t&) = delete;
- seastore_off_t get_seastore_off() const {
- return seastore_off_t(internal_paddr & SEASTORE_OFF_MASK);
+ device_off_t get_device_off() const {
+ return decode_device_off(internal_paddr);
}
- void set_seastore_off(seastore_off_t off) {
- assert(has_seastore_off(get_device_id()));
+ void set_device_off(device_off_t off) {
+ assert(has_device_off(get_device_id()));
+ assert(off >= DEVICE_OFF_MIN);
+ assert(off <= DEVICE_OFF_MAX);
internal_paddr = (internal_paddr & DEVICE_ID_MASK);
- internal_paddr |= static_cast<u_seastore_off_t>(off);
+ internal_paddr |= encode_device_off(off);
}
- paddr_t add_offset(seastore_off_t o) const {
- assert(has_seastore_off(get_device_id()));
- auto off = get_seastore_off() + o;
- assert(o >= 0 ? off >= get_seastore_off() : off < get_seastore_off());
+ paddr_t add_offset(device_off_t o) const {
+ assert(has_device_off(get_device_id()));
+ assert(o >= DEVICE_OFF_MIN);
+ assert(o <= DEVICE_OFF_MAX);
+ auto off = get_device_off() + o;
return paddr_t::make_res_paddr(get_device_id(), off);
}
paddr_t block_relative_to(const res_paddr_t &rhs) const {
assert(rhs.is_record_relative() && is_record_relative());
- auto off = get_seastore_off() - rhs.get_seastore_off();
- assert(rhs.get_seastore_off() >= 0 ?
- off <= get_seastore_off() : off > get_seastore_off());
+ auto off = get_device_off() - rhs.get_device_off();
return paddr_t::make_res_paddr(DEVICE_ID_BLOCK_RELATIVE, off);
}
};
-constexpr paddr_t P_ADDR_MIN = paddr_t::create_const(0, 0, 0);
+constexpr paddr_t P_ADDR_MIN = paddr_t::create_const(0, 0);
// P_ADDR_MAX == P_ADDR_NULL == paddr_t{}
-constexpr paddr_t P_ADDR_MAX = paddr_t::create_const(DEVICE_ID_MAX, 0, 0);
+constexpr paddr_t P_ADDR_MAX = paddr_t::create_const(DEVICE_ID_MAX, 0);
constexpr paddr_t P_ADDR_NULL = P_ADDR_MAX;
-constexpr paddr_t P_ADDR_ZERO = paddr_t::create_const(DEVICE_ID_ZERO, 0, 0);
-constexpr paddr_t P_ADDR_ROOT = paddr_t::create_const(DEVICE_ID_ROOT, 0, 0);
+constexpr paddr_t P_ADDR_ZERO = paddr_t::create_const(DEVICE_ID_ZERO, 0);
+constexpr paddr_t P_ADDR_ROOT = paddr_t::create_const(DEVICE_ID_ROOT, 0);
-inline paddr_t make_record_relative_paddr(seastore_off_t off) {
+inline paddr_t make_record_relative_paddr(device_off_t off) {
return paddr_t::make_res_paddr(DEVICE_ID_RECORD_RELATIVE, off);
}
-inline paddr_t make_block_relative_paddr(seastore_off_t off) {
+inline paddr_t make_block_relative_paddr(device_off_t off) {
return paddr_t::make_res_paddr(DEVICE_ID_BLOCK_RELATIVE, off);
}
-inline paddr_t make_fake_paddr(seastore_off_t off) {
+inline paddr_t make_fake_paddr(device_off_t off) {
return paddr_t::make_res_paddr(DEVICE_ID_FAKE, off);
}
-inline paddr_t make_delayed_temp_paddr(seastore_off_t off) {
+inline paddr_t make_delayed_temp_paddr(device_off_t off) {
return paddr_t::make_res_paddr(DEVICE_ID_DELAYED, off);
}
inline paddr_t::paddr_t(internal_paddr_t val) : internal_paddr(val) {
#ifndef NDEBUG
- auto type = device_id_to_paddr_type(get_device_id());
+ auto type = get_addr_type();
if (type == paddr_types_t::SEGMENT) {
assert(as_seg_paddr().get_segment_off() >= 0);
} else if (type == paddr_types_t::RANDOM_BLOCK) {
- // nothing to check
+ assert(as_blk_paddr().get_device_off() >= 0);
} else {
assert(type == paddr_types_t::RESERVED);
- if (!has_seastore_off(get_device_id())) {
- assert((internal_paddr & SEASTORE_OFF_MASK) == 0);
+ if (!has_device_off(get_device_id())) {
+ assert(as_res_paddr().get_device_off() == 0);
}
}
#endif
return static_cast<const base*>(this)->func; \
}
-inline paddr_t paddr_t::add_offset(seastore_off_t o) const {
+inline paddr_t paddr_t::add_offset(device_off_t o) const {
PADDR_OPERATION(paddr_types_t::SEGMENT, seg_paddr_t, add_offset(o))
PADDR_OPERATION(paddr_types_t::RANDOM_BLOCK, blk_paddr_t, add_offset(o))
PADDR_OPERATION(paddr_types_t::RESERVED, res_paddr_t, add_offset(o))
inline paddr_t paddr_t::add_relative(paddr_t o) const {
assert(o.is_relative());
auto &res_o = o.as_res_paddr();
- return add_offset(res_o.get_seastore_off());
+ return add_offset(res_o.get_device_off());
}
inline paddr_t paddr_t::block_relative_to(paddr_t rhs) const {
journal_seq_t add_offset(
journal_type_t type,
device_off_t off,
- seastore_off_t roll_start,
- seastore_off_t roll_size) const;
+ device_off_t roll_start,
+ device_off_t roll_size) const;
device_off_t relative_to(
journal_type_t type,
const journal_seq_t& r,
- seastore_off_t roll_start,
- seastore_off_t roll_size) const;
+ device_off_t roll_start,
+ device_off_t roll_size) const;
DENC(journal_seq_t, v, p) {
DENC_START(1, 1, p);
} else if (segment_seq < other.segment_seq) {
return -1;
}
- using ret_t = std::pair<int64_t, segment_id_t>;
+ using ret_t = std::pair<device_off_t, segment_id_t>;
auto to_pair = [](const paddr_t &addr) -> ret_t {
if (addr.get_addr_type() == paddr_types_t::SEGMENT) {
auto &seg_addr = addr.as_seg_paddr();
return ret_t(seg_addr.get_segment_off(), seg_addr.get_segment_id());
} else if (addr.get_addr_type() == paddr_types_t::RANDOM_BLOCK) {
auto &blk_addr = addr.as_blk_paddr();
- return ret_t(blk_addr.get_block_off(), MAX_SEG_ID);
+ return ret_t(blk_addr.get_device_off(), MAX_SEG_ID);
} else if (addr.get_addr_type() == paddr_types_t::RESERVED) {
auto &res_addr = addr.as_res_paddr();
- return ret_t(res_addr.get_seastore_off(), MAX_SEG_ID);
+ return ret_t(res_addr.get_device_off(), MAX_SEG_ID);
} else {
assert(0 == "impossible");
return ret_t(0, MAX_SEG_ID);