]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/zns: ZNSSegmentManager::release() should reset the zone.
authorAravind Ramesh <Aravind.Ramesh@wdc.com>
Thu, 18 Aug 2022 09:06:48 +0000 (14:36 +0530)
committerAravind <aravind.ramesh@wdc.com>
Fri, 2 Sep 2022 05:07:05 +0000 (10:37 +0530)
For a ZNS device, a open/full zone has to be reset before it can be
reused to write from start. Seastore releases a segment/zone and marks
it empty and expects to be able to write to it from start. So as a part
of release reset the zone, so it moves to empty state on the device.

Signed-off-by: Aravind Ramesh <aravind.ramesh@wdc.com>
src/crimson/os/seastore/segment_manager/zns.cc

index a27d3784ff196866fd9b2331947a3d350e18660a..27dc1aed3147d7d29cc1278e1c1587f65ce5ac9c 100644 (file)
@@ -475,7 +475,7 @@ blk_close_zone_ret blk_close_zone(
   return device.ioctl(
     BLKCLOSEZONE, 
     &range
-  ).then_wrapped([=](auto f) -> blk_open_zone_ret{
+  ).then_wrapped([=](auto f) -> blk_open_zone_ret {
     if (f.failed()) {
       return crimson::ct_error::input_output_error::make();
     }
@@ -490,10 +490,38 @@ blk_close_zone_ret blk_close_zone(
   });
 }
 
+using blk_reset_zone_ertr = crimson::errorator<
+  crimson::ct_error::input_output_error>;
+using blk_reset_zone_ret = blk_reset_zone_ertr::future<>;
+blk_reset_zone_ret blk_reset_zone(
+    seastar::file &device,
+    blk_zone_range &range)
+{
+  LOG_PREFIX(ZNSSegmentManager::blk_reset_zone);
+  return device.ioctl(
+    BLKRESETZONE,
+    &range
+  ).then_wrapped([=](auto f) -> blk_reset_zone_ret {
+    if (f.failed()) {
+      DEBUG("BLKRESETZONE ioctl failed");
+      return crimson::ct_error::input_output_error::make();
+    } else {
+      int ret = f.get();
+      if (ret == 0) {
+        return seastar::now();
+      } else {
+        DEBUG("BLKRESETZONE ioctl failed with return code {}", ret);
+        return crimson::ct_error::input_output_error::make();
+      }
+    }
+  });
+}
+
 ZNSSegmentManager::release_ertr::future<> ZNSSegmentManager::release(
   segment_id_t id) 
 {
   LOG_PREFIX(ZNSSegmentManager::release);
+  DEBUG("Resetting zone/segment {}", id);
   return seastar::do_with(
     blk_zone_range{},
     [=](auto &range) {
@@ -501,7 +529,7 @@ ZNSSegmentManager::release_ertr::future<> ZNSSegmentManager::release(
        id,
        metadata.segment_size,
         metadata.first_segment_offset);
-      return blk_close_zone(
+      return blk_reset_zone(
        device,
        range
       );