Seastore exploits paddr_t to represent its address.
However. the term of "segment" in paddr_t generally be used in LFS,
not random block design---"block" is more general term of RBM.
The problem is that seasore already has been tighly coupled with padd_t,
also it does not make sense that there are two differnt address
such as paddr_t and block_paddr_t.
Therefore, to solve this problem, this commit adds blocks_per_segment, which
describes how many blocks a single segment contains to make RBM be compotible
with paddr_t
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
blk_paddr_t end;
size_t block_size = 0;
size_t total_size = 0;
+ uint32_t blocks_per_segment = 1 << 18;
seastore_meta_t meta;
};
using mkfs_ertr = crimson::errorator<
virtual size_t get_size() const = 0;
virtual size_t get_block_size() const = 0;
virtual uint64_t get_free_blocks() const = 0;
+ virtual uint32_t get_blocks_per_segment() const = 0;
virtual ~RandomBlockManager() {}
};
using RandomBlockManagerRef = std::unique_ptr<RandomBlockManager>;
super.start_alloc_area + super.alloc_area_size;
super.crc = 0;
super.feature |= RBM_BITMAP_BLOCK_CRC;
+ super.blocks_per_segment = config.blocks_per_segment;
logger().debug(" super {} ", super);
// write super block
uint32_t start_data_area;
uint64_t flag; // reserved
uint64_t feature;
+ uint32_t blocks_per_segment; // the number of blocks in segment
checksum_t crc;
DENC(rbm_metadata_header_t, v, p) {
denc(v.start_data_area, p);
denc(v.flag, p);
denc(v.feature, p);
+ denc(v.blocks_per_segment, p);
denc(v.crc, p);
DENC_FINISH(p);
free_block_ertr::future<> add_free_extent(
std::vector<rbm_alloc_delta_t>& v, blk_paddr_t from, size_t len);
+ uint32_t get_blocks_per_segment() const final {
+ return super.blocks_per_segment;
+ }
+
private:
/*
* this contains the number of bitmap blocks, free blocks and
ceph_assert(0 == "impossible");
}
}
+paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size,
+ uint32_t blocks_per_segment, device_id_t d_id)
+{
+ paddr_t paddr;
+ paddr.segment = segment_id_t {
+ d_id,
+ (uint32_t)(addr / (block_size * blocks_per_segment))
+ };
+ paddr.offset = addr % (block_size * blocks_per_segment);
+ return paddr;
+}
+
+blk_paddr_t convert_paddr_to_blk_paddr(paddr_t addr, size_t block_size,
+ uint32_t blocks_per_segment)
+{
+ return (blk_paddr_t)(addr.segment.device_segment_id() *
+ (block_size * blocks_per_segment) + addr.offset);
+}
}
op_types_t op;
};
+paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size,
+ uint32_t blocks_per_segment, device_id_t d_id);
+blk_paddr_t convert_paddr_to_blk_paddr(paddr_t addr, size_t block_size,
+ uint32_t blocks_per_segment);
+
struct extent_info_t {
extent_types_t type = extent_types_t::NONE;
laddr_t addr = L_ADDR_NULL;