]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: pass features to various CInode encoders and helpers
authorSage Weil <sage@redhat.com>
Wed, 30 Dec 2015 20:13:36 +0000 (15:13 -0500)
committerSage Weil <sage@redhat.com>
Tue, 1 Mar 2016 16:17:00 +0000 (11:17 -0500)
We'll need this shortly.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mds/CDir.cc
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Migrator.cc
src/messages/MMDSCacheRejoin.h
src/test/encoding/types.h
src/tools/cephfs/DataScan.cc
src/tools/cephfs/JournalTool.cc

index f43c768ad60cf59db92aa4549683b850182185a3..f4fde58e1e26ee519b3a5f488832223e0ad670c6 100644 (file)
@@ -2116,7 +2116,7 @@ void CDir::_encode_dentry(CDentry *dn, bufferlist& bl,
 
     bufferlist snap_blob;
     in->encode_snap_blob(snap_blob);
-    in->encode_bare(bl, &snap_blob);
+    in->encode_bare(bl, cache->mds->mdsmap->get_up_features(), &snap_blob);
   }
 }
 
index 68ebd76a7ae0a38e37c5c7fb2063d990f6d5f8ed..20493fefe981400835c46056240d54f89533d29c 100644 (file)
@@ -970,7 +970,7 @@ void CInode::store(MDSInternalContextBase *fin)
   bufferlist bl;
   string magic = CEPH_FS_ONDISK_MAGIC;
   ::encode(magic, bl);
-  encode_store(bl);
+  encode_store(bl, mdcache->mds->mdsmap->get_up_features());
 
   // write it.
   SnapContext snapc;
@@ -1294,7 +1294,8 @@ void CInode::verify_diri_backtrace(bufferlist &bl, int err)
 // parent dir
 
 
-void InodeStoreBase::encode_bare(bufferlist &bl, const bufferlist *snap_blob) const
+void InodeStoreBase::encode_bare(bufferlist &bl, uint64_t features,
+                                const bufferlist *snap_blob) const
 {
   ::encode(inode, bl);
   if (is_symlink())
@@ -1310,18 +1311,20 @@ void InodeStoreBase::encode_bare(bufferlist &bl, const bufferlist *snap_blob) co
   ::encode(damage_flags, bl);
 }
 
-void InodeStoreBase::encode(bufferlist &bl, const bufferlist *snap_blob) const
+void InodeStoreBase::encode(bufferlist &bl, uint64_t features,
+                           const bufferlist *snap_blob) const
 {
   ENCODE_START(6, 4, bl);
-  encode_bare(bl, snap_blob);
+  encode_bare(bl, features, snap_blob);
   ENCODE_FINISH(bl);
 }
 
