This is needed to allow an atomic compare and update operation
from the rebuild object map utility.
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit
2db758cb4cb6d88cbaf9842b1e5d0872a185d8df)
m_state = LIBRBD_AIO_WRITE_PRE;
FunctionContext *ctx = new FunctionContext(
boost::bind(&AioRequest::complete, this, _1));
+ RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
if (!m_ictx->object_map.aio_update(m_object_no, new_state,
current_state, ctx)) {
// no object map update required
m_state = LIBRBD_AIO_WRITE_POST;
FunctionContext *ctx = new FunctionContext(
boost::bind(&AioRequest::complete, this, _1));
+ RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
if (!m_ictx->object_map.aio_update(m_object_no, OBJECT_NONEXISTENT,
OBJECT_PENDING, ctx)) {
// no object map update required
} else {
// flag the objects as pending deletion
Context *ctx = create_callback_context();
+ RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
if (!m_image_ctx.object_map.aio_update(m_delete_start, m_num_objects,
OBJECT_PENDING, OBJECT_EXISTS,
ctx)) {
} else {
// flag the pending objects as removed
Context *ctx = create_callback_context();
+ RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
if (!m_image_ctx.object_map.aio_update(m_delete_start, m_num_objects,
OBJECT_NONEXISTENT,
OBJECT_PENDING, ctx)) {
} else {
m_state = STATE_OBJECT_MAP;
Context *ctx = create_callback_context();
+ RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
if (!m_ictx->object_map.aio_update(m_object_no, OBJECT_EXISTS,
boost::optional<uint8_t>(), ctx)) {
delete ctx;
assert(m_image_ctx.owner_lock.is_locked());
assert(m_image_ctx.image_watcher != NULL);
assert(m_image_ctx.image_watcher->is_lock_owner());
- assert(start_object_no < end_object_no);
-
- RWLock::WLocker l(m_image_ctx.object_map_lock);
+ assert(m_image_ctx.object_map_lock.is_wlocked());
assert(start_object_no < end_object_no);
CephContext *cct = m_image_ctx.cct;