This eliminates a window in which a race could occur when we have an
image open but no watch established. The previous fix (using
assert_version) did not work well with resend operations.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
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)