]> git.proxmox.com Git - ceph.git/blob - ceph/src/common/snap_types.h
update ceph source to reef 18.2.0
[ceph.git] / ceph / src / common / snap_types.h
1 #ifndef __CEPH_SNAP_TYPES_H
2 #define __CEPH_SNAP_TYPES_H
3
4 #include "include/types.h"
5 #include "include/utime.h"
6 #include "include/fs_types.h"
7
8 namespace ceph {
9 class Formatter;
10 }
11
12 struct SnapRealmInfo {
13 mutable ceph_mds_snap_realm h;
14 std::vector<snapid_t> my_snaps;
15 std::vector<snapid_t> prior_parent_snaps; // before parent_since
16
17 SnapRealmInfo() {
18 // FIPS zeroization audit 20191115: this memset is not security related.
19 memset(&h, 0, sizeof(h));
20 }
21 SnapRealmInfo(inodeno_t ino_, snapid_t created_, snapid_t seq_, snapid_t current_parent_since_) {
22 // FIPS zeroization audit 20191115: this memset is not security related.
23 memset(&h, 0, sizeof(h));
24 h.ino = ino_;
25 h.created = created_;
26 h.seq = seq_;
27 h.parent_since = current_parent_since_;
28 }
29
30 inodeno_t ino() const { return inodeno_t(h.ino); }
31 inodeno_t parent() const { return inodeno_t(h.parent); }
32 snapid_t seq() const { return snapid_t(h.seq); }
33 snapid_t parent_since() const { return snapid_t(h.parent_since); }
34 snapid_t created() const { return snapid_t(h.created); }
35
36 void encode(ceph::buffer::list& bl) const;
37 void decode(ceph::buffer::list::const_iterator& bl);
38 void dump(ceph::Formatter *f) const;
39 static void generate_test_instances(std::list<SnapRealmInfo*>& o);
40 };
41 WRITE_CLASS_ENCODER(SnapRealmInfo)
42
43 // "new* snap realm info - carries additional metadata (last modified,
44 // change_attr) and is version encoded.
45 struct SnapRealmInfoNew {
46 SnapRealmInfo info;
47 utime_t last_modified;
48 uint64_t change_attr;
49
50 SnapRealmInfoNew() {
51 }
52
53 SnapRealmInfoNew(const SnapRealmInfo &info_, utime_t last_modified_, uint64_t change_attr_) {
54 // FIPS zeroization audit 20191115: this memset is not security related.
55 info = info_;
56 last_modified = last_modified_;
57 change_attr = change_attr_;
58 }
59
60 inodeno_t ino() const { return inodeno_t(info.h.ino); }
61 inodeno_t parent() const { return inodeno_t(info.h.parent); }
62 snapid_t seq() const { return snapid_t(info.h.seq); }
63 snapid_t parent_since() const { return snapid_t(info.h.parent_since); }
64 snapid_t created() const { return snapid_t(info.h.created); }
65
66 void encode(ceph::buffer::list& bl) const;
67 void decode(ceph::buffer::list::const_iterator& bl);
68 void dump(ceph::Formatter *f) const;
69 static void generate_test_instances(std::list<SnapRealmInfoNew*>& o);
70 };
71 WRITE_CLASS_ENCODER(SnapRealmInfoNew)
72
73 struct SnapContext {
74 snapid_t seq; // 'time' stamp
75 std::vector<snapid_t> snaps; // existent snaps, in descending order
76
77 SnapContext() {}
78 SnapContext(snapid_t s, const std::vector<snapid_t>& v) : seq(s), snaps(v) {}
79
80 bool is_valid() const;
81
82 void clear() {
83 seq = 0;
84 snaps.clear();
85 }
86 bool empty() const { return seq == 0; }
87
88 void encode(ceph::buffer::list& bl) const {
89 using ceph::encode;
90 encode(seq, bl);
91 encode(snaps, bl);
92 }
93 void decode(ceph::buffer::list::const_iterator& bl) {
94 using ceph::decode;
95 decode(seq, bl);
96 decode(snaps, bl);
97 }
98 void dump(ceph::Formatter *f) const;
99 static void generate_test_instances(std::list<SnapContext*>& o);
100 };
101 WRITE_CLASS_ENCODER(SnapContext)
102
103 inline std::ostream& operator<<(std::ostream& out, const SnapContext& snapc) {
104 return out << snapc.seq << "=" << snapc.snaps;
105 }
106
107 #if FMT_VERSION >= 90000
108 template <> struct fmt::formatter<SnapContext> : fmt::ostream_formatter {};
109 #endif
110
111 #endif