]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/cls/rbd/cls_rbd_client.cc
update sources to v12.1.0
[ceph.git] / ceph / src / cls / rbd / cls_rbd_client.cc
index 8d7307d404d80b00e807361345eab3e0e0d6faa2..88b5b3d0340e8aa7a90b0c5631ee6047d4e5d32b 100644 (file)
@@ -4,10 +4,9 @@
 #include "cls/rbd/cls_rbd_client.h"
 #include "cls/lock/cls_lock_client.h"
 #include "include/buffer.h"
-#include "include/Context.h"
 #include "include/encoding.h"
 #include "include/rbd_types.h"
-#include "common/Cond.h"
+#include "include/rados/librados.hpp"
 
 #include <errno.h>
 
@@ -916,6 +915,39 @@ namespace librbd {
       return ioctx->operate(oid, &op);
     }
 
+    void get_create_timestamp_start(librados::ObjectReadOperation *op) {
+      bufferlist empty_bl;
+      op->exec("rbd", "get_create_timestamp", empty_bl);
+    }
+
+    int get_create_timestamp_finish(bufferlist::iterator *it,
+                                    utime_t *timestamp) {
+      assert(timestamp);
+
+      try {
+        ::decode(*timestamp, *it);
+      } catch (const buffer::error &err) {
+        return -EBADMSG;
+      }
+      return 0;
+    }
+
+    int get_create_timestamp(librados::IoCtx *ioctx, const std::string &oid,
+                             utime_t *timestamp)
+    {
+      librados::ObjectReadOperation op;
+      get_create_timestamp_start(&op);
+
+      bufferlist out_bl;
+      int r = ioctx->operate(oid, &op, &out_bl);
+      if (r < 0) {
+        return r;
+      }
+
+      bufferlist::iterator it = out_bl.begin();
+      return get_create_timestamp_finish(&it, timestamp);
+    }
+
     /************************ rbd_id object methods ************************/
 
     void get_id_start(librados::ObjectReadOperation *op) {