RBMDevice::mkfs_ret RBMDevice::mkfs(device_config_t config) {
LOG_PREFIX(RBMDevice::mkfs);
- super.start = 0;
- // TODO: improve mkfs() based on a file descriptor
- super.block_size = get_block_size();
- super.size = get_available_size();
-
- super.feature |= RBM_BITMAP_BLOCK_CRC;
- super.config = std::move(config);
- DEBUG("super {} ", super);
- // write super block
- return write_rbm_header(
- ).safe_then([] {
- return mkfs_ertr::now();
- }).handle_error(
+ return stat_device(
+ ).handle_error(
mkfs_ertr::pass_further{},
crimson::ct_error::assert_all{
- "Invalid error write_rbm_header in RBMDevice::mkfs"
+ "Invalid error stat_device in RBMDevice::mkfs"}
+ ).safe_then([this, FNAME, config=std::move(config)](auto st) {
+ super.block_size = st.block_size;
+ super.size = st.size;
+
+ super.feature |= RBM_BITMAP_BLOCK_CRC;
+ super.config = std::move(config);
+ DEBUG("super {} ", super);
+ // write super block
+ return write_rbm_header(
+ ).safe_then([] {
+ return mkfs_ertr::now();
+ }).handle_error(
+ mkfs_ertr::pass_further{},
+ crimson::ct_error::assert_all{
+ "Invalid error write_rbm_header in RBMDevice::mkfs"
+ });
});
}
* atomic_write_unit does not require fsync().
*/
- NVMeBlockDevice() {}
+ NVMeBlockDevice(std::string device_path) : device_path(device_path) {}
~NVMeBlockDevice() = default;
open_ertr::future<> open(
ceph::bufferlist bl,
uint16_t stream = 0) final;
+ stat_device_ret stat_device() final {
+ return seastar::file_stat(device_path, seastar::follow_symlink::yes
+ ).then([](auto stat) {
+ return stat_device_ret(
+ read_ertr::ready_future_marker{},
+ stat
+ );
+ });
+ }
+
uint64_t get_preffered_write_granularity() const { return write_granularity; }
uint64_t get_preffered_write_alignment() const { return write_alignment; }
uint64_t get_atomic_write_unit() const { return atomic_write_unit; }
uint32_t atomic_write_unit = 4096;
bool data_protection_enabled = false;
+ std::string device_path;
};
}
write_ertr::future<> write_rbm_header();
read_ertr::future<rbm_metadata_header_t> read_rbm_header(rbm_abs_addr addr);
-};
+ using stat_device_ret =
+ read_ertr::future<seastar::stat_data>;
+ virtual stat_device_ret stat_device() = 0;
+};
class TestMemory : public RBMDevice {
public:
ceph::bufferlist bl,
uint16_t stream = 0) final;
+ stat_device_ret stat_device() final {
+ seastar::stat_data stat;
+ stat.block_size = block_size;
+ stat.size = size;
+ return stat_device_ret(
+ read_ertr::ready_future_marker{},
+ stat
+ );
+ }
char *buf;
};
}
TEST_F(nvdev_test_t, write_and_verify_test)
{
run_async([this] {
- device = RBMDevice::create<NVMeBlockDevice>();
+ device.reset(new random_block_device::nvme::NVMeBlockDevice(""));
device->open(dev_path, seastar::open_flags::rw).unsafe_get();
nvdev_test_block_t original_data;
std::minstd_rand0 generator;