summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/librbd/internal.cc24
1 files changed, 14 insertions, 10 deletions
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)