X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fcls%2Frbd%2Fcls_rbd.h;fp=src%2Fceph%2Fsrc%2Fcls%2Frbd%2Fcls_rbd.h;h=f08fc1b1f0a65861e10cde4c48668a7040f79637;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/cls/rbd/cls_rbd.h b/src/ceph/src/cls/rbd/cls_rbd.h new file mode 100644 index 0000000..f08fc1b --- /dev/null +++ b/src/ceph/src/cls/rbd/cls_rbd.h @@ -0,0 +1,167 @@ +// -*- 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& 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& 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