From: Dan Mick Date: Tue, 4 Dec 2012 04:59:17 +0000 (-0800) Subject: librbd: hold AioCompletion lock while modifying global state X-Git-Tag: v0.56~106 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a55700cc0aea0ff79e55c6bf78e9757b81fe9425;p=ceph.git librbd: hold AioCompletion lock while modifying global state C_AioRead::finish needs to add in each chunk of a partial read request to the 'partial' map in the AioCompletion's state (in destriper, of type StripedReadResult). That map is global and must be protected from simultaneous access. Use the AioCompletion lock; could create a separate lock if contention is an issue. Fixes: #3567 Signed-off-by: Dan Mick --- diff --git a/src/librbd/AioCompletion.cc b/src/librbd/AioCompletion.cc index 082a08eb6517..86b5b504ebd3 100644 --- a/src/librbd/AioCompletion.cc +++ b/src/librbd/AioCompletion.cc @@ -88,10 +88,11 @@ namespace librbd { if (m_req->m_ext_map.empty()) m_req->m_ext_map[m_req->m_object_off] = m_req->data().length(); - m_completion->destriper.add_partial_sparse_result(m_cct, - m_req->data(), - m_req->m_ext_map, m_req->m_object_off, - m_req->m_buffer_extents); + m_completion->lock.Lock(); + m_completion->destriper.add_partial_sparse_result( + m_cct, m_req->data(), m_req->m_ext_map, m_req->m_object_off, + m_req->m_buffer_extents); + m_completion->lock.Unlock(); r = m_req->m_object_len; } m_completion->complete_request(m_cct, r);