]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add v to encoded mds structs
authorSage Weil <sage@newdream.net>
Wed, 27 Jan 2010 21:23:10 +0000 (13:23 -0800)
committerSage Weil <sage@newdream.net>
Wed, 27 Jan 2010 22:29:12 +0000 (14:29 -0800)
mds: Begin auditing non-struct encodes

mds: add versioning to the events and Anchor.

mds fixes

21 files changed:
src/mds/Anchor.h
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Capability.h
src/mds/MDSTableServer.h
src/mds/SimpleLock.h
src/mds/events/ECommitted.h
src/mds/events/EExport.h
src/mds/events/EFragment.h
src/mds/events/EImportFinish.h
src/mds/events/EImportStart.h
src/mds/events/EMetaBlob.h
src/mds/events/EOpen.h
src/mds/events/ESession.h
src/mds/events/ESlaveUpdate.h
src/mds/events/ESubtreeMap.h
src/mds/events/ETableClient.h
src/mds/events/ETableServer.h
src/mds/events/EUpdate.h
src/mds/mdstypes.h
src/mds/snap.h

index ce7f95f3671b46fe1e062836de5fe90c76e37f31..16d24140d2d97be4d05ec2523aa28e64cbfb23ca 100644 (file)
@@ -46,6 +46,8 @@ public:
     nref(nr), updated(u) { }
   
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(ino, bl);
     ::encode(dirino, bl);
     ::encode(dn_hash, bl);
