We'll need this shortly.
Signed-off-by: Sage Weil <sage@redhat.com>
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);
}
}
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;
// 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())
::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,
-void CInode::_encode_base(bufferlist& bl)
+void CInode::_encode_base(bufferlist& bl, uint64_t features)
{
::encode(first, bl);
::encode(inode, bl);
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);
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 */
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);
static void generate_test_instances(std::list<InodeStore*>& ls);
};
+WRITE_CLASS_ENCODER_FEATURES(InodeStore)
// cached inode wrapper
class CInode : public MDSCacheObject, public InodeStoreBase {
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?
__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) {
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);
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);
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);
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);
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);
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);
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);
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
// 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 {
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.
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);
}
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();
::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);
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);
::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) {
TYPE(ceph_file_layout_wrapper)
#include "mds/CInode.h"
-TYPE(InodeStore)
+TYPE_FEATUREFUL(InodeStore)
#include "mds/MDSMap.h"
TYPE_FEATUREFUL(MDSMap)
// 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);
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;
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);
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) {
// 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);
}
}