From: myoungwon oh Date: Wed, 11 Sep 2024 07:02:56 +0000 (+0000) Subject: crimson/os/seastore/rbm: remove duplicate code and introduce a shared routine in... X-Git-Tag: v20.0.0~991^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=918539e9de2caa957d4f80399e8f76e1d5b90a51;p=ceph.git crimson/os/seastore/rbm: remove duplicate code and introduce a shared routine in read() and write() Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/random_block_manager/block_rb_manager.cc b/src/crimson/os/seastore/random_block_manager/block_rb_manager.cc index 2b303fbc4d90..e8376712a713 100644 --- a/src/crimson/os/seastore/random_block_manager/block_rb_manager.cc +++ b/src/crimson/os/seastore/random_block_manager/block_rb_manager.cc @@ -115,18 +115,25 @@ BlockRBManager::open_ertr::future<> BlockRBManager::open() return open_ertr::now(); } +bool BlockRBManager::check_valid_range(rbm_abs_addr addr, bufferptr &bptr) { + LOG_PREFIX(BlockRBManager::check_valid_range); + rbm_abs_addr start = device->get_shard_start(); + rbm_abs_addr end = device->get_shard_end(); + if (addr < start || addr + bptr.length() > end) { + ERROR("out of range: start {}, end {}, addr {}, length {}", + start, end, addr, bptr.length()); + return false; + } + return true; +} + BlockRBManager::write_ertr::future<> BlockRBManager::write( paddr_t paddr, bufferptr &bptr) { - LOG_PREFIX(BlockRBManager::write); ceph_assert(device); rbm_abs_addr addr = convert_paddr_to_abs_addr(paddr); - rbm_abs_addr start = device->get_shard_start(); - rbm_abs_addr end = device->get_shard_end(); - if (addr < start || addr + bptr.length() > end) { - ERROR("out of range: start {}, end {}, addr {}, length {}", - start, end, addr, bptr.length()); + if (!check_valid_range(addr, bptr)) { return crimson::ct_error::erange::make(); } bufferptr bp = bufferptr(ceph::buffer::create_page_aligned(bptr.length())); @@ -140,14 +147,9 @@ BlockRBManager::read_ertr::future<> BlockRBManager::read( paddr_t paddr, bufferptr &bptr) { - LOG_PREFIX(BlockRBManager::read); ceph_assert(device); rbm_abs_addr addr = convert_paddr_to_abs_addr(paddr); - rbm_abs_addr start = device->get_shard_start(); - rbm_abs_addr end = device->get_shard_end(); - if (addr < start || addr + bptr.length() > end) { - ERROR("out of range: start {}, end {}, addr {}, length {}", - start, end, addr, bptr.length()); + if (!check_valid_range(addr, bptr)) { return crimson::ct_error::erange::make(); } return device->read( diff --git a/src/crimson/os/seastore/random_block_manager/block_rb_manager.h b/src/crimson/os/seastore/random_block_manager/block_rb_manager.h index f61db6173705..877b2a076628 100644 --- a/src/crimson/os/seastore/random_block_manager/block_rb_manager.h +++ b/src/crimson/os/seastore/random_block_manager/block_rb_manager.h @@ -127,6 +127,8 @@ public: return device->get_journal_size(); } + bool check_valid_range(rbm_abs_addr paddr, bufferptr &bptr); + #ifdef UNIT_TESTS_BUILT void prefill_fragmented_device() final; #endif