From: Jon Bernard Date: Thu, 2 Jun 2016 01:01:30 +0000 (-0400) Subject: librbd: refresh image if needed in mirror functions X-Git-Tag: v10.2.2~21^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=bb279f1b288f1069b83d7661588f883716c80d9d;p=ceph.git librbd: refresh image if needed in mirror functions Fixes: http://tracker.ceph.com/issues/16096 Signed-off-by: Jon Bernard (cherry picked from commit a355c8f6d9e792517a8d0e096a99a64474369cfc) --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 2445bdacd3bab..cfed78d4c99ee 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2775,8 +2775,13 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, CephContext *cct = ictx->cct; ldout(cct, 20) << "mirror_image_enable " << ictx << dendl; + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + cls::rbd::MirrorMode mirror_mode; - int r = cls_client::mirror_mode_get(&ictx->md_ctx, &mirror_mode); + r = cls_client::mirror_mode_get(&ictx->md_ctx, &mirror_mode); if (r < 0) { lderr(cct) << "cannot enable mirroring: failed to retrieve mirror mode: " << cpp_strerror(r) << dendl; @@ -2800,8 +2805,13 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, CephContext *cct = ictx->cct; ldout(cct, 20) << "mirror_image_disable " << ictx << dendl; + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + cls::rbd::MirrorMode mirror_mode; - int r = cls_client::mirror_mode_get(&ictx->md_ctx, &mirror_mode); + r = cls_client::mirror_mode_get(&ictx->md_ctx, &mirror_mode); if (r < 0) { lderr(cct) << "cannot disable mirroring: failed to retrieve pool " "mirroring mode: " << cpp_strerror(r) << dendl; @@ -2826,7 +2836,12 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, ldout(cct, 20) << __func__ << ": ictx=" << ictx << ", " << "force=" << force << dendl; - int r = validate_mirroring_enabled(ictx); + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + + r = validate_mirroring_enabled(ictx); if (r < 0) { return r; } @@ -2861,7 +2876,12 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, CephContext *cct = ictx->cct; ldout(cct, 20) << __func__ << ": ictx=" << ictx << dendl; - int r = validate_mirroring_enabled(ictx); + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + + r = validate_mirroring_enabled(ictx); if (r < 0) { return r; } @@ -2918,7 +2938,12 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, CephContext *cct = ictx->cct; ldout(cct, 20) << __func__ << ": ictx=" << ictx << dendl; - int r = validate_mirroring_enabled(ictx); + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + + r = validate_mirroring_enabled(ictx); if (r < 0) { return r; } @@ -2952,8 +2977,13 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, return -ERANGE; } + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + cls::rbd::MirrorImage mirror_image_internal; - int r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id, + r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id, &mirror_image_internal); if (r < 0 && r != -ENOENT) { lderr(cct) << "failed to retrieve mirroring state: " << cpp_strerror(r) @@ -2991,8 +3021,13 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, return -ERANGE; } + int r = ictx->state->refresh_if_required(); + if (r < 0) { + return r; + } + mirror_image_info_t info; - int r = mirror_image_get_info(ictx, &info, sizeof(info)); + r = mirror_image_get_info(ictx, &info, sizeof(info)); if (r < 0) { return r; }