@@ -53,6 +55,8 @@ public:
     ::encode(updated, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(ino, bl);
     ::decode(dirino, bl);
     ::decode(dn_hash, bl);
index e641b2bed42639a566f497685ce8155c3896e22f..e5e7d960220b8f6b03fdc4fb2425a8e3e5b83dd6 100644 (file)
@@ -1907,6 +1907,8 @@ void CInode::_decode_locks_rejoin(bufferlist::iterator& p, list<Context*>& waite
 
 void CInode::encode_export(bufferlist& bl)
 {
+  __u8 struct_v = 1;
+  ::encode(struct_v, bl);
   _encode_base(bl);
 
   bool dirty = is_dirty();
@@ -1935,6 +1937,9 @@ void CInode::finish_export(utime_t now)
 void CInode::decode_import(bufferlist::iterator& p,
                           LogSegment *ls)
 {
+  __u8 struct_v;
+  ::decode(struct_v, p);
+
   _decode_base(p);
 
   bool dirty;
index 17d45a463af9dfcae06335f5fe4d5dcab7885387..62970faf537445d2c74732536a2a1bd24551b1dc 100644 (file)
@@ -408,6 +408,8 @@ private:
   void encode_parent_mutation(ObjectOperation& m);
 
   void encode_store(bufferlist& bl) {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(inode, bl);
     if (is_symlink())
       ::encode(symlink, bl);
@@ -419,6 +421,8 @@ private:
     ::encode(old_inodes, bl);
   }
   void decode_store(bufferlist::iterator& bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(inode, bl);
     if (is_symlink())
       ::decode(symlink, bl);
index 6da84db899d370136ec85116d07b09f804e8a93b..6afbe9863e6f951212c80751e714e78d047c245e 100644 (file)
@@ -79,6 +79,8 @@ public:
     Export(int w, int i, int p, snapid_t cf, ceph_seq_t s, utime_t lis) : 
       wanted(w), issued(i), pending(p), client_follows(cf), mseq(s), last_issue_stamp(lis) {}
     void encode(bufferlist &bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       ::encode(wanted, bl);
       ::encode(issued, bl);
       ::encode(pending, bl);
@@ -87,6 +89,8 @@ public:
       ::encode(last_issue_stamp, bl);
     }
     void decode(bufferlist::iterator &p) {
+      __u8 struct_v;
+      ::decode(struct_v, p);
       ::decode(wanted, p);
       ::decode(issued, p);
       ::decode(pending, p);
@@ -117,11 +121,15 @@ public:
     revoke_info() {}
     revoke_info(__u32 b, ceph_seq_t s, ceph_seq_t li) : before(b), seq(s), last_issue(li) {}
     void encode(bufferlist& bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       ::encode(before, bl);
       ::encode(seq, bl);
       ::encode(last_issue, bl);
     }
     void decode(bufferlist::iterator& bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(before, bl);
       ::decode(seq, bl);
       ::decode(last_issue, bl);
@@ -314,6 +322,8 @@ public:
 
   // serializers
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(last_sent, bl);
     ::encode(last_issue_stamp, bl);
 
@@ -322,6 +332,8 @@ public:
     ::encode(_revokes, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(last_sent, bl);
     ::decode(last_issue_stamp, bl);
 
index b45dde96f9b52865465344640063dbf0692d3da7..e913fb2f08f211b666440da8084306ab13fd5a50 100644 (file)
@@ -31,11 +31,15 @@ public:
     __s32 mds;
     version_t tid;
     void encode(bufferlist& bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       ::encode(reqid, bl);
       ::encode(mds, bl);
       ::encode(tid, bl);
     }
     void decode(bufferlist::iterator& bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(reqid, bl);
       ::decode(mds, bl);
       ::decode(tid, bl);
index 90eec6c29815c03923e53a4a8f2e480a8494ef8b..482841945b0635b6bf6841283447893add0871b4 100644 (file)
@@ -387,10 +387,14 @@ public:
 
   // encode/decode
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(state, bl);
     ::encode(gather_set, bl);
   }
   void decode(bufferlist::iterator& p) {
+    __u8 struct_v;
+    ::decode(struct_v, p);
     ::decode(state, p);
     ::decode(gather_set, p);
   }
index eb5a5aebc18dcb5b45808d27b30afb40b0a1f4b4..98dc20d55578b516e91e2143b1081e1c4205de69 100644 (file)
@@ -31,9 +31,13 @@ public:
   }
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(reqid, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(reqid, bl);
   }
 
index 0786382275cc64664d1eb4a2f1792ca7b508c35a..6a1da49d8fd3a8f21e407de22e7a7d1c1551c02d 100644 (file)
@@ -42,11 +42,15 @@ public:
   }
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(metablob, bl);
     ::encode(base, bl);
     ::encode(bounds, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(metablob, bl);
     ::decode(base, bl);
     ::decode(bounds, bl);
index e846b88a556d10704d097ff39c208c8d2653395c..c0128c94a1a4bfcc1dce3d89b5dbad927623fd73 100644 (file)
@@ -34,12 +34,16 @@ public:
   }
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(ino, bl);
     ::encode(basefrag, bl);
     ::encode(bits, bl);
     ::encode(metablob, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(ino, bl);
     ::decode(basefrag, bl);
     ::decode(bits, bl);
index 7455cc9113be9b2d80d2792ae2bfc60ea9e8f86e..c931a6a895edbe295f3a03c04413b6136145ff4c 100644 (file)
@@ -40,10 +40,14 @@ class EImportFinish : public LogEvent {
   }
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(base, bl);
     ::encode(success, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(base, bl);
     ::decode(success, bl);
   }
index f652c6b0dae4202fec1206df83415b025b35dcd7..b7496f181344b62c3e00b5f2025db9e485b56927 100644 (file)
@@ -42,6 +42,8 @@ protected:
   }
   
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(base, bl);
     ::encode(metablob, bl);
     ::encode(bounds, bl);
@@ -49,6 +51,8 @@ protected:
     ::encode(client_map, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(base, bl);
     ::decode(metablob, bl);
     ::decode(bounds, bl);
index 5e2fc5c8e488d1190c38504c0b5f5971d00cb924..7dbedab4f2aa10ef6ecc1125cb43c1692dca71f2 100644 (file)
@@ -87,6 +87,8 @@ public:
     fullbit() {}
 
     void encode(bufferlist& bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       assert(_enc.length());
       bl.append(_enc); 
       /*
@@ -106,6 +108,8 @@ public:
       */
     }
     void decode(bufferlist::iterator &bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(dn, bl);
       ::decode(dnfirst, bl);
       ::decode(dnlast, bl);
@@ -155,6 +159,8 @@ public:
     remotebit() {}
 
     void encode(bufferlist& bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       assert(_enc.length());
       bl.append(_enc);
       /*
@@ -168,6 +174,8 @@ public:
       */
     }
     void decode(bufferlist::iterator &bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(dn, bl);
       ::decode(dnfirst, bl);
       ::decode(dnlast, bl);
@@ -208,6 +216,8 @@ public:
     nullbit() {}
 
     void encode(bufferlist& bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       assert(_enc.length());
       bl.append(_enc);
       /*
@@ -219,6 +229,8 @@ public:
       */
     }
     void decode(bufferlist::iterator &bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(dn, bl);
       ::decode(dnfirst, bl);
       ::decode(dnlast, bl);
@@ -296,6 +308,8 @@ public:
     }
 
     void encode(bufferlist& bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       ::encode(fnode, bl);
       ::encode(state, bl);
       ::encode(nfull, bl);
@@ -305,6 +319,8 @@ public:
       ::encode(dnbl, bl);
     }
     void decode(bufferlist::iterator &bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(fnode, bl);
       ::decode(state, bl);
       ::decode(nfull, bl);
@@ -344,6 +360,8 @@ private:
 
  public:
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(lump_order, bl);
     ::encode(lump_map, bl);
     bufferlist rootbl;
@@ -364,6 +382,8 @@ private:
     ::encode(client_reqs, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(lump_order, bl);
     ::decode(lump_map, bl);
     bufferlist rootbl;
index d72572fda8e1a220f2fd60fef6011609f6edc941..2dde853366eb3b72f7937ddf5564fd9862508bcc 100644 (file)
@@ -43,10 +43,14 @@ public:
   }
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(metablob, bl);
     ::encode(inos, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(metablob, bl);
     ::decode(inos, bl);
   }
index 4248d46beaea7198a95a81bbfb02c2c1574b55d4..002a246d58f2d0250f59a9d52c063091182bcce8 100644 (file)
@@ -47,6 +47,8 @@ class ESession : public LogEvent {
     inos(i), inotablev(iv) { }
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(client_inst, bl);
     ::encode(open, bl);
     ::encode(cmapv, bl);
@@ -54,6 +56,8 @@ class ESession : public LogEvent {
     ::encode(inotablev, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(client_inst, bl);
     ::decode(open, bl);
     ::decode(cmapv, bl);
index 3c348ead0c05bccb18cd3da06d9be60abc8c6fbc..cdfd37330f3f761289ee652ec83b9b95d0071144 100644 (file)
@@ -32,6 +32,8 @@ struct link_rollback {
   utime_t old_dir_rctime;
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(reqid, bl);
     ::encode(ino, bl);
     ::encode(was_inc, bl);
@@ -40,6 +42,8 @@ struct link_rollback {
     ::encode(old_dir_rctime, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(reqid, bl);
     ::decode(ino, bl);
     ::decode(was_inc, bl);
@@ -61,6 +65,8 @@ struct rename_rollback {
     utime_t old_ctime;
     
     void encode(bufferlist &bl) const {
+      __u8 struct_v = 1;
+      ::encode(struct_v, bl);
       ::encode(dirfrag, bl);
       ::encode(dirfrag_old_mtime, bl);
       ::encode(dirfrag_old_rctime, bl);
@@ -71,6 +77,8 @@ struct rename_rollback {
       ::encode(old_ctime, bl);
    } 
     void decode(bufferlist::iterator &bl) {
+      __u8 struct_v;
+      ::decode(struct_v, bl);
       ::decode(dirfrag, bl);
       ::decode(dirfrag_old_mtime, bl);
       ::decode(dirfrag_old_rctime, bl);
@@ -89,6 +97,8 @@ struct rename_rollback {
   utime_t ctime;
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(reqid, bl);
     encode(orig_src, bl);
     encode(orig_dest, bl);
@@ -96,6 +106,8 @@ struct rename_rollback {
     ::encode(ctime, bl);
  }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(reqid, bl);
     decode(orig_src, bl);
     decode(orig_dest, bl);
@@ -149,6 +161,8 @@ public:
   }
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(type, bl);
     ::encode(reqid, bl);
     ::encode(master, bl);
@@ -158,6 +172,8 @@ public:
     ::encode(rollback, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(type, bl);
     ::decode(reqid, bl);
     ::decode(master, bl);
index aaedc859f304b64f63810b9bc0a9fb790624c20b..11254d7dc4c75af1e049c42ed2396cf383dfbb2e 100644 (file)
@@ -31,10 +31,14 @@ public:
   }
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(metablob, bl);
     ::encode(subtrees, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(metablob, bl);
     ::decode(subtrees, bl);
   }
index 833af657a525eedd069003ea9c97c3da90801f97..3a220087142ffdec4f39a90418da26353617c431 100644 (file)
@@ -32,11 +32,15 @@ struct ETableClient : public LogEvent {
     table(t), op(o), tid(ti) { }
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(table, bl);
     ::encode(op, bl);
     ::encode(tid, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(table, bl);
     ::decode(op, bl);
     ::decode(tid, bl);
index 709ae4783a999238128b3e6b04cf8bb0999b1a31..0f4998c75ec81610896ea2313f45243b7be9a24d 100644 (file)
@@ -36,6 +36,8 @@ struct ETableServer : public LogEvent {
     table(t), op(o), reqid(ri), bymds(m), tid(ti), version(v) { }
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(table, bl);
     ::encode(op, bl);
     ::encode(reqid, bl);
@@ -45,6 +47,8 @@ struct ETableServer : public LogEvent {
     ::encode(version, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(table, bl);
     ::decode(op, bl);
     ::decode(reqid, bl);
index 74d0d9bf0b9cf7487504971b925c18651c3b8e3e..b92d210f1d88429a95fac5d84122eea4295162a8 100644 (file)
@@ -38,6 +38,8 @@ public:
   }
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(type, bl);
     ::encode(metablob, bl);
     ::encode(client_map, bl);
@@ -45,6 +47,8 @@ public:
     ::encode(had_slaves, bl);
   } 
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(type, bl);
     ::decode(metablob, bl);
     ::decode(client_map, bl);
index cf65e863f1cf7c06d8155a69c37ff859a4b786e0..735456399d40025909becd8ed51e9ab18d219b43 100644 (file)
@@ -478,11 +478,15 @@ struct old_inode_t {
   map<string,bufferptr> xattrs;
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(first, bl);
     ::encode(inode, bl);
     ::encode(xattrs, bl);
   }
   void decode(bufferlist::iterator& bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(first, bl);
     ::decode(inode, bl);
     ::decode(xattrs, bl);
@@ -529,11 +533,15 @@ struct old_rstat_t {
   nest_info_t rstat, accounted_rstat;
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(first, bl);
     ::encode(rstat, bl);
     ::encode(accounted_rstat, bl);
   }
   void decode(bufferlist::iterator& bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(first, bl);
     ::decode(rstat, bl);
     ::decode(accounted_rstat, bl);    
@@ -625,10 +633,14 @@ struct string_snap_t {
   string_snap_t(const nstring& n, snapid_t s) : name(n), snapid(s) {}
   string_snap_t(const char *n, snapid_t s) : name(n), snapid(s) {}
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(name, bl);
     ::encode(snapid, bl);
   }
   void decode(bufferlist::iterator& bl) {
+    __u8 struct_v = 1;
+    ::decode(struct_v, bl);
     ::decode(name, bl);
     ::decode(snapid, bl);
   }
@@ -799,10 +811,14 @@ public:
       vec[i].reset(now);
   }
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     for (int i=0; i<NUM; i++)
       ::encode(vec[i], bl);
   }
   void decode(bufferlist::iterator &p) {
+    __u8 struct_v;
+    ::decode(struct_v, p);
     for (int i=0; i<NUM; i++)
       ::decode(vec[i], p);
   }
@@ -815,10 +831,14 @@ public:
   DecayCounter vec[NUM];
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     for (int i=0; i<NUM; i++)
       ::encode(vec[i], bl);
   }
   void decode(bufferlist::iterator &p) {
+    __u8 struct_v;
+    ::decode(struct_v, p);
     for (int i=0; i<NUM; i++)
       ::decode(vec[i], p);
   }
@@ -913,6 +933,8 @@ struct mds_load_t {
   double mds_load();  // defiend in MDBalancer.cc
 
   void encode(bufferlist &bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(auth, bl);
     ::encode(all, bl);
     ::encode(req_rate, bl);
@@ -921,6 +943,8 @@ struct mds_load_t {
     ::encode(cpu_load_avg, bl);
   }
   void decode(bufferlist::iterator &bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(auth, bl);
     ::decode(all, bl);
     ::decode(req_rate, bl);
@@ -1054,12 +1078,16 @@ public:
   MDSCacheObjectInfo() : ino(0) {}
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(ino, bl);
     ::encode(dirfrag, bl);
     ::encode(dname, bl);
     ::encode(snapid, bl);
   }
   void decode(bufferlist::iterator& p) {
+    __u8 struct_v;
+    ::decode(struct_v, p);
     ::decode(ino, p);
     ::decode(dirfrag, p);
     ::decode(dname, p);
index 02db8d7aef8f172a015f1dc26478771a88cf7c1a..e7a120972e11be2c808c8e4a43e2611647dc0035 100644 (file)
@@ -28,12 +28,16 @@ struct SnapInfo {
   string name, long_name;
   
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(snapid, bl);
     ::encode(ino, bl);
     ::encode(stamp, bl);
     ::encode(name, bl);
   }
   void decode(bufferlist::iterator& bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(snapid, bl);
     ::decode(ino, bl);
     ::decode(stamp, bl);
@@ -69,10 +73,14 @@ struct snaplink_t {
   inodeno_t ino;
   snapid_t first;
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(ino, bl);
     ::encode(first, bl);
   }
   void decode(bufferlist::iterator& bl) {
+    __u8 struct_v;
+    ::decode(struct_v, bl);
     ::decode(ino, bl);
     ::decode(first, bl);
   }
@@ -95,6 +103,8 @@ struct SnapRealm {
   map<snapid_t, snaplink_t> past_parents;  // key is "last" (or NOSNAP)
 
   void encode(bufferlist& bl) const {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
     ::encode(seq, bl);
     ::encode(created, bl);
     ::encode(last_created, bl);
@@ -104,6 +114,8 @@ struct SnapRealm {
     ::encode(past_parents, bl);
   }
   void decode(bufferlist::iterator& p) {
+    __u8 struct_v;
+    ::decode(struct_v, p);
     ::decode(seq, p);
     ::decode(created, p);
     ::decode(last_created, p);