From 839db06fe4a7649ef2304ab577b797cccaa874b7 Mon Sep 17 00:00:00 2001 From: Aravind Ramesh Date: Tue, 26 Jul 2022 19:16:01 +0530 Subject: [PATCH] crimson/zns: segment_close() should finish the zone. Zones in IMP-OPEN, EXP-OPEN, CLOSED states in a ZNS device are counted as active resources. ZNS SSDs can have a limit on the number of zones that can be active at the same time (max_active_resources). If CLOSED zones reach max_active_zones supported by the device, then opening/writing to newer zones will fail. So a close_segment() from Seastore is essentially a FINISH operation on a ZNS zone. Do FINISH operation on a zone instead of CLOSE from segment_close(). Signed-off-by: Aravind Ramesh --- .../os/seastore/segment_manager/zns.cc | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/crimson/os/seastore/segment_manager/zns.cc b/src/crimson/os/seastore/segment_manager/zns.cc index 99b56d09c0948..a27d3784ff196 100644 --- a/src/crimson/os/seastore/segment_manager/zns.cc +++ b/src/crimson/os/seastore/segment_manager/zns.cc @@ -438,6 +438,33 @@ ZNSSegmentManager::open_ertr::future ZNSSegmentManager::open( }); } +using blk_finish_zone_ertr = crimson::errorator< + crimson::ct_error::input_output_error>; +using blk_finish_zone_ret = blk_finish_zone_ertr::future<>; +static blk_finish_zone_ret blk_finish_zone( + seastar::file &device, + blk_zone_range &range) +{ + LOG_PREFIX(ZNSSegmentManager::blk_finish_zone); + return device.ioctl( + BLKFINISHZONE, + &range + ).then_wrapped([=](auto f) -> blk_finish_zone_ret { + if (f.failed()) { + DEBUG("BLKFINISHZONE ioctl failed"); + return crimson::ct_error::input_output_error::make(); + } else { + int ret = f.get(); + if (ret == 0) { + return seastar::now(); + } else { + DEBUG("BLKFINISHZONE ioctl failed with return code {}", ret); + return crimson::ct_error::input_output_error::make(); + } + } + }); +} + using blk_close_zone_ertr = crimson::errorator< crimson::ct_error::input_output_error>; using blk_close_zone_ret = blk_close_zone_ertr::future<>; @@ -514,7 +541,7 @@ SegmentManager::read_ertr::future<> ZNSSegmentManager::read( Segment::close_ertr::future<> ZNSSegmentManager::segment_close( segment_id_t id, seastore_off_t write_pointer) { - LOG_PREFIX(ZNSSegmentManager::close); + LOG_PREFIX(ZNSSegmentManager::segment_close); return seastar::do_with( blk_zone_range{}, [=](auto &range) { @@ -522,13 +549,13 @@ Segment::close_ertr::future<> ZNSSegmentManager::segment_close( id, metadata.segment_size, metadata.first_segment_offset); - return blk_close_zone( + return blk_finish_zone( device, range ); } ).safe_then([=] { - DEBUG("close successful"); + DEBUG("zone finish successful"); return Segment::close_ertr::now(); }); } -- 2.39.5