]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: race initializing exclusive lock and configuring IO path 13086/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 24 Jan 2017 15:34:05 +0000 (10:34 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 24 Jan 2017 15:34:05 +0000 (10:34 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ExclusiveLock.cc
src/librbd/ExclusiveLock.h

index 593537ce0150bef4f1e482fb373fdb07e8816b19..bd136a7aed7894cfa19baa22030faef1af88d01c 100644 (file)
@@ -83,10 +83,8 @@ void ExclusiveLock<I>::init(uint64_t features, Context *on_init) {
     ML<I>::set_state_initializing();
   }
 
-  m_image_ctx.aio_work_queue->block_writes(new C_InitComplete(this, on_init));
-  if ((features & RBD_FEATURE_JOURNALING) != 0) {
-    m_image_ctx.aio_work_queue->set_require_lock_on_read();
-  }
+  m_image_ctx.aio_work_queue->block_writes(new C_InitComplete(this, features,
+                                                              on_init));
 }
 
 template <typename I>
@@ -114,8 +112,12 @@ void ExclusiveLock<I>::handle_peer_notification(int r) {
 }
 
 template <typename I>
-void ExclusiveLock<I>::handle_init_complete() {
-  ldout(m_image_ctx.cct, 10) << dendl;
+void ExclusiveLock<I>::handle_init_complete(uint64_t features) {
+  ldout(m_image_ctx.cct, 10) << "features=" << features << dendl;
+
+  if ((features & RBD_FEATURE_JOURNALING) != 0) {
+    m_image_ctx.aio_work_queue->set_require_lock_on_read();
+  }
 
   Mutex::Locker locker(ML<I>::m_lock);
   ML<I>::set_state_unlocked();
@@ -291,6 +293,24 @@ void ExclusiveLock<I>::post_release_lock_handler(bool shutting_down, int r,
   on_finish->complete(r);
 }
 
+template <typename I>
+struct ExclusiveLock<I>::C_InitComplete : public Context {
+  ExclusiveLock *exclusive_lock;
+  uint64_t features;
+  Context *on_init;
+
+  C_InitComplete(ExclusiveLock *exclusive_lock, uint64_t features,
+                 Context *on_init)
+    : exclusive_lock(exclusive_lock), features(features), on_init(on_init) {
+  }
+  virtual void finish(int r) override {
+    if (r == 0) {
+      exclusive_lock->handle_init_complete(features);
+    }
+    on_init->complete(r);
+  }
+};
+
 } // namespace librbd
 
 template class librbd::ExclusiveLock<librbd::ImageCtx>;
index c03cf6414d2db4c7972e365792ed07f68bd7bd40..9947fe380ad72ebfc70f284e60badc5fe210a3e5 100644 (file)
@@ -77,19 +77,7 @@ private:
    * @endverbatim
    */
 
-  struct C_InitComplete : public Context {
-    ExclusiveLock *exclusive_lock;
-    Context *on_init;
-    C_InitComplete(ExclusiveLock *exclusive_lock, Context *on_init)
-      : exclusive_lock(exclusive_lock), on_init(on_init) {
-    }
-    virtual void finish(int r) override {
-      if (r == 0) {
-        exclusive_lock->handle_init_complete();
-      }
-      on_init->complete(r);
-    }
-  };
+  struct C_InitComplete;
 
   ImageCtxT& m_image_ctx;
   Context *m_pre_post_callback = nullptr;
@@ -99,7 +87,7 @@ private:
 
   int m_acquire_lock_peer_ret_val = 0;
 
-  void handle_init_complete();
+  void handle_init_complete(uint64_t features);
   void handle_post_acquiring_lock(int r);
   void handle_post_acquired_lock(int r);
 };