summaryrefslogtreecommitdiff
path: root/src/cls_rbd.cc
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2010-05-14 16:47:22 -0700
committerYehuda Sadeh <yehuda@hq.newdream.net>2010-06-10 14:45:39 -0700
commit4716b4865294c93e6feeb09980f21981fe1e7cf7 (patch)
tree11506e1866d8f2f16e4dbe1f396c79d221e83d53 /src/cls_rbd.cc
parentb58e1b9a4b6a9b02f7513c38b3dd23019eb4f76a (diff)
downloadceph-4716b4865294c93e6feeb09980f21981fe1e7cf7.tar.gz
rbd: snapshots management via class mechanism
Diffstat (limited to 'src/cls_rbd.cc')
-rw-r--r--src/cls_rbd.cc73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/cls_rbd.cc b/src/cls_rbd.cc
new file mode 100644
index 00000000000..129569b66ad
--- /dev/null
+++ b/src/cls_rbd.cc
@@ -0,0 +1,73 @@
+
+
+
+#include <iostream>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <openssl/md5.h>
+#include <openssl/sha.h>
+
+#include "include/types.h"
+#include "objclass/objclass.h"
+
+#include "include/rbd_types.h"
+
+CLS_VER(1,0)
+CLS_NAME(rbd)
+
+cls_handle_t h_class;
+cls_method_handle_t h_snapshots_list;
+
+int snapshots_list(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
+{
+ int snap_count = 0;
+ uint64_t snap_names_len = 0;
+ int rc;
+ struct rbd_obj_header_ondisk *header;
+ bufferlist bl;
+
+ cls_log("snapshots_list");
+
+ while (1) {
+ int len = sizeof(*header) +
+ snap_count * sizeof(struct rbd_obj_snap_ondisk) +
+ snap_names_len;
+
+ rc = cls_cxx_read(hctx, 0, len, &bl);
+ if (rc < 0)
+ return rc;
+
+ header = (struct rbd_obj_header_ondisk *)bl.c_str();
+
+ if ((snap_count != header->snap_count) ||
+ (snap_names_len != header->snap_names_len)) {
+ snap_count = header->snap_count;
+ snap_names_len = header->snap_names_len;
+ bl.clear();
+ continue;
+ }
+ break;
+ }
+
+ bufferptr p(snap_names_len);
+ memcpy(p.c_str(),
+ bl.c_str() + sizeof(*header) + snap_count * sizeof(struct rbd_obj_snap_ondisk),
+ snap_names_len);
+
+ out->push_back(p);
+
+ return snap_count;
+}
+
+void class_init()
+{
+ cls_log("Loaded rbd class!");
+
+ cls_register("rbd", &h_class);
+ cls_register_cxx_method(h_class, "snap_list", CLS_METHOD_RD, snapshots_list, &h_snapshots_list);
+
+ return;
+}
+