return new Journal<ImageCtx>(*this);
}
+ void ImageCtx::set_image_name(const std::string &image_name) {
+ // update the name so rename can be invoked repeatedly
+ RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
+ RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
+ name = image_name;
+ if (old_format) {
+ header_oid = util::old_header_name(image_name);
+ }
+ }
+
void ImageCtx::notify_update() {
state->handle_update_notification();
void clear_pending_completions();
+ void set_image_name(const std::string &name);
+
void notify_update();
void notify_update(Context *on_finish);
};
return r;
}
}
+
+ m_image_ctx.set_image_name(dstname);
return 0;
}
return true;
}
+ if (m_state == STATE_REMOVE_SOURCE_HEADER) {
+ apply();
+ return true;
+ }
+
RWLock::RLocker owner_lock(image_ctx.owner_lock);
- bool finished = false;
switch (m_state) {
case STATE_READ_SOURCE_HEADER:
send_write_destination_header();
case STATE_UPDATE_DIRECTORY:
send_remove_source_header();
break;
- case STATE_REMOVE_SOURCE_HEADER:
- finished = true;
- break;
default:
assert(false);
break;
}
- return finished;
+ return false;
}
template <typename I>
rados_completion->release();
}
+template <typename I>
+void RenameRequest<I>::apply() {
+ I &image_ctx = this->m_image_ctx;
+ image_ctx.set_image_name(m_dest_name);
+}
+
} // namespace operation
} // namespace librbd
void send_update_directory();
void send_remove_source_header();
+ void apply();
};
} // namespace operation