#define RBD_MAX_IMAGE_NAME_SIZE 96
#define RBD_MAX_BLOCK_NAME_SIZE 24
+#define RBD_SNAP_REMOVE_UNPROTECT 1 << 0
+
/**
* These types used to in set_image_notification to indicate the type of event
* socket passed in.
int snap_exists2(const char *snapname, bool *exists);
int snap_create(const char *snapname);
int snap_remove(const char *snapname);
+ int snap_remove2(const char *snapname, uint32_t flags);
int snap_rollback(const char *snap_name);
int snap_rollback_with_progress(const char *snap_name, ProgressContext& pctx);
int snap_protect(const char *snap_name);
return 0;
}
+ int snap_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags)
+ {
+ ldout(ictx->cct, 20) << "snap_remove " << ictx << " " << snap_name << " flags: " << flags << dendl;
+
+ int r = 0;
+
+retry:
+ r = ictx->state->refresh_if_required();
+ if (r < 0)
+ return r;
+
+ C_SaferCond ctx;
+ ictx->operations->snap_remove(snap_name, &ctx);
+
+ r = ctx.wait();
+ if (r < 0) {
+ if (r == -EBUSY && (flags & RBD_SNAP_REMOVE_UNPROTECT)) {
+ r = ictx->operations->snap_unprotect(snap_name);
+ goto retry;
+ }
+ return r;
+ }
+
+ return r;
+ }
+
int snap_get_limit(ImageCtx *ictx, uint64_t *limit)
{
return cls_client::snapshot_get_limit(&ictx->md_ctx, ictx->header_oid,
int snap_exists(ImageCtx *ictx, const char *snap_name, bool *exists);
int snap_get_limit(ImageCtx *ictx, uint64_t *limit);
int snap_set_limit(ImageCtx *ictx, uint64_t limit);
+ int snap_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags);
int snap_is_protected(ImageCtx *ictx, const char *snap_name,
bool *is_protected);
int copy(ImageCtx *ictx, IoCtx& dest_md_ctx, const char *destname,
{
ImageCtx *ictx = (ImageCtx *)ctx;
tracepoint(librbd, snap_remove_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, snap_name);
- int r = ictx->operations->snap_remove(snap_name);
+ int r = librbd::snap_remove(ictx, snap_name, 0);
+ tracepoint(librbd, snap_remove_exit, r);
+ return r;
+ }
+
+ int Image::snap_remove2(const char *snap_name, uint32_t flags)
+ {
+ ImageCtx *ictx = (ImageCtx *)ctx;
+ tracepoint(librbd, snap_remove2_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, snap_name, flags);
+ int r = librbd::snap_remove(ictx, snap_name, flags);
tracepoint(librbd, snap_remove_exit, r);
return r;
}
return r;
}
+extern "C" int rbd_snap_remove2(rbd_image_t image, const char *snap_name, uint32_t flags)
+{
+ librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
+ tracepoint(librbd, snap_remove2_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, snap_name, flags);
+ int r = librbd::snap_remove(ictx, snap_name, flags);
+ tracepoint(librbd, snap_remove_exit, r);
+ return r;
+}
+
extern "C" int rbd_snap_rollback(rbd_image_t image, const char *snap_name)
{
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
)
)
+TRACEPOINT_EVENT(librbd, snap_remove2_enter,
+ TP_ARGS(
+ void*, imagectx,
+ const char*, name,
+ const char*, snap_name,
+ char, read_only,
+ const char*, remove_snap_name,
+ uint32_t, flags),
+ TP_FIELDS(
+ ctf_integer_hex(void*, imagectx, imagectx)
+ ctf_string(name, name)
+ ctf_string(snap_name, snap_name)
+ ctf_integer(char, read_only, read_only)
+ ctf_string(remove_snap_name, remove_snap_name)
+ ctf_integer(uint32_t, flags, flags)
+ )
+)
+
+TRACEPOINT_EVENT(librbd, snap_remove2_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
TRACEPOINT_EVENT(librbd, snap_rollback_enter,
TP_ARGS(
void*, imagectx,