diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index b69e40bbbdb..0b788136b0d 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1913,25 +1913,29 @@ reprotect_and_return_err: if (r < 0) return r; - ictx->md_lock.Lock(); - r = ictx_refresh(ictx); - ictx->md_lock.Unlock(); - if (r < 0) - return r; - - _snap_set(ictx, ictx->snap_name.c_str()); - if (!ictx->read_only) { r = ictx->register_watch(); if (r < 0) { lderr(ictx->cct) << "error registering a watch: " << cpp_strerror(r) << dendl; - close_image(ictx); - return r; + goto err_close; } } + ictx->md_lock.Lock(); + r = ictx_refresh(ictx); + ictx->md_lock.Unlock(); + if (r < 0) + goto err_close; + + if ((r = _snap_set(ictx, ictx->snap_name.c_str())) < 0) + goto err_close; + return 0; + + err_close: + close_image(ictx); + return r; } void close_image(ImageCtx *ictx)