From: Aravind Ramesh Date: Thu, 18 Aug 2022 09:06:48 +0000 (+0530) Subject: crimson/zns: ZNSSegmentManager::release() should reset the zone. X-Git-Tag: v18.0.0~94^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9675c48d90627971c4ce94da3302fdcf9c63f8e5;p=ceph.git crimson/zns: ZNSSegmentManager::release() should reset the zone. 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 --- diff --git a/src/crimson/os/seastore/segment_manager/zns.cc b/src/crimson/os/seastore/segment_manager/zns.cc index a27d3784ff19..27dc1aed3147 100644 --- a/src/crimson/os/seastore/segment_manager/zns.cc +++ b/src/crimson/os/seastore/segment_manager/zns.cc @@ -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 );