]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/rbm: add stat to get device info. at mkfs time
authormyoungwon oh <ohmyoungwon@gmail.com>
Sat, 15 Oct 2022 06:57:53 +0000 (15:57 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Tue, 18 Oct 2022 02:33:08 +0000 (11:33 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/random_block_manager/nvme_block_device.cc
src/crimson/os/seastore/random_block_manager/nvme_block_device.h
src/crimson/os/seastore/random_block_manager/rbm_device.h
src/test/crimson/seastore/nvmedevice/test_nvmedevice.cc

index 06775ec7e23939e734334b149cfed3bba6a872f8..f060e1688c232ff1ab6dd77d67f598090ced7341 100644 (file)
@@ -26,22 +26,27 @@ SET_SUBSYS(seastore_device);
 
 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"
+    });
   });
 }
 
index 8441712993417c4d3c286307157c9935b428be54..118d6fe14cbb482fecab4f4f4a62a74ffe1ff587 100644 (file)
@@ -184,7 +184,7 @@ public:
    * atomic_write_unit does not require fsync().
    */
 
-  NVMeBlockDevice() {}
+  NVMeBlockDevice(std::string device_path) : device_path(device_path) {}
   ~NVMeBlockDevice() = default;
 
   open_ertr::future<> open(
@@ -216,6 +216,16 @@ public:
     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; }
@@ -292,6 +302,7 @@ private:
   uint32_t atomic_write_unit = 4096;
 
   bool data_protection_enabled = false;
+  std::string device_path;
 };
 
 }
index 4a94805199e6ca1ad0d3731d8de053d1ca2f380b..c0dd0c8f0dddef167ffc39b633ed451e8d2ec648 100644 (file)
@@ -159,8 +159,11 @@ public:
   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:
@@ -213,6 +216,15 @@ 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;
 };
 }
index 76d960213a735d5339115fad7eea518dfd857272..faa7cfa140b3b9b5adca586b0f5278804dfb417c 100644 (file)
@@ -55,7 +55,7 @@ WRITE_CLASS_DENC_BOUNDED(
 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;