From 125aab8dc4300dc9c67b2d4ca219cfbd60ab0924 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 27 Apr 2016 15:56:11 -0400 Subject: [PATCH] librbd: propagate any image refresh errors back to caller Previously, the saved error code was only propagated when an image flush was required. Signed-off-by: Jason Dillaman (cherry picked from commit 105ef8a24aa6ac8719f68c5a9366129ddb41ee88) --- src/librbd/image/RefreshRequest.cc | 15 +++++++++++++++ src/librbd/image/RefreshRequest.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index ecb7cae7bdf4d..7d9ab78440a08 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -736,7 +736,14 @@ Context *RefreshRequest::send_flush_aio() { klass, &klass::handle_flush_aio>(this); m_image_ctx.flush(ctx); return nullptr; + } else if (m_error_result < 0) { + // propagate saved error back to caller + Context *ctx = create_context_callback< + RefreshRequest, &RefreshRequest::handle_error>(this); + m_image_ctx.op_work_queue->queue(ctx, 0); + return nullptr; } + return m_on_finish; } @@ -750,8 +757,16 @@ Context *RefreshRequest::handle_flush_aio(int *result) { << dendl; } + return handle_error(result); +} + +template +Context *RefreshRequest::handle_error(int *result) { if (m_error_result < 0) { *result = m_error_result; + + CephContext *cct = m_image_ctx.cct; + ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl; } return m_on_finish; } diff --git a/src/librbd/image/RefreshRequest.h b/src/librbd/image/RefreshRequest.h index 71fe50979e222..fac07fbca54d6 100644 --- a/src/librbd/image/RefreshRequest.h +++ b/src/librbd/image/RefreshRequest.h @@ -178,6 +178,8 @@ private: Context *send_flush_aio(); Context *handle_flush_aio(int *result); + Context *handle_error(int *result); + void save_result(int *result) { if (m_error_result == 0 && *result < 0) { m_error_result = *result; -- 2.39.5