diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2010-05-14 16:47:22 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2010-06-10 14:45:39 -0700 |
commit | 4716b4865294c93e6feeb09980f21981fe1e7cf7 (patch) | |
tree | 11506e1866d8f2f16e4dbe1f396c79d221e83d53 /src/cls_rbd.cc | |
parent | b58e1b9a4b6a9b02f7513c38b3dd23019eb4f76a (diff) | |
download | ceph-4716b4865294c93e6feeb09980f21981fe1e7cf7.tar.gz |
rbd: snapshots management via class mechanism
Diffstat (limited to 'src/cls_rbd.cc')
-rw-r--r-- | src/cls_rbd.cc | 73 |
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; +} + |