librbd: establish watch before reading header

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>
This commit is contained in:
Josh Durgin 2013-01-02 14:15:24 -08:00
parent e0858fa899
commit c4370ff03f

View File

@ -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)