From: Ilya Dryomov Date: Sat, 14 Aug 2021 17:15:47 +0000 (+0200) Subject: librbd/cache/pwl/ssd: ensure bdev and pool sizes match X-Git-Tag: v16.2.7~50^2~42 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=df2bafd1f09b170967803aa73fb81bdb6f640448;p=ceph.git librbd/cache/pwl/ssd: ensure bdev and pool sizes match m_log_pool_size should be multiple of 1M but, just in case, prevent is_valid_io() assert in KernelDevice::aio_write(). Signed-off-by: Ilya Dryomov (cherry picked from commit 41b95ac987954dc2c29090926236660b8348e9d2) --- diff --git a/src/librbd/cache/pwl/ssd/WriteLog.cc b/src/librbd/cache/pwl/ssd/WriteLog.cc index 36a1f9357827..df25cd1c36a9 100644 --- a/src/librbd/cache/pwl/ssd/WriteLog.cc +++ b/src/librbd/cache/pwl/ssd/WriteLog.cc @@ -95,9 +95,36 @@ void WriteLog::complete_read( } template -void WriteLog::initialize_pool(Context *on_finish, - pwl::DeferredContexts &later) { +int WriteLog::create_and_open_bdev() { CephContext *cct = m_image_ctx.cct; + + bdev = BlockDevice::create(cct, this->m_log_pool_name, aio_cache_cb, + nullptr, nullptr, nullptr); + int r = bdev->open(this->m_log_pool_name); + if (r < 0) { + lderr(cct) << "failed to open bdev" << dendl; + delete bdev; + return r; + } + + ceph_assert(this->m_log_pool_size % MIN_WRITE_ALLOC_SSD_SIZE == 0); + if (bdev->get_size() != this->m_log_pool_size) { + lderr(cct) << "size mismatch: bdev size " << bdev->get_size() + << " (block size " << bdev->get_block_size() + << ") != pool size " << this->m_log_pool_size << dendl; + bdev->close(); + delete bdev; + return -EINVAL; + } + + return 0; +} + +template +bool WriteLog::initialize_pool(Context *on_finish, + pwl::DeferredContexts &later) { + int r; + ceph_assert(ceph_mutex_is_locked_by_me(m_lock)); if (access(this->m_log_pool_name.c_str(), F_OK) != 0) { int fd = ::open(this->m_log_pool_name.c_str(), O_RDWR|O_CREAT, 0644); @@ -120,12 +147,8 @@ void WriteLog::initialize_pool(Context *on_finish, return; } - bdev = BlockDevice::create(cct, this->m_log_pool_name, aio_cache_cb, - nullptr, nullptr, nullptr); - int r = bdev->open(this->m_log_pool_name); + r = create_and_open_bdev(); if (r < 0) { - lderr(m_image_ctx.cct) << "fail to open block device." << dendl; - delete bdev; on_finish->complete(r); return false; } @@ -161,12 +184,8 @@ void WriteLog::initialize_pool(Context *on_finish, } } else { m_cache_state->present = true; - bdev = BlockDevice::create( - cct, this->m_log_pool_name, aio_cache_cb, - static_cast(this), nullptr, static_cast(this)); - int r = bdev->open(this->m_log_pool_name); + r = create_and_open_bdev(); if (r < 0) { - delete bdev; on_finish->complete(r); return false; } diff --git a/src/librbd/cache/pwl/ssd/WriteLog.h b/src/librbd/cache/pwl/ssd/WriteLog.h index 38b8bc8d90bd..83633dabf425 100644 --- a/src/librbd/cache/pwl/ssd/WriteLog.h +++ b/src/librbd/cache/pwl/ssd/WriteLog.h @@ -105,6 +105,7 @@ private: Builder *m_builderobj; Builder* create_builder(); + int create_and_open_bdev(); void load_existing_entries(pwl::DeferredContexts &later); void collect_read_extents( uint64_t read_buffer_offset, LogMapEntry map_entry,