--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#ifndef __CEPH_CLS_RBD_H
+#define __CEPH_CLS_RBD_H
+
+#include "include/types.h"
+#include "include/buffer_fwd.h"
+#include "include/rbd_types.h"
+#include "common/Formatter.h"
+#include "cls/rbd/cls_rbd_types.h"
+
+/// information about our parent image, if any
+struct cls_rbd_parent {
+ int64_t pool; ///< parent pool id
+ string id; ///< parent image id
+ snapid_t snapid; ///< parent snapid we refer to
+ uint64_t overlap; ///< portion of this image mapped onto parent (bytes)
+
+ /// true if our parent pointer information is defined
+ bool exists() const {
+ return snapid != CEPH_NOSNAP && pool >= 0 && id.length() > 0 && overlap > 0;
+ }
+
+ cls_rbd_parent() : pool(-1), snapid(CEPH_NOSNAP), overlap(0) {}
+
+ void encode(bufferlist& bl) const {
+ ENCODE_START(1, 1, bl);
+ ::encode(pool, bl);
+ ::encode(id, bl);
+ ::encode(snapid, bl);
+ ::encode(overlap, bl);
+ ENCODE_FINISH(bl);
+ }
+ void decode(bufferlist::iterator& bl) {
+ DECODE_START(1, bl);
+ ::decode(pool, bl);
+ ::decode(id, bl);
+ ::decode(snapid, bl);
+ ::decode(overlap, bl);
+ DECODE_FINISH(bl);
+ }
+ void dump(Formatter *f) const {
+ f->dump_int("pool", pool);
+ f->dump_string("id", id);
+ f->dump_unsigned("snapid", snapid);
+ f->dump_unsigned("overlap", overlap);
+ }
+ static void generate_test_instances(list<cls_rbd_parent*>& o) {
+ o.push_back(new cls_rbd_parent);
+ cls_rbd_parent *t = new cls_rbd_parent;
+ t->pool = 1;
+ t->id = "foo";
+ t->snapid = 3;
+ t->overlap = 500;
+ o.push_back(t);
+ }
+};
+WRITE_CLASS_ENCODER(cls_rbd_parent)
+
+struct cls_rbd_snap {
+ snapid_t id;
+ string name;
+ uint64_t image_size;
+ uint64_t features;
+ uint8_t protection_status;
+ cls_rbd_parent parent;
+ uint64_t flags;
+ utime_t timestamp;
+ cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace = {
+ cls::rbd::UserSnapshotNamespace{}};
+
+ /// true if we have a parent
+ bool has_parent() const {
+ return parent.exists();
+ }
+
+ cls_rbd_snap() : id(CEPH_NOSNAP), image_size(0), features(0),
+ protection_status(RBD_PROTECTION_STATUS_UNPROTECTED),
+ flags(0), timestamp(utime_t())
+ {}
+ void encode(bufferlist& bl) const {
+ ENCODE_START(6, 1, bl);
+ ::encode(id, bl);
+ ::encode(name, bl);
+ ::encode(image_size, bl);
+ ::encode(features, bl);
+ ::encode(parent, bl);
+ ::encode(protection_status, bl);
+ ::encode(flags, bl);
+ ::encode(snapshot_namespace, bl);
+ ::encode(timestamp, bl);
+ ENCODE_FINISH(bl);
+ }
+ void decode(bufferlist::iterator& p) {
+ DECODE_START(6, p);
+ ::decode(id, p);
+ ::decode(name, p);
+ ::decode(image_size, p);
+ ::decode(features, p);
+ if (struct_v >= 2) {
+ ::decode(parent, p);
+ }
+ if (struct_v >= 3) {
+ ::decode(protection_status, p);
+ }
+ if (struct_v >= 4) {
+ ::decode(flags, p);
+ }
+ if (struct_v >= 5) {
+ ::decode(snapshot_namespace, p);
+ }
+ if (struct_v >= 6) {
+ ::decode(timestamp, p);
+ }
+ DECODE_FINISH(p);
+ }
+ void dump(Formatter *f) const {
+ f->dump_unsigned("id", id);
+ f->dump_string("name", name);
+ f->dump_unsigned("image_size", image_size);
+ f->dump_unsigned("features", features);
+ if (has_parent()) {
+ f->open_object_section("parent");
+ parent.dump(f);
+ f->close_section();
+ }
+ switch (protection_status) {
+ case RBD_PROTECTION_STATUS_UNPROTECTED:
+ f->dump_string("protection_status", "unprotected");
+ break;
+ case RBD_PROTECTION_STATUS_UNPROTECTING:
+ f->dump_string("protection_status", "unprotecting");
+ break;
+ case RBD_PROTECTION_STATUS_PROTECTED:
+ f->dump_string("protection_status", "protected");
+ break;
+ default:
+ ceph_abort();
+ }
+ }
+ static void generate_test_instances(list<cls_rbd_snap*>& o) {
+ o.push_back(new cls_rbd_snap);
+ cls_rbd_snap *t = new cls_rbd_snap;
+ t->id = 1;
+ t->name = "snap";
+ t->image_size = 123456;
+ t->features = 123;
+ t->flags = 31;
+ o.push_back(t);
+ t = new cls_rbd_snap;
+ t->id = 2;
+ t->name = "snap2";
+ t->image_size = 12345678;
+ t->features = 1234;
+ t->parent.pool = 1;
+ t->parent.id = "parent";
+ t->parent.snapid = 456;
+ t->parent.overlap = 12345;
+ t->protection_status = RBD_PROTECTION_STATUS_PROTECTED;
+ t->flags = 14;
+ t->timestamp = utime_t();
+ o.push_back(t);
+ }
+};
+WRITE_CLASS_ENCODER(cls_rbd_snap)
+
+#endif