]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/cache/pwl/ssd: ensure bdev and pool sizes match
authorIlya Dryomov <idryomov@gmail.com>
Sat, 14 Aug 2021 17:15:47 +0000 (19:15 +0200)
committerDeepika Upadhyay <dupadhya@redhat.com>
Fri, 5 Nov 2021 09:22:02 +0000 (14:52 +0530)
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 <idryomov@gmail.com>
(cherry picked from commit 41b95ac987954dc2c29090926236660b8348e9d2)

src/librbd/cache/pwl/ssd/WriteLog.cc
src/librbd/cache/pwl/ssd/WriteLog.h

index 36a1f9357827a60f8aa8aeb065a499432d84ea8c..df25cd1c36a9e1c7b9d8aa10e76136f6f5886eec 100644 (file)
@@ -95,9 +95,36 @@ void WriteLog<I>::complete_read(
 }
 
 template <typename I>
-void WriteLog<I>::initialize_pool(Context *on_finish,
-                                  pwl::DeferredContexts &later) {
+int WriteLog<I>::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 <typename I>
+bool WriteLog<I>::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<I>::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<I>::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<void*>(this), nullptr, static_cast<void*>(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;
     }
index 38b8bc8d90bd4a6d9862b911f3e4e68b1503251a..83633dabf425e9e4133851fd617b9ba666b01ea6 100644 (file)
@@ -105,6 +105,7 @@ private:
   Builder<This> *m_builderobj;
 
   Builder<This>* create_builder();
+  int create_and_open_bdev();
   void load_existing_entries(pwl::DeferredContexts &later);
   void collect_read_extents(
       uint64_t read_buffer_offset, LogMapEntry<GenericWriteLogEntry> map_entry,