mirror of
https://github.com/ceph/ceph
synced 2025-01-20 18:21:57 +00:00
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:
parent
e0858fa899
commit
c4370ff03f
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user