From: Jason Dillaman Date: Fri, 22 May 2015 02:59:07 +0000 (-0400) Subject: librbd: diff_iterate should handle callback errors X-Git-Tag: v9.1.0~370^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=368f63206d0f8d0e73de3421aad1779a7dbbf0ca;p=ceph.git librbd: diff_iterate should handle callback errors If the diff_iterate callback returns an error, it should result in diff_iterate being aborted with the error code propagated. Fixes: #11593 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/DiffIterate.cc b/src/librbd/DiffIterate.cc index 35ebfecb0479..00a9ebae2b72 100644 --- a/src/librbd/DiffIterate.cc +++ b/src/librbd/DiffIterate.cc @@ -64,8 +64,14 @@ public: for (Diffs::const_iterator d = diffs.begin(); d != diffs.end(); ++d) { m_lock.Unlock(); - m_callback(d->get<0>(), d->get<1>(), d->get<2>(), m_callback_arg); + int r = m_callback(d->get<0>(), d->get<1>(), d->get<2>(), + m_callback_arg); m_lock.Lock(); + + if (m_return_value == 0 && r < 0) { + m_return_value = r; + return m_return_value; + } } ++m_waiting_request; } @@ -360,7 +366,10 @@ int DiffIterate::execute() { OBJECT_DIFF_STATE_UPDATED); for (std::vector::iterator q = p->second.begin(); q != p->second.end(); ++q) { - m_callback(off + q->offset, q->length, updated, m_callback_arg); + r = m_callback(off + q->offset, q->length, updated, m_callback_arg); + if (r < 0) { + return r; + } } } } else {