]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/cache/pwl/ssd: ensure bdev and pool sizes match 41968/head
authorIlya Dryomov <idryomov@gmail.com>
Sat, 14 Aug 2021 17:15:47 +0000 (19:15 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 17 Aug 2021 11:06:26 +0000 (13:06 +0200)
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>
src/librbd/cache/pwl/ssd/WriteLog.cc
src/librbd/cache/pwl/ssd/WriteLog.h

index 9b7cfc9fc74ffe3f1a8525c3bd3c5cf4158bf9d2..6e98448fc1474b98967d2e69c44ecc165d85828c 100644 (file)
@@ -94,10 +94,37 @@ void WriteLog<I>::complete_read(
   }
 }
 
+template <typename I>
+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) {
-  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<I>::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<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 1a7a5e7a11629228f859a574820cd06c4153fbb7..bcd4daf809b1e9b3f05606fb26ae4ab4442565aa 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,