]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: require callers to ObjectMap::aio_update to acquire lock
authorJason Dillaman <dillaman@redhat.com>
Thu, 19 Mar 2015 19:35:59 +0000 (15:35 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 28 Jul 2015 20:35:19 +0000 (16:35 -0400)
This is needed to allow an atomic compare and update operation
from the rebuild object map utility.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 2db758cb4cb6d88cbaf9842b1e5d0872a185d8df)

src/librbd/AioRequest.cc
src/librbd/AsyncTrimRequest.cc
src/librbd/CopyupRequest.cc
src/librbd/ObjectMap.cc

index d52cd5da8ee2ed52309f9dd102b4c75a0c367115..33908a4dfaaa909008ad72750e2a712d55d32104 100644 (file)
@@ -467,6 +467,7 @@ namespace librbd {
         m_state = LIBRBD_AIO_WRITE_PRE;
         FunctionContext *ctx = new FunctionContext(
           boost::bind(&AioRequest::complete, this, _1));
+        RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
         if (!m_ictx->object_map.aio_update(m_object_no, new_state,
                                            current_state, ctx)) {
          // no object map update required
@@ -501,6 +502,7 @@ namespace librbd {
     m_state = LIBRBD_AIO_WRITE_POST;
     FunctionContext *ctx = new FunctionContext(
       boost::bind(&AioRequest::complete, this, _1));
+    RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
     if (!m_ictx->object_map.aio_update(m_object_no, OBJECT_NONEXISTENT,
                                        OBJECT_PENDING, ctx)) {
       // no object map update required
index cb4764a22fd977267faf31ab818648ac6c765357..af325f612f57f574f776fbf2b955039bd205c2dc 100644 (file)
@@ -173,6 +173,7 @@ void AsyncTrimRequest::send_pre_remove() {
       } else {
         // flag the objects as pending deletion
         Context *ctx = create_callback_context();
+        RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
         if (!m_image_ctx.object_map.aio_update(m_delete_start, m_num_objects,
                                               OBJECT_PENDING, OBJECT_EXISTS,
                                                ctx)) {
@@ -210,6 +211,7 @@ bool AsyncTrimRequest::send_post_remove() {
       } else {
         // flag the pending objects as removed
         Context *ctx = create_callback_context();
+        RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
         if (!m_image_ctx.object_map.aio_update(m_delete_start, m_num_objects,
                                               OBJECT_NONEXISTENT,
                                               OBJECT_PENDING, ctx)) {
index 3d780c6cc1b635bd1dbd6e94ba076b1dd540b9c6..2f56c49ae0116891f7cf9f65291d140a9c9025d5 100644 (file)
@@ -179,6 +179,7 @@ namespace librbd {
       } else {
        m_state = STATE_OBJECT_MAP;
         Context *ctx = create_callback_context();
+        RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
         if (!m_ictx->object_map.aio_update(m_object_no, OBJECT_EXISTS,
                                           boost::optional<uint8_t>(), ctx)) {
           delete ctx;
index c2ca798b584ff9c45da0a55c574e60bb1f62e74d..9da30cc2e08521be5ec3804e271a0e6ef41a772c 100644 (file)
@@ -299,9 +299,7 @@ bool ObjectMap::aio_update(uint64_t start_object_no, uint64_t end_object_no,
   assert(m_image_ctx.owner_lock.is_locked());
   assert(m_image_ctx.image_watcher != NULL);
   assert(m_image_ctx.image_watcher->is_lock_owner());
-  assert(start_object_no < end_object_no);
-
-  RWLock::WLocker l(m_image_ctx.object_map_lock);
+  assert(m_image_ctx.object_map_lock.is_wlocked());
   assert(start_object_no < end_object_no);
   
   CephContext *cct = m_image_ctx.cct;