From: Dongsheng Yang Date: Thu, 30 Jun 2016 07:59:25 +0000 (-0400) Subject: librbd: introduce a new api of snap_remove2 X-Git-Tag: ses5-milestone5~282^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a3a547fc03e0c86d623bb85eef742f457aa06b8f;p=ceph.git librbd: introduce a new api of snap_remove2 currently, we only have one api for snap_remove, but if we want to pass more options about snapshot removal, that's impossible. This patch introduce a new api of snap_remove2 here to solve this problem. Signed-off-by: Dongsheng Yang --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index e0fc9ded74de..2a9a84d2b333 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -72,6 +72,8 @@ typedef struct { #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. diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 70fecc2614b0..ea7a715eeca1 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -257,6 +257,7 @@ public: 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); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 05a42713cb46..4d64dde6ab6f 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2264,6 +2264,32 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, 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, diff --git a/src/librbd/internal.h b/src/librbd/internal.h index 4d7771cb35fb..d8ae5e44af53 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -142,6 +142,7 @@ namespace librbd { 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, diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index eca3134e673b..9d559a1ea06f 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -936,7 +936,16 @@ namespace librbd { { 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; } @@ -2217,6 +2226,15 @@ extern "C" int rbd_snap_remove(rbd_image_t image, const char *snap_name) 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; diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index 2652ae9fed61..45330a3d2ee7 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -1089,6 +1089,32 @@ TRACEPOINT_EVENT(librbd, snap_remove_exit, ) ) +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,