-void CInode::encode_store(bufferlist& bl)
+void CInode::encode_store(bufferlist& bl, uint64_t features)
 {
   bufferlist snap_blob;
   encode_snap_blob(snap_blob);
-  InodeStoreBase::encode(bl, &snap_blob);
+  InodeStoreBase::encode(bl, mdcache->mds->mdsmap->get_up_features(),
+                        &snap_blob);
 }
 
 void InodeStoreBase::decode_bare(bufferlist::iterator &bl,
@@ -3370,7 +3373,7 @@ void CInode::encode_cap_message(MClientCaps *m, Capability *cap)
 
 
 
-void CInode::_encode_base(bufferlist& bl)
+void CInode::_encode_base(bufferlist& bl, uint64_t features)
 {
   ::encode(first, bl);
   ::encode(inode, bl);
@@ -3486,8 +3489,8 @@ void CInode::_decode_locks_rejoin(bufferlist::iterator& p, list<MDSInternalConte
 
 void CInode::encode_export(bufferlist& bl)
 {
-  ENCODE_START(5, 4, bl)
-  _encode_base(bl);
+  ENCODE_START(5, 4, bl);
+  _encode_base(bl, mdcache->mds->mdsmap->get_up_features());
 
   ::encode(state, bl);
 
index 15fef42e99bbe2b6e07e6c3da93cf78e8deff47e..851e7e71510fb6e2c0209a4180b74e49d540d261 100644 (file)
@@ -89,11 +89,11 @@ public:
   static object_t get_object_name(inodeno_t ino, frag_t fg, const char *suffix);
 
   /* Full serialization for use in ".inode" root inode objects */
-  void encode(bufferlist &bl, const bufferlist *snap_blob=NULL) const;
+  void encode(bufferlist &bl, uint64_t features, const bufferlist *snap_blob=NULL) const;
   void decode(bufferlist::iterator &bl, bufferlist& snap_blob);
 
   /* Serialization without ENCODE_START/FINISH blocks for use embedded in dentry */
-  void encode_bare(bufferlist &bl, const bufferlist *snap_blob=NULL) const;
+  void encode_bare(bufferlist &bl, uint64_t features, const bufferlist *snap_blob=NULL) const;
   void decode_bare(bufferlist::iterator &bl, bufferlist &snap_blob, __u8 struct_v=5);
 
   /* For test/debug output */
@@ -108,14 +108,14 @@ class InodeStore : public InodeStoreBase {
 public:
   bufferlist snap_blob;  // Encoded copy of SnapRealm, because we can't
                         // rehydrate it without full MDCache
-  void encode(bufferlist &bl) const {
-    InodeStoreBase::encode(bl, &snap_blob);
+  void encode(bufferlist &bl, uint64_t features) const {
+    InodeStoreBase::encode(bl, features, &snap_blob);
   }
   void decode(bufferlist::iterator &bl) {
     InodeStoreBase::decode(bl, snap_blob);
   }
-  void encode_bare(bufferlist &bl) const {
-    InodeStoreBase::encode_bare(bl, &snap_blob);
+  void encode_bare(bufferlist &bl, uint64_t features) const {
+    InodeStoreBase::encode_bare(bl, features, &snap_blob);
   }
   void decode_bare(bufferlist::iterator &bl) {
     InodeStoreBase::decode_bare(bl, snap_blob);
@@ -123,6 +123,7 @@ public:
 
   static void generate_test_instances(std::list<InodeStore*>& ls);
 };
+WRITE_CLASS_ENCODER_FEATURES(InodeStore)
 
 // cached inode wrapper
 class CInode : public MDSCacheObject, public InodeStoreBase {
@@ -743,10 +744,10 @@ public:
 
   void encode_snap_blob(bufferlist &bl);
   void decode_snap_blob(bufferlist &bl);
-  void encode_store(bufferlist& bl);
+  void encode_store(bufferlist& bl, uint64_t features);
   void decode_store(bufferlist::iterator& bl);
 
-  void encode_replica(mds_rank_t rep, bufferlist& bl) {
+  void encode_replica(mds_rank_t rep, bufferlist& bl, uint64_t features) {
     assert(is_auth());
     
     // relax locks?
@@ -756,7 +757,7 @@ public:
     __u32 nonce = add_replica(rep);
     ::encode(nonce, bl);
     
-    _encode_base(bl);
+    _encode_base(bl, features);
     _encode_locks_state_for_replica(bl);
   }
   void decode_replica(bufferlist::iterator& p, bool is_new) {
@@ -781,7 +782,7 @@ public:
   void take_waiting(uint64_t tag, std::list<MDSInternalContextBase*>& ls);
 
   // -- encode/decode helpers --
-  void _encode_base(bufferlist& bl);
+  void _encode_base(bufferlist& bl, uint64_t features);
   void _decode_base(bufferlist::iterator& p);
   void _encode_locks_full(bufferlist& bl);
   void _decode_locks_full(bufferlist::iterator& p);
index 0441f84e120f17b1c01fd24e0202be15762f8712..aff51be39a5b604856257d36d3a379d3121941ef 100644 (file)
@@ -4414,7 +4414,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
 
       if (ack) {
        acked_inodes.insert(in->vino());
-       ack->add_inode_base(in);
+       ack->add_inode_base(in, mds->mdsmap->get_up_features());
        bufferlist bl;
        in->_encode_locks_state_for_rejoin(bl, from);
        ack->add_inode_locks(in, inonce, bl);
@@ -4435,7 +4435,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
     
     if (ack) {
       acked_inodes.insert(in->vino());
-      ack->add_inode_base(in);
+      ack->add_inode_base(in, mds->mdsmap->get_up_features());
       bufferlist bl;
       in->_encode_locks_state_for_rejoin(bl, from);
       ack->add_inode_locks(in, inonce, bl);
@@ -4453,7 +4453,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
       assert(in);
       dout(10) << " including base inode (due to potential scatterlock update) " << *in << dendl;
       acked_inodes.insert(in->vino());
-      ack->add_inode_base(in);
+      ack->add_inode_base(in, mds->mdsmap->get_up_features());
     }
 
     rejoin_scour_survivor_replicas(from, ack, acked_inodes, gather_locks);
@@ -5890,7 +5890,7 @@ void MDCache::rejoin_send_acks()
        for (compact_map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
             r != in->replicas_end();
             ++r) {
-         ack[r->first]->add_inode_base(in);
+         ack[r->first]->add_inode_base(in, mds->mdsmap->get_up_features());
          bufferlist bl;
          in->_encode_locks_state_for_rejoin(bl, r->first);
          ack[r->first]->add_inode_locks(in, ++r->second, bl);
@@ -5907,7 +5907,7 @@ void MDCache::rejoin_send_acks()
     for (compact_map<mds_rank_t,unsigned>::iterator r = root->replicas_begin();
         r != root->replicas_end();
         ++r) {
-      ack[r->first]->add_inode_base(root);
+      ack[r->first]->add_inode_base(root, mds->mdsmap->get_up_features());
       bufferlist bl;
       root->_encode_locks_state_for_rejoin(bl, r->first);
       ack[r->first]->add_inode_locks(root, ++r->second, bl);
@@ -5916,7 +5916,7 @@ void MDCache::rejoin_send_acks()
     for (compact_map<mds_rank_t,unsigned>::iterator r = myin->replicas_begin();
         r != myin->replicas_end();
         ++r) {
-      ack[r->first]->add_inode_base(myin);
+      ack[r->first]->add_inode_base(myin, mds->mdsmap->get_up_features());
       bufferlist bl;
       myin->_encode_locks_state_for_rejoin(bl, r->first);
       ack[r->first]->add_inode_locks(myin, ++r->second, bl);
@@ -5930,7 +5930,7 @@ void MDCache::rejoin_send_acks()
     for (compact_map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
         r != in->replicas_end();
         ++r)
-      ack[r->first]->add_inode_base(in);
+      ack[r->first]->add_inode_base(in, mds->mdsmap->get_up_features());
   }
 
   // send acks
@@ -9516,7 +9516,7 @@ void MDCache::handle_discover(MDiscover *dis)
 
     // add root
     reply->starts_with = MDiscoverReply::INODE;
-    replicate_inode(cur, from, reply->trace);
+    replicate_inode(cur, from, reply->trace, mds->mdsmap->get_up_features());
     dout(10) << "added base " << *cur << dendl;
   }
   else {
@@ -9741,7 +9741,7 @@ void MDCache::handle_discover(MDiscover *dis)
     CInode *next = dnl->get_inode();
     assert(next->is_auth());
     
-    replicate_inode(next, from, reply->trace);
+    replicate_inode(next, from, reply->trace, mds->mdsmap->get_up_features());
     dout(7) << "handle_discover added inode " << *next << dendl;
     
     // descend, keep going.
@@ -10020,10 +10020,11 @@ CInode *MDCache::add_replica_inode(bufferlist::iterator& p, CDentry *dn, list<MD
  
 void MDCache::replicate_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl)
 {
-  replicate_inode(get_myin(), who, bl);
+  uint64_t features = mds->mdsmap->get_up_features();
+  replicate_inode(get_myin(), who, bl, features);
   replicate_dir(straydn->get_dir()->inode->get_parent_dn()->get_dir(), who, bl);
   replicate_dentry(straydn->get_dir()->inode->get_parent_dn(), who, bl);
-  replicate_inode(straydn->get_dir()->inode, who, bl);
+  replicate_inode(straydn->get_dir()->inode, who, bl, features);
   replicate_dir(straydn->get_dir(), who, bl);
   replicate_dentry(straydn, who, bl);
 }
@@ -10150,7 +10151,8 @@ void MDCache::send_dentry_link(CDentry *dn, MDRequestRef& mdr)
                                     dn->name, dnl->is_primary());
     if (dnl->is_primary()) {
       dout(10) << "  primary " << *dnl->get_inode() << dendl;
-      replicate_inode(dnl->get_inode(), p->first, m->bl);
+      replicate_inode(dnl->get_inode(), p->first, m->bl,
+                     mds->mdsmap->get_up_features());
     } else if (dnl->is_remote()) {
       inodeno_t ino = dnl->get_remote_ino();
       __u8 d_type = dnl->get_remote_d_type();
index 3b44d0c7f672cb1212b849b9e8286def23719dc7..6b054130dd8c05ac7af34f1e13eba75e70ee52ba 100644 (file)
@@ -989,10 +989,11 @@ public:
     ::encode(dn->last, bl);
     dn->encode_replica(to, bl);
   }
-  void replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl) {
+  void replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl,
+                      uint64_t features) {
     ::encode(in->inode.ino, bl);  // bleh, minor assymetry here
     ::encode(in->last, bl);
-    in->encode_replica(to, bl);
+    in->encode_replica(to, bl, features);
   }
   
   CDir* add_replica_dir(bufferlist::iterator& p, CInode *diri, mds_rank_t from, list<MDSInternalContextBase*>& finished);
index 4dce94fafff1e323e792bafd7ddb138f2fa5366c..3bf7ce248aeb556840c35a9a8ac8c8f9cfbca64c 100644 (file)
@@ -1019,7 +1019,8 @@ void Migrator::export_frozen(CDir *dir, uint64_t tid)
       bufferlist bl;
       cache->replicate_dentry(cur->inode->parent, it->second.peer, bl);
       dout(7) << "  added " << *cur->inode->parent << dendl;
-      cache->replicate_inode(cur->inode, it->second.peer, bl);
+      cache->replicate_inode(cur->inode, it->second.peer, bl,
+                            mds->mdsmap->get_up_features());
       dout(7) << "  added " << *cur->inode << dendl;
       bl.claim_append(tracebl);
       tracebl.claim(bl);
index 979fe9a49abdc129f81a56629cb4713e3e6b5448..111a24460176f6d0cb46eb1ddeb50192245a4c33 100644 (file)
@@ -224,11 +224,11 @@ public:
     ::encode(nonce, inode_locks);
     ::encode(bl, inode_locks);
   }
-  void add_inode_base(CInode *in) {
+  void add_inode_base(CInode *in, uint64_t features) {
     ::encode(in->inode.ino, inode_base);
     ::encode(in->last, inode_base);
     bufferlist bl;
-    in->_encode_base(bl);
+    in->_encode_base(bl, features);
     ::encode(bl, inode_base);
   }
   void add_inode_authpin(vinodeno_t ino, const metareqid_t& ri, __u32 attempt) {
index 0815c14a56b236dbabc3bfeceec11c02d551c904..ed37b976a4b10f23333f0dedb393a747a4ad8046 100644 (file)
@@ -187,7 +187,7 @@ TYPE_FEATUREFUL(file_layout_t)
 TYPE(ceph_file_layout_wrapper)
 
 #include "mds/CInode.h"
-TYPE(InodeStore)
+TYPE_FEATUREFUL(InodeStore)
 
 #include "mds/MDSMap.h"
 TYPE_FEATUREFUL(MDSMap)
index f076310b7115b683577e958b1e13e72c869a271b..fd01d96ef077394da44c9101a4726bf2fc2bc775 100644 (file)
@@ -289,7 +289,7 @@ int MetadataDriver::inject_unlinked_inode(
   // Serialize
   bufferlist inode_bl;
   ::encode(std::string(CEPH_FS_ONDISK_MAGIC), inode_bl);
-  inode.encode(inode_bl);
+  inode.encode(inode_bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
 
   // Write
   r = metadata_io.write_full(oid.name, inode_bl);
@@ -1430,7 +1430,7 @@ int MetadataDriver::inject_linkage(
   bufferlist dentry_bl;
   ::encode(snap, dentry_bl);
   ::encode('I', dentry_bl);
-  inode.encode_bare(dentry_bl);
+  inode.encode_bare(dentry_bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
 
   // Write out
   std::map<std::string, bufferlist> vals;
index 43ba9d354372cc4763f852c266f38d250969a26d..9311eeaf5e3e4d1853ed249d615a53ce12d6b7d8 100644 (file)
@@ -960,7 +960,7 @@ int JournalTool::replay_offline(EMetaBlob const &metablob, bool const dry_run)
     inode_bl.clear();
     std::string magic = CEPH_FS_ONDISK_MAGIC;
     ::encode(magic, inode_bl);
-    inode.encode(inode_bl);
+    inode.encode(inode_bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
 
     if (!dry_run) {
       r = io.write_full(root_oid.name, inode_bl);
@@ -1043,7 +1043,7 @@ int JournalTool::replay_offline(EMetaBlob const &metablob, bool const dry_run)
       inode.snap_blob = fb.snapbl;
       inode.symlink = fb.symlink;
       inode.old_inodes = fb.old_inodes;
-      inode.encode_bare(dentry_bl);
+      inode.encode_bare(dentry_bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
       
       vals[key] = dentry_bl;
       if (!dry_run) {
@@ -1184,9 +1184,9 @@ void JournalTool::encode_fullbit_as_inode(
 
   // Serialize InodeStore
   if (bare) {
-    new_inode.encode_bare(*out_bl);
+    new_inode.encode_bare(*out_bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
   } else {
-    new_inode.encode(*out_bl);
+    new_inode.encode(*out_bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
   }
 }