return 0;
}
-void ImageWatcher::cleanup_async_request(const AsyncRequestId& async_request_id,
- Context *ctx) {
- delete ctx;
-
- RWLock::WLocker l(m_async_request_lock);
- m_async_pending.erase(async_request_id);
-}
-
void ImageWatcher::handle_payload(const HeaderUpdatePayload &payload,
bufferlist *out) {
ldout(m_image_ctx.cct, 10) << this << " image header updated" << dendl;
if (new_request) {
ldout(m_image_ctx.cct, 10) << this << " remote flatten request: "
<< payload.async_request_id << dendl;
- r = librbd::async_flatten(&m_image_ctx, ctx, *prog_ctx);
- if (r < 0) {
- lderr(m_image_ctx.cct) << this << " remove flatten request failed: "
- << cpp_strerror(r) << dendl;
- cleanup_async_request(payload.async_request_id, ctx);
- }
+ librbd::async_flatten(&m_image_ctx, ctx, *prog_ctx);
}
::encode(ResponseMessage(r), *out);
ldout(m_image_ctx.cct, 10) << this << " remote resize request: "
<< payload.async_request_id << " "
<< payload.size << dendl;
- r = librbd::async_resize(&m_image_ctx, ctx, payload.size, *prog_ctx);
- if (r < 0) {
- lderr(m_image_ctx.cct) << this << " remove resize request failed: "
- << cpp_strerror(r) << dendl;
- cleanup_async_request(payload.async_request_id, ctx);
- }
+ librbd::async_resize(&m_image_ctx, ctx, payload.size, *prog_ctx);
}
::encode(ResponseMessage(r), *out);
ldout(m_image_ctx.cct, 10) << this << " remote snap_create request: "
<< payload.snap_name << dendl;
C_SaferCond cond_ctx;
- int r = librbd::snap_create_helper(&m_image_ctx, &cond_ctx,
- payload.snap_name.c_str());
- if (r == 0) {
- r = cond_ctx.wait();
- }
+ librbd::snap_create_helper(&m_image_ctx, &cond_ctx,
+ payload.snap_name.c_str());
+ int r = cond_ctx.wait();
::encode(ResponseMessage(r), *out);
}
}
RWLock::RLocker l(m_image_ctx.owner_lock);
if (m_lock_owner_state == LOCK_OWNER_STATE_LOCKED) {
ldout(m_image_ctx.cct, 10) << this << " remote snap_rename request: "
- << payload.src_snap_id << " to "
+ << payload.snap_id << " to "
<< payload.snap_name << dendl;
C_SaferCond cond_ctx;
- int r = librbd::snap_rename_helper(&m_image_ctx, &cond_ctx,
- payload.src_snap_id,
- payload.snap_name.c_str());
- if (r == 0) {
- r = cond_ctx.wait();
- }
+ librbd::snap_rename_helper(&m_image_ctx, &cond_ctx,
+ payload.snap_id,
+ payload.snap_name.c_str());
+ int r = cond_ctx.wait();
::encode(ResponseMessage(r), *out);
}
}
ldout(m_image_ctx.cct, 10) << this << " remote snap_remove request: "
<< payload.snap_name << dendl;
C_SaferCond cond_ctx;
- int r = librbd::snap_remove_helper(&m_image_ctx, &cond_ctx,
- payload.snap_name.c_str());
- if (r == 0) {
- r = cond_ctx.wait();
- }
+ librbd::snap_remove_helper(&m_image_ctx, &cond_ctx,
+ payload.snap_name.c_str());
+ int r = cond_ctx.wait();
::encode(ResponseMessage(r), *out);
}
}
ldout(m_image_ctx.cct, 10) << this
<< " remote rebuild object map request: "
<< payload.async_request_id << dendl;
- r = librbd::async_rebuild_object_map(&m_image_ctx, ctx, *prog_ctx);
- if (r < 0) {
- lderr(m_image_ctx.cct) << this
- << " remove rebuild object map request failed: "
- << cpp_strerror(r) << dendl;
- cleanup_async_request(payload.async_request_id, ctx);
- }
+ librbd::async_rebuild_object_map(&m_image_ctx, ctx, *prog_ctx);
}
::encode(ResponseMessage(0), *out);
int prepare_async_request(const watch_notify::AsyncRequestId& id,
bool* new_request, Context** ctx,
ProgressContext** prog_ctx);
- void cleanup_async_request(const watch_notify::AsyncRequestId& id,
- Context *ctx);
void handle_payload(const watch_notify::HeaderUpdatePayload& payload,
bufferlist *out);
int invoke_async_request(ImageCtx *ictx, const std::string& request_type,
bool permit_snapshot,
- const boost::function<int(Context*)>& local_request,
+ const boost::function<void(Context*)>& local_request,
const boost::function<int()>& remote_request) {
int r;
do {
<< dendl;
}
- r = local_request(&ctx);
- if (r < 0) {
- return r;
- }
+ local_request(&ctx);
}
r = ctx.wait();
return 0;
}
- int snap_create_helper(ImageCtx* ictx, Context* ctx, const char* snap_name) {
+ void snap_create_helper(ImageCtx* ictx, Context* ctx, const char* snap_name) {
assert(ictx->owner_lock.is_locked());
assert(!ictx->image_watcher->is_lock_supported() ||
ictx->image_watcher->is_lock_owner());
int r = ictx_check(ictx, ictx->owner_lock);
if (r < 0) {
- return r;
+ ctx->complete(r);
+ return;
}
operation::SnapshotCreateRequest *req =
new operation::SnapshotCreateRequest(*ictx, ctx, snap_name);
req->send();
- return 0;
}
int snap_remove(ImageCtx *ictx, const char *snap_name)
} else {
RWLock::RLocker owner_lock(ictx->owner_lock);
C_SaferCond cond_ctx;
- r = snap_remove_helper(ictx, &cond_ctx, snap_name);
- if (r < 0) {
- return r;
- }
+ snap_remove_helper(ictx, &cond_ctx, snap_name);
r = cond_ctx.wait();
if (r < 0) {
return 0;
}
- int snap_remove_helper(ImageCtx *ictx, Context *ctx, const char *snap_name)
+ void snap_remove_helper(ImageCtx *ictx, Context *ctx, const char *snap_name)
{
assert(ictx->owner_lock.is_locked());
{
int r = ictx_check(ictx, ictx->owner_lock);
if (r < 0) {
- return r;
+ ctx->complete(r);
+ return;
}
uint64_t snap_id;
snap_id = ictx->get_snap_id(snap_name);
if (snap_id == CEPH_NOSNAP) {
lderr(ictx->cct) << "No such snapshot found." << dendl;
- return -ENOENT;
+ ctx->complete(-ENOENT);
+ return;
}
bool is_protected;
operation::SnapshotRemoveRequest *req =
new operation::SnapshotRemoveRequest(*ictx, ctx, snap_name, snap_id);
req->send();
- return 0;
}
int snap_rename(ImageCtx *ictx, const char *srcname, const char *dstname)
return 0;
}
- int snap_rename_helper(ImageCtx* ictx, Context* ctx,
- const uint64_t src_snap_id, const char* dst_name) {
+ void snap_rename_helper(ImageCtx* ictx, Context* ctx,
+ const uint64_t src_snap_id, const char* dst_name) {
assert(ictx->owner_lock.is_locked());
if ((ictx->features & RBD_FEATURE_JOURNALING) != 0) {
assert(!ictx->image_watcher->is_lock_supported() ||
int r = ictx_check(ictx, ictx->owner_lock);
if (r < 0) {
- return r;
+ ctx->complete(r);
+ return;
}
operation::SnapshotRenameRequest *req =
new operation::SnapshotRenameRequest(*ictx, ctx, src_snap_id, dst_name);
req->send();
- return 0;
}
int snap_protect(ImageCtx *ictx, const char *snap_name)
return r;
}
- int async_resize(ImageCtx *ictx, Context *ctx, uint64_t size,
- ProgressContext &prog_ctx)
+ void async_resize(ImageCtx *ictx, Context *ctx, uint64_t size,
+ ProgressContext &prog_ctx)
{
assert(ictx->owner_lock.is_locked());
assert(!ictx->image_watcher->is_lock_supported() ||
int r = ictx_check(ictx, ictx->owner_lock);
if (r < 0) {
- return r;
+ ctx->complete(r);
+ return;
}
{
RWLock::RLocker snap_locker(ictx->snap_lock);
if (ictx->snap_id != CEPH_NOSNAP || ictx->read_only) {
- return -EROFS;
+ ctx->complete(-EROFS);
+ return;
}
}
- async_resize_helper(ictx, ctx, size, prog_ctx);
- return 0;
- }
-
- void async_resize_helper(ImageCtx *ictx, Context *ctx, uint64_t new_size,
- ProgressContext& prog_ctx)
- {
- assert(ictx->owner_lock.is_locked());
operation::ResizeRequest *req = new operation::ResizeRequest(
- *ictx, ctx, new_size, prog_ctx);
+ *ictx, ctx, size, prog_ctx);
req->send();
}
return 0;
}
- int async_flatten(ImageCtx *ictx, Context *ctx, ProgressContext &prog_ctx)
+ void async_flatten(ImageCtx *ictx, Context *ctx, ProgressContext &prog_ctx)
{
assert(ictx->owner_lock.is_locked());
assert(!ictx->image_watcher->is_lock_supported() ||
// ictx_check also updates parent data
if ((r = ictx_check(ictx, ictx->owner_lock)) < 0) {
lderr(cct) << "ictx_check failed" << dendl;
- return r;
+ ctx->complete(r);
+ return;
}
uint64_t object_size;
RWLock::RLocker l2(ictx->parent_lock);
if (ictx->read_only) {
- return -EROFS;
+ ctx->complete(-EROFS);
+ return;
}
// can't flatten a non-clone
if (ictx->parent_md.spec.pool_id == -1) {
lderr(cct) << "image has no parent" << dendl;
- return -EINVAL;
+ ctx->complete(-EINVAL);
+ return;
}
if (ictx->snap_id != CEPH_NOSNAP) {
lderr(cct) << "snapshots cannot be flattened" << dendl;
- return -EROFS;
+ ctx->complete(-EROFS);
+ return;
}
snapc = ictx->snapc;
operation::FlattenRequest *req = new operation::FlattenRequest(
*ictx, ctx, object_size, overlap_objects, snapc, prog_ctx);
req->send();
- return 0;
}
int rebuild_object_map(ImageCtx *ictx, ProgressContext &prog_ctx) {
return r;
}
- int async_rebuild_object_map(ImageCtx *ictx, Context *ctx,
- ProgressContext &prog_ctx) {
+ void async_rebuild_object_map(ImageCtx *ictx, Context *ctx,
+ ProgressContext &prog_ctx) {
assert(ictx->owner_lock.is_locked());
assert(!ictx->image_watcher->is_lock_supported() ||
ictx->image_watcher->is_lock_owner());
ldout(cct, 20) << "async_rebuild_object_map " << ictx << dendl;
if (ictx->read_only) {
- return -EROFS;
+ ctx->complete(-EROFS);
+ return;
}
if (!ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
- return -EINVAL;
+ ctx->complete(-EINVAL);
+ return;
}
int r = ictx_check(ictx, ictx->owner_lock);
if (r < 0) {
- return r;
+ ctx->complete(r);
+ return;
}
operation::RebuildObjectMapRequest *req =
new operation::RebuildObjectMapRequest(*ictx, ctx, prog_ctx);
req->send();
- return 0;
}
int list_lockers(ImageCtx *ictx,
ProgressContext& prog_ctx);
int resize(ImageCtx *ictx, uint64_t size, ProgressContext& prog_ctx);
int snap_create(ImageCtx *ictx, const char *snap_name);
- int snap_create_helper(ImageCtx *ictx, Context* ctx, const char *snap_name);
+ void snap_create_helper(ImageCtx *ictx, Context* ctx, const char *snap_name);
int snap_list(ImageCtx *ictx, std::vector<snap_info_t>& snaps);
bool snap_exists(ImageCtx *ictx, const char *snap_name);
int snap_rollback(ImageCtx *ictx, const char *snap_name,
ProgressContext& prog_ctx);
int snap_remove(ImageCtx *ictx, const char *snap_name);
- int snap_remove_helper(ImageCtx *ictx, Context* ctx, const char *snap_name);
+ void snap_remove_helper(ImageCtx *ictx, Context* ctx, const char *snap_name);
int snap_rename(ImageCtx *ictx, const char *srcname, const char *dstname);
- int snap_rename_helper(ImageCtx *ictx, Context* ctx,
- const uint64_t src_snap_id, const char *dst_name);
+ void snap_rename_helper(ImageCtx *ictx, Context* ctx,
+ const uint64_t src_snap_id, const char *dst_name);
int snap_protect(ImageCtx *ictx, const char *snap_name);
int snap_unprotect(ImageCtx *ictx, const char *snap_name);
int snap_is_protected(ImageCtx *ictx, const char *snap_name,
void readahead(ImageCtx *ictx,
const vector<pair<uint64_t,uint64_t> >& image_extents);
- int async_flatten(ImageCtx *ictx, Context *ctx, ProgressContext &prog_ctx);
- int async_resize(ImageCtx *ictx, Context *ctx, uint64_t size,
- ProgressContext &prog_ctx);
- void async_resize_helper(ImageCtx *ictx, Context *ctx, uint64_t new_size,
- ProgressContext& prog_ctx);
- int async_rebuild_object_map(ImageCtx *ictx, Context *ctx,
- ProgressContext &prog_ctx);
+ void async_flatten(ImageCtx *ictx, Context *ctx, ProgressContext &prog_ctx);
+ void async_resize(ImageCtx *ictx, Context *ctx, uint64_t size,
+ ProgressContext &prog_ctx);
+ void async_rebuild_object_map(ImageCtx *ictx, Context *ctx,
+ ProgressContext &prog_ctx);
int flush(ImageCtx *ictx);
int invalidate_cache(ImageCtx *ictx);