]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix snap_exists API overflow issue
authorxiexingguo <xie.xingguo@zte.com.cn>
Sun, 20 Dec 2015 08:19:59 +0000 (16:19 +0800)
committerxiexingguo <xie.xingguo@zte.com.cn>
Sun, 20 Dec 2015 08:23:48 +0000 (16:23 +0800)
The original one may overflow and thus not be safe.

Fixes: #14129
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/include/rbd/librbd.hpp
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc
src/tracing/librbd.tp

index 288e450aab86ee0a743b09a488f75fee1d25f90b..d9bf1de65d091506c6fd50774bc58ecfbbe132a7 100644 (file)
@@ -206,7 +206,9 @@ public:
 
   /* snapshots */
   int snap_list(std::vector<snap_info_t>& snaps);
-  bool snap_exists(const char *snapname);
+  /* DEPRECATED; use snap_exists2 */
+  bool snap_exists(const char *snapname) __attribute__ ((deprecated));
+  int snap_exists2(const char *snapname, bool *exists);
   int snap_create(const char *snapname);
   int snap_remove(const char *snapname);
   int snap_rollback(const char *snap_name);
index abaf475e7e083caff9d05b0980868997d1d662fc..db39dbed9c6507f95d187b2e59e739a16b7dbcdd 100644 (file)
@@ -2223,7 +2223,7 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
     return 0;
   }
 
-  bool snap_exists(ImageCtx *ictx, const char *snap_name)
+  int snap_exists(ImageCtx *ictx, const char *snap_name, bool *exists)
   {
     ldout(ictx->cct, 20) << "snap_exists " << ictx << " " << snap_name << dendl;
 
@@ -2232,7 +2232,8 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
       return r;
 
     RWLock::RLocker l(ictx->snap_lock);
-    return ictx->get_snap_id(snap_name) != CEPH_NOSNAP;
+    *exists = ictx->get_snap_id(snap_name) != CEPH_NOSNAP; 
+    return 0;
   }
 
   int snap_rollback(ImageCtx *ictx, const char *snap_name,
index 81368a845678ee5ad235c8930d74e4b4aba6d44c..cbcc8b10c89c9fbc06b5597558edc3d8205404d8 100644 (file)
@@ -126,7 +126,7 @@ namespace librbd {
   int snap_create(ImageCtx *ictx, 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_exists(ImageCtx *ictx, const char *snap_name, bool *exists);
   int snap_rollback(ImageCtx *ictx, const char *snap_name,
                    ProgressContext& prog_ctx);
   int snap_remove(ImageCtx *ictx, const char *snap_name);
index d4edc227b7ea73d1176cb20503d2b598d53e3466..0807359af169ebd7cb80afa78b831b657cddc38b 100644 (file)
@@ -816,7 +816,27 @@ namespace librbd {
   bool Image::snap_exists(const char *snap_name)
   {
     ImageCtx *ictx = (ImageCtx *)ctx;
-    return librbd::snap_exists(ictx, snap_name);
+    tracepoint(librbd, snap_exists_enter, ictx, ictx->name.c_str(), 
+      ictx->snap_name.c_str(), ictx->read_only, snap_name);
+    bool exists; 
+    int r = librbd::snap_exists(ictx, snap_name, &exists);
+    tracepoint(librbd, snap_exists_exit, r, exists);
+    if (r < 0) {
+      // lie to caller since we don't know the real answer yet.
+      return false;
+    }
+    return exists;
+  }
+
+  // A safer verion of snap_exists.
+  int Image::snap_exists2(const char *snap_name, bool *exists)
+  {
+    ImageCtx *ictx = (ImageCtx *)ctx;
+    tracepoint(librbd, snap_exists_enter, ictx, ictx->name.c_str(), 
+      ictx->snap_name.c_str(), ictx->read_only, snap_name);
+    int r = librbd::snap_exists(ictx, snap_name, exists);
+    tracepoint(librbd, snap_exists_exit, r, *exists);
+    return r;
   }
 
   int Image::snap_set(const char *snap_name)
index 146e06ebc8d4d2cc72557e340e5d808f0b890d0b..58cbc13a78d8fa6526eb0ad87fe2db84e375a86d 100644 (file)
@@ -1217,6 +1217,32 @@ TRACEPOINT_EVENT(librbd, snap_is_protected_exit,
     )
 )
 
+TRACEPOINT_EVENT(librbd, snap_exists_enter,
+    TP_ARGS(
+        void*, imagectx,
+        const char*, name,
+        const char*, snap_name,
+        char, read_only,
+        const char*, snap_name_to_check),
+    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(snap_name_to_check, snap_name_to_check)
+    )
+)
+
+TRACEPOINT_EVENT(librbd, snap_exists_exit,
+    TP_ARGS(
+        int, retval,
+        int, exists),
+    TP_FIELDS(
+        ctf_integer(int, retval, retval)
+        ctf_integer(int, exists, exists)
+    )
+)
+
 TRACEPOINT_EVENT(librbd, snap_set_enter,
     TP_ARGS(
         void*, imagectx,