// -*- 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