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: v17.1.0~1087^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=41b95ac987954dc2c29090926236660b8348e9d2;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 --- diff --git a/src/librbd/cache/pwl/ssd/WriteLog.cc b/src/librbd/cache/pwl/ssd/WriteLog.cc index 9b7cfc9fc74ff..6e98448fc1474 100644 --- a/src/librbd/cache/pwl/ssd/WriteLog.cc +++ b/src/librbd/cache/pwl/ssd/WriteLog.cc @@ -94,10 +94,37 @@ void WriteLog::complete_read( } } +template +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) { - CephContext *cct = m_image_ctx.cct; + 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 @@ bool WriteLog::initialize_pool(Context *on_finish, return false; } - 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; } @@ -164,12 +187,8 @@ bool 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 1a7a5e7a11629..bcd4daf809b1e 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,